diff options
author | Marek Lindner <lindner_marek@yahoo.de> | 2011-01-19 23:01:42 +0300 |
---|---|---|
committer | Marek Lindner <lindner_marek@yahoo.de> | 2011-03-05 14:50:00 +0300 |
commit | 2ae2daf6c3f23364862a7d4f2ca79eab041b701b (patch) | |
tree | 8b4c15f4c7733d9d1d3aa58fd80b6f998b9eca2c /net/batman-adv/originator.c | |
parent | 16b1aba849eeb45d51a5de731cf103143439ffe1 (diff) | |
download | linux-2ae2daf6c3f23364862a7d4f2ca79eab041b701b.tar.xz |
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) return NULL; INIT_HLIST_HEAD(&orig_node->neigh_list); + spin_lock_init(&orig_node->ogm_cnt_lock); spin_lock_init(&orig_node->neigh_list_lock); kref_init(&orig_node->refcount); @@ -517,7 +518,7 @@ int orig_hash_add_if(struct batman_if *batman_if, int max_if_num) struct hlist_head *head; struct element_t *bucket; struct orig_node *orig_node; - int i; + int i, ret; /* resize all orig nodes because orig_node->bcast_own(_sum) depend on * if_num */ @@ -530,7 +531,11 @@ int orig_hash_add_if(struct batman_if *batman_if, int max_if_num) hlist_for_each_entry_rcu(bucket, walk, head, hlist) { orig_node = bucket->data; - if (orig_node_add_if(orig_node, max_if_num) == -1) + spin_lock_bh(&orig_node->ogm_cnt_lock); + ret = orig_node_add_if(orig_node, max_if_num); + spin_unlock_bh(&orig_node->ogm_cnt_lock); + + if (ret == -1) goto err; } rcu_read_unlock(); @@ -619,8 +624,10 @@ int orig_hash_del_if(struct batman_if *batman_if, int max_if_num) hlist_for_each_entry_rcu(bucket, walk, head, hlist) { orig_node = bucket->data; + spin_lock_bh(&orig_node->ogm_cnt_lock); ret = orig_node_del_if(orig_node, max_if_num, batman_if->if_num); + spin_unlock_bh(&orig_node->ogm_cnt_lock); if (ret == -1) goto err; |