diff options
Diffstat (limited to 'toolchain/kernel-headers/linux-2.6.21.5-006-wait-for-async-scanned-block-devices.patch')
-rw-r--r-- | toolchain/kernel-headers/linux-2.6.21.5-006-wait-for-async-scanned-block-devices.patch | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/toolchain/kernel-headers/linux-2.6.21.5-006-wait-for-async-scanned-block-devices.patch b/toolchain/kernel-headers/linux-2.6.21.5-006-wait-for-async-scanned-block-devices.patch new file mode 100644 index 000000000..910b43ad9 --- /dev/null +++ b/toolchain/kernel-headers/linux-2.6.21.5-006-wait-for-async-scanned-block-devices.patch @@ -0,0 +1,55 @@ +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; + + |