From c0f18564b8b641963aff521bd4227bb96cabb7cd Mon Sep 17 00:00:00 2001 From: Johannes Berg Date: Thu, 30 Jul 2009 14:04:01 +0200 Subject: [PATCH] --- yaml --- r: 159363 b: refs/heads/master c: e40cbdac0629402a4cb0c3bca0cc19ab7a00e00d h: refs/heads/master i: 159361: 438b408170be294d98a3be56f5e66166700fdc87 159359: a80d9acf0cb81654fb7a9c2544ef465fe9cea402 v: v3 --- [refs] | 2 +- trunk/net/wireless/core.c | 15 +++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index b0414f2da791..9eb53aaaccf0 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: e46ab7f0886143846d8da2ca06c2b0e245f34dc6 +refs/heads/master: e40cbdac0629402a4cb0c3bca0cc19ab7a00e00d diff --git a/trunk/net/wireless/core.c b/trunk/net/wireless/core.c index 755cdf1643c9..1493285b6a4d 100644 --- a/trunk/net/wireless/core.c +++ b/trunk/net/wireless/core.c @@ -725,15 +725,22 @@ static int cfg80211_netdev_notifier_call(struct notifier_block * nb, break; case NETDEV_UNREGISTER: mutex_lock(&rdev->devlist_mtx); + /* + * It is possible to get NETDEV_UNREGISTER + * multiple times. To detect that, check + * that the interface is still on the list + * of registered interfaces, and only then + * remove and clean it up. + */ if (!list_empty(&wdev->list)) { sysfs_remove_link(&dev->dev.kobj, "phy80211"); list_del_init(&wdev->list); - } - mutex_unlock(&rdev->devlist_mtx); - mutex_destroy(&wdev->mtx); + mutex_destroy(&wdev->mtx); #ifdef CONFIG_WIRELESS_EXT - kfree(wdev->wext.keys); + kfree(wdev->wext.keys); #endif + } + mutex_unlock(&rdev->devlist_mtx); break; case NETDEV_PRE_UP: if (!(wdev->wiphy->interface_modes & BIT(wdev->iftype)))