misc/144695: race condition in mounting a root-fs on an
yanefbsd at gmail.com
Fri Mar 12 22:20:04 UTC 2010
The following reply was made to PR kern/144695; it has been noted by GNATS.
From: Garrett Cooper <yanefbsd at gmail.com>
To: Torsten <tkalix at bredex.de>
Cc: freebsd-gnats-submit at freebsd.org
Subject: Re: misc/144695: race condition in mounting a root-fs on an external
Date: Fri, 12 Mar 2010 14:18:44 -0800
On Fri, Mar 12, 2010 at 6:27 AM, Torsten <tkalix at bredex.de> wrote:
>>Number: =A0 =A0 =A0 =A0 144695
>>Category: =A0 =A0 =A0 misc
>>Synopsis: =A0 =A0 =A0 race condition in mounting a root-fs on an external=
>>Confidential: =A0 no
>>Severity: =A0 =A0 =A0 non-critical
>>Priority: =A0 =A0 =A0 low
>>Responsible: =A0 =A0freebsd-bugs
>>State: =A0 =A0 =A0 =A0 =A0open
>>Class: =A0 =A0 =A0 =A0 =A0sw-bug
>>Submitter-Id: =A0 current-users
>>Arrival-Date: =A0 Fri Mar 12 14:30:03 UTC 2010
>>Originator: =A0 =A0 Torsten
>>Release: =A0 =A0 =A0 =A0freebsd 8.0 release
> I have installed FreeBSD 8 on my external usb-harddisk without any proble=
ms. 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 pla=
ce 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 jus=
t 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 =A0 =A0 root at unixrest:/usr/src/sys/i386/compile/BXGENERIC =A0i386
> Patch attached with submission follows:
> --- vfs_mount.c.orig =A0 =A02010-03-12 13:02:33.000000000 +0100
> +++ vfs_mount.c 2010-03-12 13:56:04.000000000 +0100
> @@ -1648,6 +1648,12 @@
> =A0 =A0 =A0 =A0options =3D NULL;
> + =A0 =A0 =A0 =A0static int mountroot_wait_delay =3D 5000;
> + =A0 =A0 =A0 =A0TUNABLE_INT_FETCH("hw.mountroot_wait_delay", &mountroot_=
> + =A0 =A0 =A0 int mysec =3D mountroot_wait_delay / hz;
> + =A0 =A0 =A0 printf("Waiting %d seconds for devices to settle.\n", mysec=
> + =A0 =A0 =A0 =A0pause("Waiting for devices to settle", mountroot_wait_de=
> =A0 =A0 =A0 =A0root_mount_prepare();
> =A0 =A0 =A0 =A0mount_zone =3D uma_zcreate("Mountpoints", sizeof(struct mo=
> @@ -2492,3 +2498,4 @@
> =A0 =A0 =A0 =A0error =3D kernel_mount(ma, flags);
> =A0 =A0 =A0 =A0return (error);
1. This was misfiled (should be under kern).
2. This is a well-known issue (devices in general not being available
by the time mount of mountroot is attempted) that isn't trivial to
3. mav@ has a more scalable solution offered here that's been
committed into CURRENT in the past couple months:
. Look for kern.cam.boot_delay.
More information about the freebsd-bugs