summaryrefslogtreecommitdiff
path: root/net/wireless/reg.c
diff options
context:
space:
mode:
authorSven Neumann <s.neumann@raumfeld.com>2011-08-31 01:38:53 +0400
committerJohn W. Linville <linville@tuxdriver.com>2011-09-14 21:26:39 +0400
commiteac03e381957a05f3842ceb8de987a1025966ecf (patch)
tree5dfbfa366c63e481eb92b7f61dbabdd4f82b6ad3 /net/wireless/reg.c
parent56e6786e59cba2c714091ed53deffa6001a32841 (diff)
downloadlinux-eac03e381957a05f3842ceb8de987a1025966ecf.tar.xz
cfg80211: hold reg_mutex when updating regulatory
The function wiphy_update_regulatory() uses the static variable last_request and thus needs to be called with reg_mutex held. This is the case for all users in reg.c, but the function was exported for use by wiphy_register(), from where it is called without the lock being held. Fix this by making wiphy_update_regulatory() private and introducing regulatory_update() as a wrapper that acquires and holds the lock. Signed-off-by: Sven Neumann <s.neumann@raumfeld.com> Cc: John W. Linville <linville@tuxdriver.com> Cc: Luis R. Rodriguez <mcgrof@gmail.com> Cc: Daniel Mack <daniel@zonque.org> Cc: linux-wireless@vger.kernel.org Acked-by: Luis R. Rodriguez <mcgrof@qca.qualcomm.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/wireless/reg.c')
-rw-r--r--net/wireless/reg.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/net/wireless/reg.c b/net/wireless/reg.c
index a2b09c2df1bf..a1f069da79a4 100644
--- a/net/wireless/reg.c
+++ b/net/wireless/reg.c
@@ -101,6 +101,9 @@ struct reg_beacon {
struct ieee80211_channel chan;
};
+static void wiphy_update_regulatory(struct wiphy *wiphy,
+ enum nl80211_reg_initiator initiator);
+
static void reg_todo(struct work_struct *work);
static DECLARE_WORK(reg_work, reg_todo);
@@ -1118,11 +1121,13 @@ static void reg_process_ht_flags(struct wiphy *wiphy)
}
-void wiphy_update_regulatory(struct wiphy *wiphy,
- enum nl80211_reg_initiator initiator)
+static void wiphy_update_regulatory(struct wiphy *wiphy,
+ enum nl80211_reg_initiator initiator)
{
enum ieee80211_band band;
+ assert_reg_lock();
+
if (ignore_reg_update(wiphy, initiator))
return;
@@ -1137,6 +1142,14 @@ void wiphy_update_regulatory(struct wiphy *wiphy,
wiphy->reg_notifier(wiphy, last_request);
}
+void regulatory_update(struct wiphy *wiphy,
+ enum nl80211_reg_initiator setby)
+{
+ mutex_lock(&reg_mutex);
+ wiphy_update_regulatory(wiphy, setby);
+ mutex_unlock(&reg_mutex);
+}
+
static void handle_channel_custom(struct wiphy *wiphy,
enum ieee80211_band band,
unsigned int chan_idx,