aboutsummaryrefslogtreecommitdiffstats
path: root/net/wireless/reg.c
diff options
context:
space:
mode:
authorLuis R. Rodriguez <mcgrof@do-not-panic.com>2014-02-25 20:09:40 -0500
committerJohannes Berg <johannes.berg@intel.com>2014-03-03 09:07:33 -0500
commit255e25b0e5d4bd035d82f53011df619d8cc0bedb (patch)
tree0212d4a8947d4733f8c570dbf1a57fdbe2e649a9 /net/wireless/reg.c
parentb8ff416bc9c90c696cc3f3553617a99e9c5572cf (diff)
cfg80211: allow reprocessing of pending requests
In certain situations we want to trigger reprocessing of the last regulatory hint. One situation in which this makes sense is the case where the cfg80211 was built-in to the kernel, CFG80211_INTERNAL_REGDB was not enabled and the CRDA binary is on a partition not availble during early boot. In such a case we want to be able to re-process the same request at some other point. When we are asked to re-process the same request we need to be careful to not kfree it, addresses that. Reported-by: Sander Eikelenboom <linux@eikelenboom.it> Signed-off-by: Luis R. Rodriguez <mcgrof@do-not-panic.com> [rename function] Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/wireless/reg.c')
-rw-r--r--net/wireless/reg.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/net/wireless/reg.c b/net/wireless/reg.c
index b95e9cf139c0..d944c25f1bb1 100644
--- a/net/wireless/reg.c
+++ b/net/wireless/reg.c
@@ -240,19 +240,21 @@ static char user_alpha2[2];
240module_param(ieee80211_regdom, charp, 0444); 240module_param(ieee80211_regdom, charp, 0444);
241MODULE_PARM_DESC(ieee80211_regdom, "IEEE 802.11 regulatory domain code"); 241MODULE_PARM_DESC(ieee80211_regdom, "IEEE 802.11 regulatory domain code");
242 242
243static void reg_kfree_last_request(void) 243static void reg_free_request(struct regulatory_request *lr)
244{ 244{
245 struct regulatory_request *lr;
246
247 lr = get_last_request();
248
249 if (lr != &core_request_world && lr) 245 if (lr != &core_request_world && lr)
250 kfree_rcu(lr, rcu_head); 246 kfree_rcu(lr, rcu_head);
251} 247}
252 248
253static void reg_update_last_request(struct regulatory_request *request) 249static void reg_update_last_request(struct regulatory_request *request)
254{ 250{
255 reg_kfree_last_request(); 251 struct regulatory_request *lr;
252
253 lr = get_last_request();
254 if (lr == request)
255 return;
256
257 reg_free_request(lr);
256 rcu_assign_pointer(last_request, request); 258 rcu_assign_pointer(last_request, request);
257} 259}
258 260