Make sure we populate the initroot filesystem late enough
authorLinus Torvalds <torvalds@woody.osdl.org>
Mon, 11 Dec 2006 20:12:04 +0000 (12:12 -0800)
committerLinus Torvalds <torvalds@woody.osdl.org>
Mon, 11 Dec 2006 20:12:04 +0000 (12:12 -0800)
We should not initialize rootfs before all the core initializers have
run.  So do it as a separate stage just before starting the regular
driver initializers.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
include/asm-generic/vmlinux.lds.h
include/linux/init.h
init/initramfs.c
init/main.c

index 6e9fcebbf89f3ab9cb7a42c74933afe28c3eee72..7437ccaada77fac9f896b683c039bba801f296bb 100644 (file)
        *(.initcall4s.init)                                             \
        *(.initcall5.init)                                              \
        *(.initcall5s.init)                                             \
+       *(.initcallrootfs.init)                                         \
        *(.initcall6.init)                                              \
        *(.initcall6s.init)                                             \
        *(.initcall7.init)                                              \
index 5eb5d24b7680fea25a97b44df24424e60342658b..5a593a1dec1efd7f53ab6ac58349db9b996157d2 100644 (file)
@@ -111,6 +111,7 @@ extern void setup_arch(char **);
 #define subsys_initcall_sync(fn)       __define_initcall("4s",fn,4s)
 #define fs_initcall(fn)                        __define_initcall("5",fn,5)
 #define fs_initcall_sync(fn)           __define_initcall("5s",fn,5s)
+#define rootfs_initcall(fn)            __define_initcall("rootfs",fn,rootfs)
 #define device_initcall(fn)            __define_initcall("6",fn,6)
 #define device_initcall_sync(fn)       __define_initcall("6s",fn,6s)
 #define late_initcall(fn)              __define_initcall("7",fn,7)
index 85f04037ade137c6ce452f3183db87527f80e6cf..4fa0f7977de1a16db501d91c3c9b062cb7898c2d 100644 (file)
@@ -526,7 +526,7 @@ static void __init free_initrd(void)
 
 #endif
 
-void __init populate_rootfs(void)
+static int __init populate_rootfs(void)
 {
        char *err = unpack_to_rootfs(__initramfs_start,
                         __initramfs_end - __initramfs_start, 0);
@@ -544,7 +544,7 @@ void __init populate_rootfs(void)
                        unpack_to_rootfs((char *)initrd_start,
                                initrd_end - initrd_start, 0);
                        free_initrd();
-                       return;
+                       return 0;
                }
                printk("it isn't (%s); looks like an initrd\n", err);
                fd = sys_open("/initrd.image", O_WRONLY|O_CREAT, 0700);
@@ -565,4 +565,6 @@ void __init populate_rootfs(void)
 #endif
        }
 #endif
+       return 0;
 }
+rootfs_initcall(populate_rootfs);
index fcd9ddc3ccf5c02e15f7169b2264c9604b52eac1..e3f0bb20b4ddffc0e82181f48ef42e3953df4fdd 100644 (file)
@@ -94,7 +94,6 @@ extern void pidmap_init(void);
 extern void prio_tree_init(void);
 extern void radix_tree_init(void);
 extern void free_initmem(void);
-extern void populate_rootfs(void);
 extern void driver_init(void);
 extern void prepare_namespace(void);
 #ifdef CONFIG_ACPI
@@ -745,12 +744,6 @@ static int init(void * unused)
 
        cpuset_init_smp();
 
-       /*
-        * Do this before initcalls, because some drivers want to access
-        * firmware files.
-        */
-       populate_rootfs();
-
        do_basic_setup();
 
        /*