diff options
author | Javier Cardona <javier@cozybit.com> | 2011-08-09 19:45:06 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2011-08-24 13:59:42 -0400 |
commit | a6965c44e981214c7483e020106a30a869411231 (patch) | |
tree | cac9c21c2bbbced4f557c2445bd71d8b7d4e9eb1 /net | |
parent | 86d7f9f35dcc686d57465798201e678040916979 (diff) |
mac80211: mesh locking fixes
mesh_queue_preq is invoked invoked from both user (work queue) and
softirq (timer) context, so the _bh version of spinlock needs to be
used. Also, the mpath->state_lock should be softirq safe as well.
Signed-off-by: Javier Cardona <javier@cozybit.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net')
-rw-r--r-- | net/mac80211/mesh_pathtbl.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/net/mac80211/mesh_pathtbl.c b/net/mac80211/mesh_pathtbl.c index bfd7638e235f..385f9fc526db 100644 --- a/net/mac80211/mesh_pathtbl.c +++ b/net/mac80211/mesh_pathtbl.c | |||
@@ -654,12 +654,12 @@ int mesh_path_del(u8 *addr, struct ieee80211_sub_if_data *sdata) | |||
654 | mpath = node->mpath; | 654 | mpath = node->mpath; |
655 | if (mpath->sdata == sdata && | 655 | if (mpath->sdata == sdata && |
656 | memcmp(addr, mpath->dst, ETH_ALEN) == 0) { | 656 | memcmp(addr, mpath->dst, ETH_ALEN) == 0) { |
657 | spin_lock(&mpath->state_lock); | 657 | spin_lock_bh(&mpath->state_lock); |
658 | mpath->flags |= MESH_PATH_RESOLVING; | 658 | mpath->flags |= MESH_PATH_RESOLVING; |
659 | hlist_del_rcu(&node->list); | 659 | hlist_del_rcu(&node->list); |
660 | call_rcu(&node->rcu, mesh_path_node_reclaim); | 660 | call_rcu(&node->rcu, mesh_path_node_reclaim); |
661 | atomic_dec(&tbl->entries); | 661 | atomic_dec(&tbl->entries); |
662 | spin_unlock(&mpath->state_lock); | 662 | spin_unlock_bh(&mpath->state_lock); |
663 | goto enddel; | 663 | goto enddel; |
664 | } | 664 | } |
665 | } | 665 | } |