diff options
author | Johannes Berg <johannes@sipsolutions.net> | 2008-04-11 15:40:35 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2008-04-16 15:59:57 -0400 |
commit | b16bd15c379410f2aa47837aa4a0de5712856ad5 (patch) | |
tree | fd391bb12b146aaf001ae169a4c98f7088299edd /net/mac80211/key.c | |
parent | 6b914c521687ae6cb8923c7235fd69b7bc027703 (diff) |
mac80211: fix spinlock recursion
When STAs are expired, we need to hold the sta_lock. Using
the same lock for keys too would then mean we'd need another
key free function, and that'll just lead to confusion, so just
use a new spinlock for all key lists.
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/key.c')
-rw-r--r-- | net/mac80211/key.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/net/mac80211/key.c b/net/mac80211/key.c index acf8d0370a37..b98711dcdc54 100644 --- a/net/mac80211/key.c +++ b/net/mac80211/key.c | |||
@@ -210,9 +210,9 @@ void ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata, int idx) | |||
210 | { | 210 | { |
211 | unsigned long flags; | 211 | unsigned long flags; |
212 | 212 | ||
213 | spin_lock_irqsave(&sdata->local->sta_lock, flags); | 213 | spin_lock_irqsave(&sdata->local->key_lock, flags); |
214 | __ieee80211_set_default_key(sdata, idx); | 214 | __ieee80211_set_default_key(sdata, idx); |
215 | spin_unlock_irqrestore(&sdata->local->sta_lock, flags); | 215 | spin_unlock_irqrestore(&sdata->local->key_lock, flags); |
216 | } | 216 | } |
217 | 217 | ||
218 | 218 | ||
@@ -339,7 +339,7 @@ void ieee80211_key_link(struct ieee80211_key *key, | |||
339 | } | 339 | } |
340 | } | 340 | } |
341 | 341 | ||
342 | spin_lock_irqsave(&sdata->local->sta_lock, flags); | 342 | spin_lock_irqsave(&sdata->local->key_lock, flags); |
343 | 343 | ||
344 | if (sta) | 344 | if (sta) |
345 | old_key = sta->key; | 345 | old_key = sta->key; |
@@ -348,7 +348,7 @@ void ieee80211_key_link(struct ieee80211_key *key, | |||
348 | 348 | ||
349 | __ieee80211_key_replace(sdata, sta, old_key, key); | 349 | __ieee80211_key_replace(sdata, sta, old_key, key); |
350 | 350 | ||
351 | spin_unlock_irqrestore(&sdata->local->sta_lock, flags); | 351 | spin_unlock_irqrestore(&sdata->local->key_lock, flags); |
352 | 352 | ||
353 | /* free old key later */ | 353 | /* free old key later */ |
354 | add_todo(old_key, KEY_FLAG_TODO_DELETE); | 354 | add_todo(old_key, KEY_FLAG_TODO_DELETE); |
@@ -377,9 +377,9 @@ void ieee80211_key_free(struct ieee80211_key *key) | |||
377 | if (!key) | 377 | if (!key) |
378 | return; | 378 | return; |
379 | 379 | ||
380 | spin_lock_irqsave(&key->sdata->local->sta_lock, flags); | 380 | spin_lock_irqsave(&key->sdata->local->key_lock, flags); |
381 | __ieee80211_key_free(key); | 381 | __ieee80211_key_free(key); |
382 | spin_unlock_irqrestore(&key->sdata->local->sta_lock, flags); | 382 | spin_unlock_irqrestore(&key->sdata->local->key_lock, flags); |
383 | } | 383 | } |
384 | 384 | ||
385 | /* | 385 | /* |
@@ -397,10 +397,10 @@ static void ieee80211_todo_for_each_key(struct ieee80211_sub_if_data *sdata, | |||
397 | 397 | ||
398 | might_sleep(); | 398 | might_sleep(); |
399 | 399 | ||
400 | spin_lock_irqsave(&sdata->local->sta_lock, flags); | 400 | spin_lock_irqsave(&sdata->local->key_lock, flags); |
401 | list_for_each_entry(key, &sdata->key_list, list) | 401 | list_for_each_entry(key, &sdata->key_list, list) |
402 | add_todo(key, todo_flags); | 402 | add_todo(key, todo_flags); |
403 | spin_unlock_irqrestore(&sdata->local->sta_lock, flags); | 403 | spin_unlock_irqrestore(&sdata->local->key_lock, flags); |
404 | 404 | ||
405 | ieee80211_key_todo(); | 405 | ieee80211_key_todo(); |
406 | } | 406 | } |
@@ -506,10 +506,10 @@ void ieee80211_free_keys(struct ieee80211_sub_if_data *sdata) | |||
506 | 506 | ||
507 | ieee80211_debugfs_key_remove_default(sdata); | 507 | ieee80211_debugfs_key_remove_default(sdata); |
508 | 508 | ||
509 | spin_lock_irqsave(&sdata->local->sta_lock, flags); | 509 | spin_lock_irqsave(&sdata->local->key_lock, flags); |
510 | list_for_each_entry_safe(key, tmp, &sdata->key_list, list) | 510 | list_for_each_entry_safe(key, tmp, &sdata->key_list, list) |
511 | __ieee80211_key_free(key); | 511 | __ieee80211_key_free(key); |
512 | spin_unlock_irqrestore(&sdata->local->sta_lock, flags); | 512 | spin_unlock_irqrestore(&sdata->local->key_lock, flags); |
513 | 513 | ||
514 | __ieee80211_key_todo(); | 514 | __ieee80211_key_todo(); |
515 | 515 | ||