diff options
author | Johannes Berg <johannes.berg@intel.com> | 2012-07-06 21:39:28 +0200 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2012-07-12 12:10:43 +0200 |
commit | e2fd5dbc1c7031be5b5de043bcc0a18c7a59a68a (patch) | |
tree | f9febb7e331ff24efec9289e2a13be9e146f9cd5 /net/mac80211/iface.c | |
parent | d811b3d5566f1441b321a1219c260124b209e0bd (diff) | |
download | op-kernel-dev-e2fd5dbc1c7031be5b5de043bcc0a18c7a59a68a.zip op-kernel-dev-e2fd5dbc1c7031be5b5de043bcc0a18c7a59a68a.tar.gz |
mac80211: make scan_sdata pointer usable with RCU
Making the scan_sdata pointer usable with RCU makes
it possible to dereference it in the RX path to see
if a received frame actually matches the interface
that is scanning. This is just preparations, making
the pointer __rcu.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211/iface.c')
-rw-r--r-- | net/mac80211/iface.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c index b1edf60..e3c4974 100644 --- a/net/mac80211/iface.c +++ b/net/mac80211/iface.c @@ -112,10 +112,11 @@ static u32 __ieee80211_recalc_idle(struct ieee80211_local *local) } } - if (local->scan_sdata && - !(local->hw.flags & IEEE80211_HW_SCAN_WHILE_IDLE)) { + sdata = rcu_dereference_protected(local->scan_sdata, + lockdep_is_held(&local->mtx)); + if (sdata && !(local->hw.flags & IEEE80211_HW_SCAN_WHILE_IDLE)) { scanning = true; - local->scan_sdata->vif.bss_conf.idle = false; + sdata->vif.bss_conf.idle = false; } list_for_each_entry(sdata, &local->interfaces, list) { @@ -628,7 +629,7 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, clear_bit(SDATA_STATE_RUNNING, &sdata->state); - if (local->scan_sdata == sdata) + if (rcu_access_pointer(local->scan_sdata) == sdata) ieee80211_scan_cancel(local); /* |