cfg80211: allow reprocessing of pending requests
authorLuis R. Rodriguez <mcgrof@do-not-panic.com>
Wed, 26 Feb 2014 01:09:40 +0000 (17:09 -0800)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 3 Mar 2014 14:07:33 +0000 (15:07 +0100)
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>
net/wireless/reg.c

index b95e9cf139c0aeb736a578f3f29bd88c5d95bfd7..d944c25f1bb1b3644c8654cbcf8dee53e36dabf4 100644 (file)
@@ -240,19 +240,21 @@ static char user_alpha2[2];
 module_param(ieee80211_regdom, charp, 0444);
 MODULE_PARM_DESC(ieee80211_regdom, "IEEE 802.11 regulatory domain code");
 
-static void reg_kfree_last_request(void)
+static void reg_free_request(struct regulatory_request *lr)
 {
-       struct regulatory_request *lr;
-
-       lr = get_last_request();
-
        if (lr != &core_request_world && lr)
                kfree_rcu(lr, rcu_head);
 }
 
 static void reg_update_last_request(struct regulatory_request *request)
 {
-       reg_kfree_last_request();
+       struct regulatory_request *lr;
+
+       lr = get_last_request();
+       if (lr == request)
+               return;
+
+       reg_free_request(lr);
        rcu_assign_pointer(last_request, request);
 }