The following commit has been merged in the next branch: commit 41c587435a5bde3331addf256e9f5ddea0bde8c5 Author: Matthias Schiffer mschiffer@universe-factory.net Date: Tue May 8 22:31:57 2012 +0200
batman-adv: fix locking in hash_add()
To ensure an entry isn't added twice all comparisons have to be protected by the hash line write spinlock. This doesn't really hurt as the case that it is tried to add an element already present to the hash shouldn't occur very often, so in most cases the lock would have have to be taken anyways.
Signed-off-by: Matthias Schiffer mschiffer@universe-factory.net Acked-by: Sven Eckelmann sven@narfation.org
diff --git a/hash.h b/hash.h index 7bcb98f..2e0409a 100644 --- a/hash.h +++ b/hash.h @@ -109,26 +109,23 @@ static inline int hash_add(struct hashtable_t *hash, head = &hash->table[index]; list_lock = &hash->list_locks[index];
- rcu_read_lock(); - __hlist_for_each_rcu(node, head) { + spin_lock_bh(list_lock); + + hlist_for_each(node, head) { if (!compare(node, data)) continue;
ret = 1; - goto err_unlock; + goto unlock; } - rcu_read_unlock();
/* no duplicate found in list, add new element */ - spin_lock_bh(list_lock); hlist_add_head_rcu(data_node, head); - spin_unlock_bh(list_lock);
ret = 0; - goto out;
-err_unlock: - rcu_read_unlock(); +unlock: + spin_unlock_bh(list_lock); out: return ret; }