Patchwork [1/1] UBUNTU: SAUCE: ensure root is ready before running usermodehelpers in it

login
register
mail settings
Submitter Andy Whitcroft
Date Jan. 10, 2011, 6:06 p.m.
Message ID <1294682810-4520-2-git-send-email-apw@canonical.com>
Download mbox | patch
Permalink /patch/78185/
State Accepted
Delegated to: Brad Figg
Headers show

Comments

Andy Whitcroft - Jan. 10, 2011, 6:06 p.m.
Signed-off-by: Andy Whitcroft <apw@canonical.com>
---
 include/linux/init.h |    2 --
 include/linux/kmod.h |    4 ++++
 init/initramfs.c     |    6 ++++++
 init/main.c          |    2 +-
 4 files changed, 11 insertions(+), 3 deletions(-)
Stefan Bader - Jan. 10, 2011, 6:47 p.m.
The contents seem to be reasonable. Only I probably would like a bit more
verbosity of explanation in the commit message. It reads a bit like only having
the sob in...

Otherwise
Acked-by: Stefan Bader <stefan.bader@canonical.com>

On 01/10/2011 12:06 PM, Andy Whitcroft wrote:
> Signed-off-by: Andy Whitcroft <apw@canonical.com>
> ---
>  include/linux/init.h |    2 --
>  include/linux/kmod.h |    4 ++++
>  init/initramfs.c     |    6 ++++++
>  init/main.c          |    2 +-
>  4 files changed, 11 insertions(+), 3 deletions(-)
> 
> diff --git a/include/linux/init.h b/include/linux/init.h
> index f3fbb95..f37d7c6 100644
> --- a/include/linux/init.h
> +++ b/include/linux/init.h
> @@ -216,8 +216,6 @@ extern int 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 6efd7a7..989fa3b 100644
> --- a/include/linux/kmod.h
> +++ b/include/linux/kmod.h
> @@ -83,6 +83,8 @@ int call_usermodehelper_exec(struct subprocess_info *info, enum umh_wait wait);
>     to call call_usermodehelper_exec */
>  void call_usermodehelper_freeinfo(struct subprocess_info *info);
>  
> +extern void populate_rootfs_wait(void);
> +
>  static inline int
>  call_usermodehelper_fns(char *path, char **argv, char **envp,
>  			enum umh_wait wait,
> @@ -92,6 +94,8 @@ call_usermodehelper_fns(char *path, char **argv, char **envp,
>  	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)
> diff --git a/init/initramfs.c b/init/initramfs.c
> index 8fed7ea..e7a4ef0 100644
> --- a/init/initramfs.c
> +++ b/init/initramfs.c
> @@ -571,6 +571,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,
> diff --git a/init/main.c b/init/main.c
> index 3fe1a78..605735c 100644
> --- a/init/main.c
> +++ b/init/main.c
> @@ -930,7 +930,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

Patch

diff --git a/include/linux/init.h b/include/linux/init.h
index f3fbb95..f37d7c6 100644
--- a/include/linux/init.h
+++ b/include/linux/init.h
@@ -216,8 +216,6 @@  extern int 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 6efd7a7..989fa3b 100644
--- a/include/linux/kmod.h
+++ b/include/linux/kmod.h
@@ -83,6 +83,8 @@  int call_usermodehelper_exec(struct subprocess_info *info, enum umh_wait wait);
    to call call_usermodehelper_exec */
 void call_usermodehelper_freeinfo(struct subprocess_info *info);
 
+extern void populate_rootfs_wait(void);
+
 static inline int
 call_usermodehelper_fns(char *path, char **argv, char **envp,
 			enum umh_wait wait,
@@ -92,6 +94,8 @@  call_usermodehelper_fns(char *path, char **argv, char **envp,
 	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)
diff --git a/init/initramfs.c b/init/initramfs.c
index 8fed7ea..e7a4ef0 100644
--- a/init/initramfs.c
+++ b/init/initramfs.c
@@ -571,6 +571,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,
diff --git a/init/main.c b/init/main.c
index 3fe1a78..605735c 100644
--- a/init/main.c
+++ b/init/main.c
@@ -930,7 +930,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