| diff --git a/init/do_mounts.c b/init/do_mounts.c |
| index 46fe407..efc134c 100644 |
| --- a/init/do_mounts.c |
| +++ b/init/do_mounts.c |
| @@ -25,6 +25,7 @@ int __initdata rd_doload; /* 1 = load RAM disk, 0 = don't load */ |
| int root_mountflags = MS_RDONLY | MS_SILENT; |
| char * __initdata root_device_name; |
| static char __initdata saved_root_name[64]; |
| +int __initdata root_wait; |
| |
| dev_t ROOT_DEV; |
| |
| @@ -216,6 +217,14 @@ static int __init root_dev_setup(char *line) |
| |
| __setup("root=", root_dev_setup); |
| |
| +static int __init rootwait_setup(char *line) |
| +{ |
| + root_wait = simple_strtol(line,NULL,0); |
| + return 1; |
| +} |
| + |
| +__setup("rootwait=", rootwait_setup); |
| + |
| static char * __initdata root_mount_data; |
| static int __init root_data_setup(char *str) |
| { |
| @@ -438,11 +447,24 @@ void __init prepare_namespace(void) |
| root_device_name += 5; |
| } |
| |
| - is_floppy = MAJOR(ROOT_DEV) == FLOPPY_MAJOR; |
| - |
| if (initrd_load()) |
| goto out; |
| |
| + /* wait for any asynchronous scanning to complete */ |
| + if ((ROOT_DEV == 0) && root_wait) { |
| + printk(KERN_INFO "Waiting for root device %s...\n", |
| + saved_root_name); |
| + do { |
| + while (driver_probe_done() != 0) |
| + msleep(100); |
| + ROOT_DEV = name_to_dev_t(saved_root_name); |
| + if (ROOT_DEV == 0) |
| + msleep(100); |
| + } while (ROOT_DEV == 0); |
| + } |
| + |
| + is_floppy = MAJOR(ROOT_DEV) == FLOPPY_MAJOR; |
| + |
| if (is_floppy && rd_doload && rd_load_disk(0)) |
| ROOT_DEV = Root_RAM0; |
| |
| |