| From srivatsa.bhat@linux.vnet.ibm.com Thu Mar 1 13:31:42 2012 |
| From: "Srivatsa S. Bhat" <srivatsa.bhat@linux.vnet.ibm.com> |
| Date: Wed, 29 Feb 2012 12:23:20 +0530 |
| Subject: firmware loader: allow builtin firmware load even if usermodehelper is disabled |
| To: gregkh@linuxfoundation.org |
| Cc: stable@vger.kernel.org, rjw@sisk.pl, valdis.kletnieks@vt.edu, cloos@hjcloos.com, riesebie@lxtec.de, torvalds@linux-foundation.org, penguin-kernel@i-love.sakura.ne.jp, srivatsa.bhat@linux.vnet.ibm.com |
| Message-ID: <20120229065249.4761.69035.stgit@srivatsabhat.in.ibm.com> |
| |
| |
| From: Linus Torvalds <torvalds@linux-foundation.org> |
| |
| [ Upstream commit caca9510ff4e5d842c0589110243d60927836222 ] |
| |
| In commit a144c6a6c924 ("PM: Print a warning if firmware is requested |
| when tasks are frozen") we not only printed a warning if somebody tried |
| to load the firmware when tasks are frozen - we also failed the load. |
| |
| But that check was done before the check for built-in firmware, and then |
| when we disallowed usermode helpers during bootup (commit 288d5abec831: |
| "Boot up with usermodehelper disabled"), that actually means that |
| built-in modules can no longer load their firmware even if the firmware |
| is built in too. Which used to work, and some people depended on it for |
| the R100 driver. |
| |
| So move the test for usermodehelper_is_disabled() down, to after |
| checking the built-in firmware. |
| |
| This should fix: |
| |
| https://bugzilla.kernel.org/show_bug.cgi?id=40952 |
| |
| Reported-by: James Cloos <cloos@hjcloos.com> |
| Bisected-by: Elimar Riesebieter <riesebie@lxtec.de> |
| Cc: Michel Dรคnzer <michel@daenzer.net> |
| Cc: Rafael Wysocki <rjw@sisk.pl> |
| Cc: Valdis Kletnieks <valdis.kletnieks@vt.edu> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| |
| drivers/base/firmware_class.c | 11 ++++++----- |
| 1 file changed, 6 insertions(+), 5 deletions(-) |
| |
| --- a/drivers/base/firmware_class.c |
| +++ b/drivers/base/firmware_class.c |
| @@ -489,11 +489,6 @@ _request_firmware(const struct firmware |
| if (!firmware_p) |
| return -EINVAL; |
| |
| - if (WARN_ON(usermodehelper_is_disabled())) { |
| - dev_err(device, "firmware: %s will not be loaded\n", name); |
| - return -EBUSY; |
| - } |
| - |
| *firmware_p = firmware = kzalloc(sizeof(*firmware), GFP_KERNEL); |
| if (!firmware) { |
| dev_err(device, "%s: kmalloc(struct firmware) failed\n", |
| @@ -513,6 +508,12 @@ _request_firmware(const struct firmware |
| return 0; |
| } |
| |
| + if (WARN_ON(usermodehelper_is_disabled())) { |
| + dev_err(device, "firmware: %s will not be loaded\n", name); |
| + retval = -EBUSY; |
| + goto out; |
| + } |
| + |
| if (uevent) |
| dev_info(device, "firmware: requesting %s\n", name); |
| |