diff options
Diffstat (limited to 'kernel/kmod.c')
-rw-r--r-- | kernel/kmod.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/kernel/kmod.c b/kernel/kmod.c index f0c8f545180d..7e95bedb2bfc 100644 --- a/kernel/kmod.c +++ b/kernel/kmod.c | |||
@@ -50,7 +50,8 @@ static struct workqueue_struct *khelper_wq; | |||
50 | char modprobe_path[KMOD_PATH_LEN] = "/sbin/modprobe"; | 50 | char modprobe_path[KMOD_PATH_LEN] = "/sbin/modprobe"; |
51 | 51 | ||
52 | /** | 52 | /** |
53 | * request_module - try to load a kernel module | 53 | * __request_module - try to load a kernel module |
54 | * @wait: wait (or not) for the operation to complete | ||
54 | * @fmt: printf style format string for the name of the module | 55 | * @fmt: printf style format string for the name of the module |
55 | * @...: arguments as specified in the format string | 56 | * @...: arguments as specified in the format string |
56 | * | 57 | * |
@@ -63,7 +64,7 @@ char modprobe_path[KMOD_PATH_LEN] = "/sbin/modprobe"; | |||
63 | * If module auto-loading support is disabled then this function | 64 | * If module auto-loading support is disabled then this function |
64 | * becomes a no-operation. | 65 | * becomes a no-operation. |
65 | */ | 66 | */ |
66 | int request_module(const char *fmt, ...) | 67 | int __request_module(bool wait, const char *fmt, ...) |
67 | { | 68 | { |
68 | va_list args; | 69 | va_list args; |
69 | char module_name[MODULE_NAME_LEN]; | 70 | char module_name[MODULE_NAME_LEN]; |
@@ -108,11 +109,12 @@ int request_module(const char *fmt, ...) | |||
108 | return -ENOMEM; | 109 | return -ENOMEM; |
109 | } | 110 | } |
110 | 111 | ||
111 | ret = call_usermodehelper(modprobe_path, argv, envp, 1); | 112 | ret = call_usermodehelper(modprobe_path, argv, envp, |
113 | wait ? UMH_WAIT_PROC : UMH_WAIT_EXEC); | ||
112 | atomic_dec(&kmod_concurrent); | 114 | atomic_dec(&kmod_concurrent); |
113 | return ret; | 115 | return ret; |
114 | } | 116 | } |
115 | EXPORT_SYMBOL(request_module); | 117 | EXPORT_SYMBOL(__request_module); |
116 | #endif /* CONFIG_MODULES */ | 118 | #endif /* CONFIG_MODULES */ |
117 | 119 | ||
118 | struct subprocess_info { | 120 | struct subprocess_info { |
@@ -368,8 +370,10 @@ struct subprocess_info *call_usermodehelper_setup(char *path, char **argv, | |||
368 | sub_info->argv = argv; | 370 | sub_info->argv = argv; |
369 | sub_info->envp = envp; | 371 | sub_info->envp = envp; |
370 | sub_info->cred = prepare_usermodehelper_creds(); | 372 | sub_info->cred = prepare_usermodehelper_creds(); |
371 | if (!sub_info->cred) | 373 | if (!sub_info->cred) { |
374 | kfree(sub_info); | ||
372 | return NULL; | 375 | return NULL; |
376 | } | ||
373 | 377 | ||
374 | out: | 378 | out: |
375 | return sub_info; | 379 | return sub_info; |