Make sure we populate the initroot filesystem late enough

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>
This commit is contained in:
Linus Torvalds 2006-12-11 12:12:04 -08:00
parent 8993780a6e
commit 8d610dd52d
4 changed files with 6 additions and 9 deletions

View File

@ -242,6 +242,7 @@
*(.initcall4s.init) \ *(.initcall4s.init) \
*(.initcall5.init) \ *(.initcall5.init) \
*(.initcall5s.init) \ *(.initcall5s.init) \
*(.initcallrootfs.init) \
*(.initcall6.init) \ *(.initcall6.init) \
*(.initcall6s.init) \ *(.initcall6s.init) \
*(.initcall7.init) \ *(.initcall7.init) \

View File

@ -111,6 +111,7 @@ extern void setup_arch(char **);
#define subsys_initcall_sync(fn) __define_initcall("4s",fn,4s) #define subsys_initcall_sync(fn) __define_initcall("4s",fn,4s)
#define fs_initcall(fn) __define_initcall("5",fn,5) #define fs_initcall(fn) __define_initcall("5",fn,5)
#define fs_initcall_sync(fn) __define_initcall("5s",fn,5s) #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(fn) __define_initcall("6",fn,6)
#define device_initcall_sync(fn) __define_initcall("6s",fn,6s) #define device_initcall_sync(fn) __define_initcall("6s",fn,6s)
#define late_initcall(fn) __define_initcall("7",fn,7) #define late_initcall(fn) __define_initcall("7",fn,7)

View File

@ -526,7 +526,7 @@ static void __init free_initrd(void)
#endif #endif
void __init populate_rootfs(void) static int __init populate_rootfs(void)
{ {
char *err = unpack_to_rootfs(__initramfs_start, char *err = unpack_to_rootfs(__initramfs_start,
__initramfs_end - __initramfs_start, 0); __initramfs_end - __initramfs_start, 0);
@ -544,7 +544,7 @@ void __init populate_rootfs(void)
unpack_to_rootfs((char *)initrd_start, unpack_to_rootfs((char *)initrd_start,
initrd_end - initrd_start, 0); initrd_end - initrd_start, 0);
free_initrd(); free_initrd();
return; return 0;
} }
printk("it isn't (%s); looks like an initrd\n", err); printk("it isn't (%s); looks like an initrd\n", err);
fd = sys_open("/initrd.image", O_WRONLY|O_CREAT, 0700); fd = sys_open("/initrd.image", O_WRONLY|O_CREAT, 0700);
@ -565,4 +565,6 @@ void __init populate_rootfs(void)
#endif #endif
} }
#endif #endif
return 0;
} }
rootfs_initcall(populate_rootfs);

View File

@ -94,7 +94,6 @@ extern void pidmap_init(void);
extern void prio_tree_init(void); extern void prio_tree_init(void);
extern void radix_tree_init(void); extern void radix_tree_init(void);
extern void free_initmem(void); extern void free_initmem(void);
extern void populate_rootfs(void);
extern void driver_init(void); extern void driver_init(void);
extern void prepare_namespace(void); extern void prepare_namespace(void);
#ifdef CONFIG_ACPI #ifdef CONFIG_ACPI
@ -745,12 +744,6 @@ static int init(void * unused)
cpuset_init_smp(); cpuset_init_smp();
/*
* Do this before initcalls, because some drivers want to access
* firmware files.
*/
populate_rootfs();
do_basic_setup(); do_basic_setup();
/* /*