[RFC][PATCH] Make prepare_namespace() wait for devices

From: Pierre Ossman
Date: Mon May 14 2007 - 08:20:36 EST


Testing and/or comments welcome.

--
-- Pierre Ossman

Linux kernel, MMC maintainer http://www.kernel.org
PulseAudio, core developer http://pulseaudio.org
rdesktop, core developer http://www.rdesktop.org
commit 7c542a5a027caa95bb00f8a8223c7e4aef88c931
Author: Pierre Ossman <drzeus@xxxxxxxxx>
Date: Mon May 14 14:15:46 2007 +0200

init: wait for asynchronously scanned block devices

Some buses (e.g. USB and MMC) do their scanning of devices in the
background, causing a race between them and prepare_namespace().
In order to be able to use these buses without an initrd, we now
wait for the device specified in root= to actually show up.

If the device never shows up than we will hang in an infinite loop.
Previously we panic:ed instead, so this behaviour should be no
worse.

Signed-off-by: Pierre Ossman <drzeus@xxxxxxxxx>

diff --git a/init/do_mounts.c b/init/do_mounts.c
index 46fe407..192b2d6 100644
--- a/init/do_mounts.c
+++ b/init/do_mounts.c
@@ -438,11 +438,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) {
+ printk("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;