diff options
author | Marek Lindner <lindner_marek@yahoo.de> | 2011-01-19 15:01:42 -0500 |
---|---|---|
committer | Marek Lindner <lindner_marek@yahoo.de> | 2011-03-05 06:50:00 -0500 |
commit | 2ae2daf6c3f23364862a7d4f2ca79eab041b701b (patch) | |
tree | 8b4c15f4c7733d9d1d3aa58fd80b6f998b9eca2c /net/batman-adv/originator.c | |
parent | 16b1aba849eeb45d51a5de731cf103143439ffe1 (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.c | 11 |
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; |