mac80211: release sched_scan_sdata when stopping sched scan
authorAlexander Bondar <alexander.bondar@intel.com>
Sun, 16 Mar 2014 08:49:54 +0000 (10:49 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 19 Mar 2014 20:29:55 +0000 (21:29 +0100)
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>
net/mac80211/scan.c

index 836f500dfbf3c989f1f4d21fa281da0d506468fa..3ce7f2c8539a1f626f7488833ee966fb3af5d502 100644 (file)
@@ -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);