aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/debugfs_sta.c
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2008-10-07 12:04:29 +0200
committerJohn W. Linville <linville@tuxdriver.com>2008-10-14 20:46:41 -0400
commit63044e9f54b6bac50d2380bf4d14f63e9e7de72b (patch)
tree9ceddf721c869fb9450429fd4932d8c40b765486 /net/mac80211/debugfs_sta.c
parent45527c2c4f698f8927239cfdec9f515cafed5f10 (diff)
downloadkernel_samsung_smdk4412-63044e9f54b6bac50d2380bf4d14f63e9e7de72b.tar.gz
kernel_samsung_smdk4412-63044e9f54b6bac50d2380bf4d14f63e9e7de72b.tar.bz2
kernel_samsung_smdk4412-63044e9f54b6bac50d2380bf4d14f63e9e7de72b.zip
mac80211: fix debugfs lockup
When debugfs_create_dir fails, sta_info_debugfs_add_work will not terminate because it will find the same station again and again. This is possible whenever debugfs fails for whatever reason; one reason is a race condition in mac80211, unfortunately we cannot do much about it, so just document it, it just means some station may be missing from debugfs. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Cc: Robin Holt <holt@sgi.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/debugfs_sta.c')
-rw-r--r--net/mac80211/debugfs_sta.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/net/mac80211/debugfs_sta.c b/net/mac80211/debugfs_sta.c
index b9902e425f0..189d0bafa91 100644
--- a/net/mac80211/debugfs_sta.c
+++ b/net/mac80211/debugfs_sta.c
@@ -249,11 +249,22 @@ void ieee80211_sta_debugfs_add(struct sta_info *sta)
DECLARE_MAC_BUF(mbuf);
u8 *mac;
+ sta->debugfs.add_has_run = true;
+
if (!stations_dir)
return;
mac = print_mac(mbuf, sta->sta.addr);
+ /*
+ * This might fail due to a race condition:
+ * When mac80211 unlinks a station, the debugfs entries
+ * remain, but it is already possible to link a new
+ * station with the same address which triggers adding
+ * it to debugfs; therefore, if the old station isn't
+ * destroyed quickly enough the old station's debugfs
+ * dir might still be around.
+ */
sta->debugfs.dir = debugfs_create_dir(mac, stations_dir);
if (!sta->debugfs.dir)
return;