misc/144695: race condition in mounting a root-fs on an external usb-disk

Torsten tkalix at bredex.de
Fri Mar 12 14:30:03 UTC 2010

>Number:         144695
>Category:       misc
>Synopsis:       race condition in mounting a root-fs on an external usb-disk
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Fri Mar 12 14:30:03 UTC 2010
>Originator:     Torsten
>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);
 	return (error);


More information about the freebsd-bugs mailing list