>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     r...@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:
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-bugs
To unsubscribe, send any mail to "[email protected]"

Reply via email to