diff options
-rw-r--r-- | net/wireless/core.c | 8 | ||||
-rw-r--r-- | net/wireless/core.h | 4 |
2 files changed, 5 insertions, 7 deletions
diff --git a/net/wireless/core.c b/net/wireless/core.c index e13365f1fa63..eb60410ae588 100644 --- a/net/wireless/core.c +++ b/net/wireless/core.c | |||
@@ -766,7 +766,7 @@ void cfg80211_update_iface_num(struct cfg80211_registered_device *rdev, | |||
766 | bool has_monitors_only_old = cfg80211_has_monitors_only(rdev); | 766 | bool has_monitors_only_old = cfg80211_has_monitors_only(rdev); |
767 | bool has_monitors_only_new; | 767 | bool has_monitors_only_new; |
768 | 768 | ||
769 | ASSERT_RDEV_LOCK(rdev); | 769 | ASSERT_RTNL(); |
770 | 770 | ||
771 | rdev->num_running_ifaces += num; | 771 | rdev->num_running_ifaces += num; |
772 | if (iftype == NL80211_IFTYPE_MONITOR) | 772 | if (iftype == NL80211_IFTYPE_MONITOR) |
@@ -888,10 +888,8 @@ static int cfg80211_netdev_notifier_call(struct notifier_block *nb, | |||
888 | wdev->beacon_interval = 0; | 888 | wdev->beacon_interval = 0; |
889 | break; | 889 | break; |
890 | case NETDEV_DOWN: | 890 | case NETDEV_DOWN: |
891 | dev_hold(dev); | ||
892 | cfg80211_lock_rdev(rdev); | ||
893 | cfg80211_update_iface_num(rdev, wdev->iftype, -1); | 891 | cfg80211_update_iface_num(rdev, wdev->iftype, -1); |
894 | cfg80211_unlock_rdev(rdev); | 892 | dev_hold(dev); |
895 | queue_work(cfg80211_wq, &wdev->cleanup_work); | 893 | queue_work(cfg80211_wq, &wdev->cleanup_work); |
896 | break; | 894 | break; |
897 | case NETDEV_UP: | 895 | case NETDEV_UP: |
@@ -1001,9 +999,7 @@ static int cfg80211_netdev_notifier_call(struct notifier_block *nb, | |||
1001 | mutex_unlock(&rdev->devlist_mtx); | 999 | mutex_unlock(&rdev->devlist_mtx); |
1002 | if (ret) | 1000 | if (ret) |
1003 | return notifier_from_errno(ret); | 1001 | return notifier_from_errno(ret); |
1004 | cfg80211_lock_rdev(rdev); | ||
1005 | cfg80211_update_iface_num(rdev, wdev->iftype, 1); | 1002 | cfg80211_update_iface_num(rdev, wdev->iftype, 1); |
1006 | cfg80211_unlock_rdev(rdev); | ||
1007 | break; | 1003 | break; |
1008 | } | 1004 | } |
1009 | 1005 | ||
diff --git a/net/wireless/core.h b/net/wireless/core.h index 81fef3ddb5a8..377dc394f48c 100644 --- a/net/wireless/core.h +++ b/net/wireless/core.h | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/debugfs.h> | 13 | #include <linux/debugfs.h> |
14 | #include <linux/rfkill.h> | 14 | #include <linux/rfkill.h> |
15 | #include <linux/workqueue.h> | 15 | #include <linux/workqueue.h> |
16 | #include <linux/rtnetlink.h> | ||
16 | #include <net/genetlink.h> | 17 | #include <net/genetlink.h> |
17 | #include <net/cfg80211.h> | 18 | #include <net/cfg80211.h> |
18 | #include "reg.h" | 19 | #include "reg.h" |
@@ -56,6 +57,7 @@ struct cfg80211_registered_device { | |||
56 | 57 | ||
57 | u32 ap_beacons_nlpid; | 58 | u32 ap_beacons_nlpid; |
58 | 59 | ||
60 | /* protected by RTNL only */ | ||
59 | int num_running_ifaces; | 61 | int num_running_ifaces; |
60 | int num_running_monitor_ifaces; | 62 | int num_running_monitor_ifaces; |
61 | 63 | ||
@@ -205,7 +207,7 @@ static inline void wdev_unlock(struct wireless_dev *wdev) | |||
205 | 207 | ||
206 | static inline bool cfg80211_has_monitors_only(struct cfg80211_registered_device *rdev) | 208 | static inline bool cfg80211_has_monitors_only(struct cfg80211_registered_device *rdev) |
207 | { | 209 | { |
208 | ASSERT_RDEV_LOCK(rdev); | 210 | ASSERT_RTNL(); |
209 | 211 | ||
210 | return rdev->num_running_ifaces == rdev->num_running_monitor_ifaces && | 212 | return rdev->num_running_ifaces == rdev->num_running_monitor_ifaces && |
211 | rdev->num_running_ifaces > 0; | 213 | rdev->num_running_ifaces > 0; |