aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2009-07-30 08:04:01 -0400
committerJohn W. Linville <linville@tuxdriver.com>2009-08-04 16:44:15 -0400
commite40cbdac0629402a4cb0c3bca0cc19ab7a00e00d (patch)
tree1bd8e7379d68af119ec91d07a1b85549cbe6b5f3
parente46ab7f0886143846d8da2ca06c2b0e245f34dc6 (diff)
cfg80211: fix NETDEV_UNREGISTER notifier
It's possible to get the NETDEV_UNREGISTER callback multiple times (see net/core/dev.c:netdev_wait_allrefs) and this will completely mess up our cleanup code. To avoid that, clean up only when the interface is still on the wiphy interface list from which it's removed on the first NETDEV_UNREGISTER call. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--net/wireless/core.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/net/wireless/core.c b/net/wireless/core.c
index 755cdf1643c9..1493285b6a4d 100644
--- a/net/wireless/core.c
+++ b/net/wireless/core.c
@@ -725,15 +725,22 @@ static int cfg80211_netdev_notifier_call(struct notifier_block * nb,
725 break; 725 break;
726 case NETDEV_UNREGISTER: 726 case NETDEV_UNREGISTER:
727 mutex_lock(&rdev->devlist_mtx); 727 mutex_lock(&rdev->devlist_mtx);
728 /*
729 * It is possible to get NETDEV_UNREGISTER
730 * multiple times. To detect that, check
731 * that the interface is still on the list
732 * of registered interfaces, and only then
733 * remove and clean it up.
734 */
728 if (!list_empty(&wdev->list)) { 735 if (!list_empty(&wdev->list)) {
729 sysfs_remove_link(&dev->dev.kobj, "phy80211"); 736 sysfs_remove_link(&dev->dev.kobj, "phy80211");
730 list_del_init(&wdev->list); 737 list_del_init(&wdev->list);
731 } 738 mutex_destroy(&wdev->mtx);
732 mutex_unlock(&rdev->devlist_mtx);
733 mutex_destroy(&wdev->mtx);
734#ifdef CONFIG_WIRELESS_EXT 739#ifdef CONFIG_WIRELESS_EXT
735 kfree(wdev->wext.keys); 740 kfree(wdev->wext.keys);
736#endif 741#endif
742 }
743 mutex_unlock(&rdev->devlist_mtx);
737 break; 744 break;
738 case NETDEV_PRE_UP: 745 case NETDEV_PRE_UP:
739 if (!(wdev->wiphy->interface_modes & BIT(wdev->iftype))) 746 if (!(wdev->wiphy->interface_modes & BIT(wdev->iftype)))