diff options
author | Andy Whitcroft <apw@canonical.com> | 2011-01-06 18:42:23 +0000 |
---|---|---|
committer | John Rigby <john.rigby@linaro.org> | 2012-06-21 03:26:22 -0600 |
commit | 0522d5f0b231c8f4b0e71fae7c570b62646cff60 (patch) | |
tree | 5a72e7dfc8f36d45ae1684c732e3fbb62492801e | |
parent | 10b0120a4377da16ac8fd8b755272a8ec99e0c0d (diff) |
UBUNTU: SAUCE: ensure root is ready before running usermodehelpers in it
Signed-off-by: Andy Whitcroft <apw@canonical.com>
-rw-r--r-- | include/linux/init.h | 2 | ||||
-rw-r--r-- | include/linux/kmod.h | 2 | ||||
-rw-r--r-- | init/initramfs.c | 7 | ||||
-rw-r--r-- | init/main.c | 2 | ||||
-rw-r--r-- | kernel/kmod.c | 2 |
5 files changed, 12 insertions, 3 deletions
diff --git a/include/linux/init.h b/include/linux/init.h index ad021e87d5a..bc7379f6625 100644 --- a/include/linux/init.h +++ b/include/linux/init.h @@ -224,8 +224,6 @@ extern bool initcall_debug; static initcall_t __initcall_##fn \ __used __section(.security_initcall.init) = fn -extern struct list_head populate_rootfs_domain; - struct obs_kernel_param { const char *str; int (*setup_func)(char *); diff --git a/include/linux/kmod.h b/include/linux/kmod.h index 5398d580707..6f571b1be39 100644 --- a/include/linux/kmod.h +++ b/include/linux/kmod.h @@ -71,6 +71,8 @@ call_usermodehelper_fns(char *path, char **argv, char **envp, int wait, int (*init)(struct subprocess_info *info, struct cred *new), void (*cleanup)(struct subprocess_info *), void *data); +void populate_rootfs_wait(void); + static inline int call_usermodehelper(char *path, char **argv, char **envp, int wait) { diff --git a/init/initramfs.c b/init/initramfs.c index 1ae8873570c..c5a41234666 100644 --- a/init/initramfs.c +++ b/init/initramfs.c @@ -19,6 +19,7 @@ #include <linux/syscalls.h> #include <linux/utime.h> #include <linux/async.h> +#include <linux/export.h> static __initdata char *message; static void __init error(char *x) @@ -582,6 +583,12 @@ static void __init clean_rootfs(void) LIST_HEAD(populate_rootfs_domain); +void populate_rootfs_wait(void) +{ + async_synchronize_full_domain(&populate_rootfs_domain); +} +EXPORT_SYMBOL(populate_rootfs_wait); + static void __init async_populate_rootfs(void) { char *err = unpack_to_rootfs(__initramfs_start, __initramfs_size); diff --git a/init/main.c b/init/main.c index 1118f3a159f..c5667ec14e9 100644 --- a/init/main.c +++ b/init/main.c @@ -893,7 +893,7 @@ static int __init kernel_init(void * unused) * We need to ensure that the filesystem is ready by this point, wait for * async_populate_rootfs to complete. */ - async_synchronize_full_domain(&populate_rootfs_domain); + populate_rootfs_wait(); /* * check if there is an early userspace init. If yes, let it do all diff --git a/kernel/kmod.c b/kernel/kmod.c index ff2c7cb86d7..9d1b6b26dd9 100644 --- a/kernel/kmod.c +++ b/kernel/kmod.c @@ -585,6 +585,8 @@ int call_usermodehelper_fns( struct subprocess_info *info; gfp_t gfp_mask = (wait == UMH_NO_WAIT) ? GFP_ATOMIC : GFP_KERNEL; + populate_rootfs_wait(); + info = call_usermodehelper_setup(path, argv, envp, gfp_mask); if (info == NULL) |