Skip to content

Commit

Permalink
cfg80211: fix sysfs registration race
Browse files Browse the repository at this point in the history
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: Maxime Bizon <mbizon@freebox.fr>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  • Loading branch information
Johannes Berg committed Sep 26, 2013
1 parent cc63ec7 commit aa5f66d
Showing 1 changed file with 13 additions and 8 deletions.
21 changes: 13 additions & 8 deletions net/wireless/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit aa5f66d

Please sign in to comment.