aboutsummaryrefslogtreecommitdiffstats
path: root/net/batman-adv/originator.c
diff options
context:
space:
mode:
authorMarek Lindner <lindner_marek@yahoo.de>2011-01-19 15:01:42 -0500
committerMarek Lindner <lindner_marek@yahoo.de>2011-03-05 06:50:00 -0500
commit2ae2daf6c3f23364862a7d4f2ca79eab041b701b (patch)
tree8b4c15f4c7733d9d1d3aa58fd80b6f998b9eca2c /net/batman-adv/originator.c
parent16b1aba849eeb45d51a5de731cf103143439ffe1 (diff)
batman-adv: protect ogm counter arrays with spinlock
Signed-off-by: Marek Lindner <lindner_marek@yahoo.de>
Diffstat (limited to 'net/batman-adv/originator.c')
-rw-r--r--net/batman-adv/originator.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/net/batman-adv/originator.c b/net/batman-adv/originator.c
index fcdb0b7fe586..71dfc24e961b 100644
--- a/net/batman-adv/originator.c
+++ b/net/batman-adv/originator.c
@@ -207,6 +207,7 @@ struct orig_node *get_orig_node(struct bat_priv *bat_priv, uint8_t *addr)
207 return NULL; 207 return NULL;
208 208
209 INIT_HLIST_HEAD(&orig_node->neigh_list); 209 INIT_HLIST_HEAD(&orig_node->neigh_list);
210 spin_lock_init(&orig_node->ogm_cnt_lock);
210 spin_lock_init(&orig_node->neigh_list_lock); 211 spin_lock_init(&orig_node->neigh_list_lock);
211 kref_init(&orig_node->refcount); 212 kref_init(&orig_node->refcount);
212 213
@@ -517,7 +518,7 @@ int orig_hash_add_if(struct batman_if *batman_if, int max_if_num)
517 struct hlist_head *head; 518 struct hlist_head *head;
518 struct element_t *bucket; 519 struct element_t *bucket;
519 struct orig_node *orig_node; 520 struct orig_node *orig_node;
520 int i; 521 int i, ret;
521 522
522 /* resize all orig nodes because orig_node->bcast_own(_sum) depend on 523 /* resize all orig nodes because orig_node->bcast_own(_sum) depend on
523 * if_num */ 524 * if_num */
@@ -530,7 +531,11 @@ int orig_hash_add_if(struct batman_if *batman_if, int max_if_num)
530 hlist_for_each_entry_rcu(bucket, walk, head, hlist) { 531 hlist_for_each_entry_rcu(bucket, walk, head, hlist) {
531 orig_node = bucket->data; 532 orig_node = bucket->data;
532 533
533 if (orig_node_add_if(orig_node, max_if_num) == -1) 534 spin_lock_bh(&orig_node->ogm_cnt_lock);
535 ret = orig_node_add_if(orig_node, max_if_num);
536 spin_unlock_bh(&orig_node->ogm_cnt_lock);
537
538 if (ret == -1)
534 goto err; 539 goto err;
535 } 540 }
536 rcu_read_unlock(); 541 rcu_read_unlock();
@@ -619,8 +624,10 @@ int orig_hash_del_if(struct batman_if *batman_if, int max_if_num)
619 hlist_for_each_entry_rcu(bucket, walk, head, hlist) { 624 hlist_for_each_entry_rcu(bucket, walk, head, hlist) {
620 orig_node = bucket->data; 625 orig_node = bucket->data;
621 626
627 spin_lock_bh(&orig_node->ogm_cnt_lock);
622 ret = orig_node_del_if(orig_node, max_if_num, 628 ret = orig_node_del_if(orig_node, max_if_num,
623 batman_if->if_num); 629 batman_if->if_num);
630 spin_unlock_bh(&orig_node->ogm_cnt_lock);
624 631
625 if (ret == -1) 632 if (ret == -1)
626 goto err; 633 goto err;