diff options
author | Alexander Bondar <alexander.bondar@intel.com> | 2014-03-16 10:49:54 +0200 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2014-03-19 21:29:55 +0100 |
commit | 71228a1eabaf7fa4b2c3060cfee60875254cec14 (patch) | |
tree | 5cc36e38156681b4b5b4336ae29c935f856330e1 | |
parent | 112c44b2df0984121a52fbda89425843b8e1a457 (diff) |
mac80211: release sched_scan_sdata when stopping sched scan
Assuming sched_scan_stop operation is synchronous the driver may not
necessary call ieee80211_sched_scan_stopped_work. Since this work is
the only place where sched_scan_sdata is released we can possibly run
into situation when it is never released. Fix this by releasing it
just after calling drv_sched_scan_stop.
Signed-off-by: Alexander Bondar <alexander.bondar@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-rw-r--r-- | net/mac80211/scan.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c index 836f500dfbf3..3ce7f2c8539a 100644 --- a/net/mac80211/scan.c +++ b/net/mac80211/scan.c @@ -1055,9 +1055,11 @@ int ieee80211_request_sched_scan_stop(struct ieee80211_sub_if_data *sdata) /* We don't want to restart sched scan anymore. */ local->sched_scan_req = NULL; - if (rcu_access_pointer(local->sched_scan_sdata)) + if (rcu_access_pointer(local->sched_scan_sdata)) { ret = drv_sched_scan_stop(local, sdata); - + if (!ret) + rcu_assign_pointer(local->sched_scan_sdata, NULL); + } out: mutex_unlock(&local->mtx); |