From d2583e144e576a93f565231fbfd6b015aadd4fb5 Mon Sep 17 00:00:00 2001 From: "Rafael J. Wysocki" Date: Fri, 6 May 2011 20:09:42 +0200 Subject: [PATCH] --- yaml --- r: 245343 b: refs/heads/master c: a144c6a6c924aa1da04dd77fb84b89927354fdff h: refs/heads/master i: 245341: f5fc4a26a99a11b1a407d4f41da61e2dd0b9e4cf 245339: 9c306ac2a32f3c6685803a668296a436d3789991 245335: 64aab33a839f2d94934aa69fe19729e8b2257200 245327: f59222098e5968bf926de271b8669a075e28b4e6 245311: dd0ad0ee962ac309a0f0fff2f4a99397f1be4574 v: v3 --- [refs] | 2 +- trunk/drivers/base/firmware_class.c | 5 +++++ trunk/include/linux/kmod.h | 5 +++++ trunk/kernel/kmod.c | 9 +++++++++ 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 7e165883be27..92c2b68aaa35 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: e1866b33b1e89f077b7132daae3dfd9a594e9a1a +refs/heads/master: a144c6a6c924aa1da04dd77fb84b89927354fdff diff --git a/trunk/drivers/base/firmware_class.c b/trunk/drivers/base/firmware_class.c index 8c798ef7f13f..bbb03e6f7255 100644 --- a/trunk/drivers/base/firmware_class.c +++ b/trunk/drivers/base/firmware_class.c @@ -521,6 +521,11 @@ static int _request_firmware(const struct firmware **firmware_p, 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", diff --git a/trunk/include/linux/kmod.h b/trunk/include/linux/kmod.h index 6efd7a78de6a..7f3dbcb78116 100644 --- a/trunk/include/linux/kmod.h +++ b/trunk/include/linux/kmod.h @@ -111,7 +111,12 @@ call_usermodehelper(char *path, char **argv, char **envp, enum umh_wait wait) extern void usermodehelper_init(void); +#ifdef CONFIG_PM_SLEEP extern int usermodehelper_disable(void); extern void usermodehelper_enable(void); +extern bool usermodehelper_is_disabled(void); +#else +static inline bool usermodehelper_is_disabled(void) { return false; } +#endif #endif /* __LINUX_KMOD_H__ */ diff --git a/trunk/kernel/kmod.c b/trunk/kernel/kmod.c index 9cd0591c96a2..9ab513bd0c3c 100644 --- a/trunk/kernel/kmod.c +++ b/trunk/kernel/kmod.c @@ -301,6 +301,15 @@ void usermodehelper_enable(void) usermodehelper_disabled = 0; } +/** + * usermodehelper_is_disabled - check if new helpers are allowed to be started + */ +bool usermodehelper_is_disabled(void) +{ + return usermodehelper_disabled; +} +EXPORT_SYMBOL_GPL(usermodehelper_is_disabled); + static void helper_lock(void) { atomic_inc(&running_helpers);