mac80211: fix ibss race
When a scan completes, we call ieee80211_sta_find_ibss(), which is also called from other places. When the scan was done in software, there's no problem as both run from the single-threaded mac80211 workqueue and are thus serialised against each other, but with hardware scan the completion can be in a different context and race against callers of this function from the workqueue (e.g. due to beacon RX). So instead of calling ieee80211_sta_find_ibss() directly, just arm the timer and have it fire, scheduling the work, which will invoke ieee80211_sta_find_ibss() (if that is appropriate in the current state). Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
5e4708bcb5
commit
51f98f1313
|
@ -829,7 +829,7 @@ void ieee80211_ibss_notify_scan_completed(struct ieee80211_local *local)
|
||||||
if (!sdata->u.ibss.ssid_len)
|
if (!sdata->u.ibss.ssid_len)
|
||||||
continue;
|
continue;
|
||||||
sdata->u.ibss.last_scan_completed = jiffies;
|
sdata->u.ibss.last_scan_completed = jiffies;
|
||||||
ieee80211_sta_find_ibss(sdata);
|
mod_timer(&sdata->u.ibss.timer, 0);
|
||||||
}
|
}
|
||||||
mutex_unlock(&local->iflist_mtx);
|
mutex_unlock(&local->iflist_mtx);
|
||||||
}
|
}
|
||||||
|
|
Reference in New Issue