diff options
author | Luis R. Rodriguez <mcgrof@do-not-panic.com> | 2013-11-05 12:18:08 -0500 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2013-11-25 14:51:16 -0500 |
commit | 5ad6ef5e06a1c9feb934c13b3a5f5303833fef4e (patch) | |
tree | 1a17643b72324209f8f50c81b9c17a7cb57ba1f0 /net/wireless/reg.c | |
parent | 2f1c6c572d7b6cbe2e3c9bbb427769f6c79089bb (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.c | 42 |
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]; | |||
202 | module_param(ieee80211_regdom, charp, 0444); | 202 | module_param(ieee80211_regdom, charp, 0444); |
203 | MODULE_PARM_DESC(ieee80211_regdom, "IEEE 802.11 regulatory domain code"); | 203 | MODULE_PARM_DESC(ieee80211_regdom, "IEEE 802.11 regulatory domain code"); |
204 | 204 | ||
205 | static 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 | |||
205 | static void reset_regdomains(bool full_reset, | 215 | static 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) | |||
1353 | static enum reg_request_treatment | 1360 | static enum reg_request_treatment |
1354 | reg_process_hint_core(struct regulatory_request *core_request) | 1361 | reg_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 | |||
1417 | reg_process_hint_user(struct regulatory_request *user_request) | 1421 | reg_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)) |