Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aa5f66d5 authored by Johannes Berg's avatar Johannes Berg
Browse files

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
Loading
Loading
Loading
Loading
+13 −8
Original line number Diff line number Diff line
@@ -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,6 +644,7 @@ void wiphy_unregister(struct wiphy *wiphy)
		rtnl_unlock();
		__count == 0; }));

	if (rdev->rfkill)
		rfkill_unregister(rdev->rfkill);

	rtnl_lock();