From: Johannes Berg Date: Wed, 6 Mar 2013 22:17:08 +0000 (+0100) Subject: mac80211: always synchronize_net() during station removal X-Git-Tag: v3.8.6~101 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=964909a72f6446115ce437637b0756b985df68e4;p=karo-tx-linux.git mac80211: always synchronize_net() during station removal commit 27a737ff7cb062fb9cbceba9b44d60aa74862bfa upstream. If there are keys left during station removal, then a synchronize_net() will be done (for each key, I have a patch to address this for 3.10), otherwise it won't be done at all which causes issues because the station could be used for TX while it's being removed from the driver -- that might confuse the driver. Fix this by always doing synchronize_net() if no key was present any more. Signed-off-by: Johannes Berg Signed-off-by: Greg Kroah-Hartman --- diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c index ca9fde198188..c8b32a0d3bb4 100644 --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c @@ -756,6 +756,7 @@ int __must_check __sta_info_destroy(struct sta_info *sta) struct ieee80211_local *local; struct ieee80211_sub_if_data *sdata; int ret, i; + bool have_key = false; might_sleep(); @@ -783,12 +784,19 @@ int __must_check __sta_info_destroy(struct sta_info *sta) list_del_rcu(&sta->list); mutex_lock(&local->key_mtx); - for (i = 0; i < NUM_DEFAULT_KEYS; i++) + for (i = 0; i < NUM_DEFAULT_KEYS; i++) { __ieee80211_key_free(key_mtx_dereference(local, sta->gtk[i])); - if (sta->ptk) + have_key = true; + } + if (sta->ptk) { __ieee80211_key_free(key_mtx_dereference(local, sta->ptk)); + have_key = true; + } mutex_unlock(&local->key_mtx); + if (!have_key) + synchronize_net(); + sta->dead = true; local->num_sta--;