diff options
Diffstat (limited to 'kernel/kmod.c')
| -rw-r--r-- | kernel/kmod.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/kernel/kmod.c b/kernel/kmod.c index 8df97d3dfda8..2456d1a0befb 100644 --- a/kernel/kmod.c +++ b/kernel/kmod.c | |||
| @@ -42,7 +42,7 @@ extern int max_threads; | |||
| 42 | 42 | ||
| 43 | static struct workqueue_struct *khelper_wq; | 43 | static struct workqueue_struct *khelper_wq; |
| 44 | 44 | ||
| 45 | #ifdef CONFIG_KMOD | 45 | #ifdef CONFIG_MODULES |
| 46 | 46 | ||
| 47 | /* | 47 | /* |
| 48 | modprobe_path is set via /proc/sys. | 48 | modprobe_path is set via /proc/sys. |
| @@ -352,16 +352,17 @@ static inline void register_pm_notifier_callback(void) {} | |||
| 352 | * @path: path to usermode executable | 352 | * @path: path to usermode executable |
| 353 | * @argv: arg vector for process | 353 | * @argv: arg vector for process |
| 354 | * @envp: environment for process | 354 | * @envp: environment for process |
| 355 | * @gfp_mask: gfp mask for memory allocation | ||
| 355 | * | 356 | * |
| 356 | * Returns either %NULL on allocation failure, or a subprocess_info | 357 | * Returns either %NULL on allocation failure, or a subprocess_info |
| 357 | * structure. This should be passed to call_usermodehelper_exec to | 358 | * structure. This should be passed to call_usermodehelper_exec to |
| 358 | * exec the process and free the structure. | 359 | * exec the process and free the structure. |
| 359 | */ | 360 | */ |
| 360 | struct subprocess_info *call_usermodehelper_setup(char *path, | 361 | struct subprocess_info *call_usermodehelper_setup(char *path, char **argv, |
| 361 | char **argv, char **envp) | 362 | char **envp, gfp_t gfp_mask) |
| 362 | { | 363 | { |
| 363 | struct subprocess_info *sub_info; | 364 | struct subprocess_info *sub_info; |
| 364 | sub_info = kzalloc(sizeof(struct subprocess_info), GFP_ATOMIC); | 365 | sub_info = kzalloc(sizeof(struct subprocess_info), gfp_mask); |
| 365 | if (!sub_info) | 366 | if (!sub_info) |
| 366 | goto out; | 367 | goto out; |
| 367 | 368 | ||
| @@ -417,12 +418,12 @@ int call_usermodehelper_stdinpipe(struct subprocess_info *sub_info, | |||
| 417 | { | 418 | { |
| 418 | struct file *f; | 419 | struct file *f; |
| 419 | 420 | ||
| 420 | f = create_write_pipe(); | 421 | f = create_write_pipe(0); |
| 421 | if (IS_ERR(f)) | 422 | if (IS_ERR(f)) |
| 422 | return PTR_ERR(f); | 423 | return PTR_ERR(f); |
| 423 | *filp = f; | 424 | *filp = f; |
| 424 | 425 | ||
| 425 | f = create_read_pipe(f); | 426 | f = create_read_pipe(f, 0); |
| 426 | if (IS_ERR(f)) { | 427 | if (IS_ERR(f)) { |
| 427 | free_write_pipe(*filp); | 428 | free_write_pipe(*filp); |
| 428 | return PTR_ERR(f); | 429 | return PTR_ERR(f); |
| @@ -494,7 +495,7 @@ int call_usermodehelper_pipe(char *path, char **argv, char **envp, | |||
| 494 | struct subprocess_info *sub_info; | 495 | struct subprocess_info *sub_info; |
| 495 | int ret; | 496 | int ret; |
| 496 | 497 | ||
| 497 | sub_info = call_usermodehelper_setup(path, argv, envp); | 498 | sub_info = call_usermodehelper_setup(path, argv, envp, GFP_KERNEL); |
| 498 | if (sub_info == NULL) | 499 | if (sub_info == NULL) |
| 499 | return -ENOMEM; | 500 | return -ENOMEM; |
| 500 | 501 | ||
