aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/ieee80211.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/mac80211/ieee80211.c')
-rw-r--r--net/mac80211/ieee80211.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/net/mac80211/ieee80211.c b/net/mac80211/ieee80211.c
index 5fc240259f55..00df2a9a2661 100644
--- a/net/mac80211/ieee80211.c
+++ b/net/mac80211/ieee80211.c
@@ -493,7 +493,16 @@ static void ieee80211_if_shutdown(struct net_device *dev)
case IEEE80211_IF_TYPE_IBSS:
sdata->u.sta.state = IEEE80211_DISABLED;
del_timer_sync(&sdata->u.sta.timer);
+ /*
+ * Holding the sub_if_lock for writing here blocks
+ * out the receive path and makes sure it's not
+ * currently processing a packet that may get
+ * added to the queue.
+ */
+ write_lock_bh(&local->sub_if_lock);
skb_queue_purge(&sdata->u.sta.skb_queue);
+ write_unlock_bh(&local->sub_if_lock);
+
if (!local->ops->hw_scan &&
local->scan_dev == sdata->dev) {
local->sta_scanning = 0;