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
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Fri Mar 12 14:30:03 UTC 2010
>Closed-Date:
>Last-Modified:
>Originator: Torsten
>Release: freebsd 8.0 release
>Organization:
n/a
>Environment:
>Description:
Hello!
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.
>How-To-Repeat:
>Fix:
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);
+
root_mount_prepare();
mount_zone = uma_zcreate("Mountpoints", sizeof(struct mount),
@@ -2492,3 +2498,4 @@
error = kernel_mount(ma, flags);
return (error);
}
+
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list