kern/144824: [boot] [patch] boot problem on USB (root partition
mounting)
Daniel Hartmeier
daniel at benzedrine.cx
Fri Jul 16 11:30:08 UTC 2010
The following reply was made to PR kern/144824; it has been noted by GNATS.
From: Daniel Hartmeier <daniel at benzedrine.cx>
To: bug-followup at FreeBSD.org
Cc: gblanc at linagora.com
Subject: Re: kern/144824: [boot] [patch] boot problem on USB (root partition mounting)
Date: Fri, 16 Jul 2010 12:56:05 +0200
You have to move the ma initialization inside the retry loop,
because kernel_mount() frees it, otherwise I get a kernel panic.
With that changed, the patch solves the issue with an Intel
S5000PAL board booting from USB, where da0 attaches slightly
too late. Possibly related to the RMM2 (remote management
module), which attaches multiple (virtual) CD-ROM drives to
USB, which produce CAM/SCSI status errors.
Daniel
--- vfs_mount.c 30 Jan 2010 12:11:21 -0000 1.312.2.3
+++ vfs_mount.c 16 Jul 2010 10:38:46 -0000
@@ -1798,6 +1798,8 @@
int error;
char patt[32];
char errmsg[255];
+ char nbtry;
+ int rootmounttrymax;
vfsname = NULL;
path = NULL;
@@ -1805,6 +1807,8 @@
ma = NULL;
error = EINVAL;
bzero(errmsg, sizeof(errmsg));
+ nbtry = 0;
+ rootmounttrymax = 3;
if (mountfrom == NULL)
return (error); /* don't complain */
@@ -1821,13 +1825,23 @@
if (path[0] == '\0')
strcpy(path, ROOTNAME);
- ma = mount_arg(ma, "fstype", vfsname, -1);
- ma = mount_arg(ma, "fspath", "/", -1);
- ma = mount_arg(ma, "from", path, -1);
- ma = mount_arg(ma, "errmsg", errmsg, sizeof(errmsg));
- ma = mount_arg(ma, "ro", NULL, 0);
- ma = parse_mountroot_options(ma, options);
- error = kernel_mount(ma, MNT_ROOTFS);
+ while (1) {
+ ma = NULL;
+ ma = mount_arg(ma, "fstype", vfsname, -1);
+ ma = mount_arg(ma, "fspath", "/", -1);
+ ma = mount_arg(ma, "from", path, -1);
+ ma = mount_arg(ma, "errmsg", errmsg, sizeof(errmsg));
+ ma = mount_arg(ma, "ro", NULL, 0);
+ ma = parse_mountroot_options(ma, options);
+ error = kernel_mount(ma, MNT_ROOTFS);
+ if (nbtry < rootmounttrymax && error != 0) {
+ printf("Mount failed, retrying mount root from %s\n",
+ mountfrom);
+ tsleep(&rootmounttrymax, PZERO | PDROP, "mount", hz);
+ nbtry++;
+ } else
+ break;
+ }
if (error == 0) {
/*
More information about the freebsd-bugs
mailing list