Commit aa5f66d5 authored by Johannes Berg's avatar Johannes Berg

cfg80211: fix sysfs registration race

My locking rework/race fixes caused a regression in the
registration, causing uevent notifications for wireless
devices before the device is really fully registered and
available in nl80211.

Fix this by moving the device_add() under rtnl and move
the rfkill to afterwards (it can't be under rtnl.)
Reported-and-tested-by: default avatarMaxime Bizon <mbizon@freebox.fr>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent cc63ec76
......@@ -566,18 +566,13 @@ int wiphy_register(struct wiphy *wiphy)
/* check and set up bitrates */
ieee80211_set_bitrate_flags(wiphy);
rtnl_lock();
res = device_add(&rdev->wiphy.dev);
if (res)
return res;
res = rfkill_register(rdev->rfkill);
if (res) {
device_del(&rdev->wiphy.dev);
rtnl_unlock();
return res;
}
rtnl_lock();
/* set up regulatory info */
wiphy_regulatory_register(wiphy);
......@@ -606,6 +601,15 @@ int wiphy_register(struct wiphy *wiphy)
rdev->wiphy.registered = true;
rtnl_unlock();
res = rfkill_register(rdev->rfkill);
if (res) {
rfkill_destroy(rdev->rfkill);
rdev->rfkill = NULL;
wiphy_unregister(&rdev->wiphy);
return res;
}
return 0;
}
EXPORT_SYMBOL(wiphy_register);
......@@ -640,7 +644,8 @@ void wiphy_unregister(struct wiphy *wiphy)
rtnl_unlock();
__count == 0; }));
rfkill_unregister(rdev->rfkill);
if (rdev->rfkill)
rfkill_unregister(rdev->rfkill);
rtnl_lock();
rdev->wiphy.registered = false;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment