From patchwork Tue Aug 31 17:57:16 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "John W. Linville" X-Patchwork-Id: 145391 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id o7VHIB0K022060 for ; Tue, 31 Aug 2010 18:13:48 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754684Ab0HaR7p (ORCPT ); Tue, 31 Aug 2010 13:59:45 -0400 Received: from charlotte.tuxdriver.com ([70.61.120.58]:60886 "EHLO smtp.tuxdriver.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754687Ab0HaR7n (ORCPT ); Tue, 31 Aug 2010 13:59:43 -0400 Received: from uucp by smtp.tuxdriver.com with local-rmail (Exim 4.63) (envelope-from ) id 1OqV7T-00065T-Kv; Tue, 31 Aug 2010 13:59:39 -0400 Received: from linville-8530p.local (localhost.localdomain [127.0.0.1]) by linville-8530p.local (8.14.4/8.14.4) with ESMTP id o7VHvHvV005956; Tue, 31 Aug 2010 13:57:17 -0400 Received: (from linville@localhost) by linville-8530p.local (8.14.4/8.14.4/Submit) id o7VHvGX4005954; Tue, 31 Aug 2010 13:57:16 -0400 From: "John W. Linville" To: linux-wireless@vger.kernel.org Cc: Miles Lane , rjw@sisk.pl, maciej.rutecki@gmail.com, "John W. Linville" Subject: [PATCH] wireless: register wiphy rfkill w/o holding cfg80211_mutex Date: Tue, 31 Aug 2010 13:57:16 -0400 Message-Id: <1283277436-5922-1-git-send-email-linville@tuxdriver.com> X-Mailer: git-send-email 1.7.2.2 In-Reply-To: <1283237477.3733.0.camel@jlt3.sipsolutions.net> References: <1283237477.3733.0.camel@jlt3.sipsolutions.net> Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter1.kernel.org [140.211.167.41]); Tue, 31 Aug 2010 18:13:49 +0000 (UTC) diff --git a/net/wireless/core.c b/net/wireless/core.c index 541e2ff..d6d046b 100644 --- a/net/wireless/core.c +++ b/net/wireless/core.c @@ -475,12 +475,10 @@ int wiphy_register(struct wiphy *wiphy) mutex_lock(&cfg80211_mutex); res = device_add(&rdev->wiphy.dev); - if (res) - goto out_unlock; - - res = rfkill_register(rdev->rfkill); - if (res) - goto out_rm_dev; + if (res) { + mutex_unlock(&cfg80211_mutex); + return res; + } /* set up regulatory info */ wiphy_update_regulatory(wiphy, NL80211_REGDOM_SET_BY_CORE); @@ -509,13 +507,18 @@ int wiphy_register(struct wiphy *wiphy) cfg80211_debugfs_rdev_add(rdev); mutex_unlock(&cfg80211_mutex); + /* + * due to a locking dependency this has to be outside of the + * cfg80211_mutex lock + */ + res = rfkill_register(rdev->rfkill); + if (res) + goto out_rm_dev; + return 0; out_rm_dev: device_del(&rdev->wiphy.dev); - -out_unlock: - mutex_unlock(&cfg80211_mutex); return res; } EXPORT_SYMBOL(wiphy_register);