summaryrefslogtreecommitdiffstats
path: root/net/wireless/reg.c
diff options
context:
space:
mode:
authorLuis R. Rodriguez <mcgrof@do-not-panic.com>2013-11-05 12:18:08 -0500
committerJohannes Berg <johannes.berg@intel.com>2013-11-25 14:51:16 -0500
commit5ad6ef5e06a1c9feb934c13b3a5f5303833fef4e (patch)
tree1a17643b72324209f8f50c81b9c17a7cb57ba1f0 /net/wireless/reg.c
parent2f1c6c572d7b6cbe2e3c9bbb427769f6c79089bb (diff)
cfg80211: add helper for kfree'ing last_request
This is common code, this reduces the chance of making a mistake of how we free it. Signed-off-by: Luis R. Rodriguez <mcgrof@do-not-panic.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/wireless/reg.c')
-rw-r--r--net/wireless/reg.c42
1 files changed, 19 insertions, 23 deletions
diff --git a/net/wireless/reg.c b/net/wireless/reg.c
index 875fffc284c0..6ad7b2968862 100644
--- a/net/wireless/reg.c
+++ b/net/wireless/reg.c
@@ -202,11 +202,20 @@ static char user_alpha2[2];
202module_param(ieee80211_regdom, charp, 0444); 202module_param(ieee80211_regdom, charp, 0444);
203MODULE_PARM_DESC(ieee80211_regdom, "IEEE 802.11 regulatory domain code"); 203MODULE_PARM_DESC(ieee80211_regdom, "IEEE 802.11 regulatory domain code");
204 204
205static void reg_kfree_last_request(void)
206{
207 struct regulatory_request *lr;
208
209 lr = get_last_request();
210
211 if (lr != &core_request_world && lr)
212 kfree_rcu(lr, rcu_head);
213}
214
205static void reset_regdomains(bool full_reset, 215static void reset_regdomains(bool full_reset,
206 const struct ieee80211_regdomain *new_regdom) 216 const struct ieee80211_regdomain *new_regdom)
207{ 217{
208 const struct ieee80211_regdomain *r; 218 const struct ieee80211_regdomain *r;
209 struct regulatory_request *lr;
210 219
211 ASSERT_RTNL(); 220 ASSERT_RTNL();
212 221
@@ -229,9 +238,7 @@ static void reset_regdomains(bool full_reset,
229 if (!full_reset) 238 if (!full_reset)
230 return; 239 return;
231 240
232 lr = get_last_request(); 241 reg_kfree_last_request();
233 if (lr != &core_request_world && lr)
234 kfree_rcu(lr, rcu_head);
235 rcu_assign_pointer(last_request, &core_request_world); 242 rcu_assign_pointer(last_request, &core_request_world);
236} 243}
237 244
@@ -1353,14 +1360,11 @@ static void reg_set_request_processed(void)
1353static enum reg_request_treatment 1360static enum reg_request_treatment
1354reg_process_hint_core(struct regulatory_request *core_request) 1361reg_process_hint_core(struct regulatory_request *core_request)
1355{ 1362{
1356 struct regulatory_request *lr;
1357
1358 lr = get_last_request();
1359 if (lr != &core_request_world && lr)
1360 kfree_rcu(lr, rcu_head);
1361 1363
1362 core_request->intersect = false; 1364 core_request->intersect = false;
1363 core_request->processed = false; 1365 core_request->processed = false;
1366
1367 reg_kfree_last_request();
1364 rcu_assign_pointer(last_request, core_request); 1368 rcu_assign_pointer(last_request, core_request);
1365 1369
1366 if (call_crda(core_request->alpha2)) 1370 if (call_crda(core_request->alpha2))
@@ -1417,7 +1421,6 @@ static enum reg_request_treatment
1417reg_process_hint_user(struct regulatory_request *user_request) 1421reg_process_hint_user(struct regulatory_request *user_request)
1418{ 1422{
1419 enum reg_request_treatment treatment; 1423 enum reg_request_treatment treatment;
1420 struct regulatory_request *lr;
1421 1424
1422 treatment = __reg_process_hint_user(user_request); 1425 treatment = __reg_process_hint_user(user_request);
1423 if (treatment == REG_REQ_IGNORE || 1426 if (treatment == REG_REQ_IGNORE ||
@@ -1426,12 +1429,10 @@ reg_process_hint_user(struct regulatory_request *user_request)
1426 return treatment; 1429 return treatment;
1427 } 1430 }
1428 1431
1429 lr = get_last_request();
1430 if (lr != &core_request_world && lr)
1431 kfree_rcu(lr, rcu_head);
1432
1433 user_request->intersect = treatment == REG_REQ_INTERSECT; 1432 user_request->intersect = treatment == REG_REQ_INTERSECT;
1434 user_request->processed = false; 1433 user_request->processed = false;
1434
1435 reg_kfree_last_request();
1435 rcu_assign_pointer(last_request, user_request); 1436 rcu_assign_pointer(last_request, user_request);
1436 1437
1437 user_alpha2[0] = user_request->alpha2[0]; 1438 user_alpha2[0] = user_request->alpha2[0];
@@ -1480,7 +1481,6 @@ reg_process_hint_driver(struct wiphy *wiphy,
1480{ 1481{
1481 const struct ieee80211_regdomain *regd; 1482 const struct ieee80211_regdomain *regd;
1482 enum reg_request_treatment treatment; 1483 enum reg_request_treatment treatment;
1483 struct regulatory_request *lr;
1484 1484
1485 treatment = __reg_process_hint_driver(driver_request); 1485 treatment = __reg_process_hint_driver(driver_request);
1486 1486
@@ -1501,12 +1501,11 @@ reg_process_hint_driver(struct wiphy *wiphy,
1501 rcu_assign_pointer(wiphy->regd, regd); 1501 rcu_assign_pointer(wiphy->regd, regd);
1502 } 1502 }
1503 1503
1504 lr = get_last_request();
1505 if (lr != &core_request_world && lr)
1506 kfree_rcu(lr, rcu_head);
1507 1504
1508 driver_request->intersect = treatment == REG_REQ_INTERSECT; 1505 driver_request->intersect = treatment == REG_REQ_INTERSECT;
1509 driver_request->processed = false; 1506 driver_request->processed = false;
1507
1508 reg_kfree_last_request();
1510 rcu_assign_pointer(last_request, driver_request); 1509 rcu_assign_pointer(last_request, driver_request);
1511 1510
1512 /* 1511 /*
@@ -1581,7 +1580,6 @@ reg_process_hint_country_ie(struct wiphy *wiphy,
1581 struct regulatory_request *country_ie_request) 1580 struct regulatory_request *country_ie_request)
1582{ 1581{
1583 enum reg_request_treatment treatment; 1582 enum reg_request_treatment treatment;
1584 struct regulatory_request *lr;
1585 1583
1586 treatment = __reg_process_hint_country_ie(wiphy, country_ie_request); 1584 treatment = __reg_process_hint_country_ie(wiphy, country_ie_request);
1587 1585
@@ -1603,12 +1601,10 @@ reg_process_hint_country_ie(struct wiphy *wiphy,
1603 return REG_REQ_IGNORE; 1601 return REG_REQ_IGNORE;
1604 } 1602 }
1605 1603
1606 lr = get_last_request();
1607 if (lr != &core_request_world && lr)
1608 kfree_rcu(lr, rcu_head);
1609
1610 country_ie_request->intersect = false; 1604 country_ie_request->intersect = false;
1611 country_ie_request->processed = false; 1605 country_ie_request->processed = false;
1606
1607 reg_kfree_last_request();
1612 rcu_assign_pointer(last_request, country_ie_request); 1608 rcu_assign_pointer(last_request, country_ie_request);
1613 1609
1614 if (call_crda(country_ie_request->alpha2)) 1610 if (call_crda(country_ie_request->alpha2))