misc/144695: race condition in mounting a root-fs on an external
tkalix at bredex.de
Fri Mar 12 14:30:03 UTC 2010
>Synopsis: race condition in mounting a root-fs on an external usb-disk
>Arrival-Date: Fri Mar 12 14:30:03 UTC 2010
>Release: freebsd 8.0 release
I have installed FreeBSD 8 on my external usb-harddisk without any problems. Just I cannot boot into it, but I always receive a mountroot-prompt.
Reading the news / archives I found a problem in the mountroot taking place too early -- before all of the usb-probe and device-setup is fully done.
There was (?) no really solution available, so I have made a small change that caused everything to work -- but one may see this more a work-around than rather a real fix.
The main idea is to put in an un-conditional wait at the beginning of vfs_mountroot. And, of course make this configurable. The acutal change is just a few lines that should not harm anything else.
For my system I have started with the default of 5000ms, but I needed to go to 15000ms to mount my root-fs safely.
Please find attached the source-diff.
FreeBSD unixrest 8.0-RELEASE FreeBSD 8.0-RELEASE #0: Fri Mar 12 14:02:27 CET 2010 root at unixrest:/usr/src/sys/i386/compile/BXGENERIC i386
Patch attached with submission follows:
--- vfs_mount.c.orig 2010-03-12 13:02:33.000000000 +0100
+++ vfs_mount.c 2010-03-12 13:56:04.000000000 +0100
@@ -1648,6 +1648,12 @@
options = NULL;
+ static int mountroot_wait_delay = 5000;
+ TUNABLE_INT_FETCH("hw.mountroot_wait_delay", &mountroot_wait_delay);
+ int mysec = mountroot_wait_delay / hz;
+ printf("Waiting %d seconds for devices to settle.\n", mysec);
+ pause("Waiting for devices to settle", mountroot_wait_delay);
mount_zone = uma_zcreate("Mountpoints", sizeof(struct mount),
@@ -2492,3 +2498,4 @@
error = kernel_mount(ma, flags);
More information about the freebsd-bugs