Doesn't this suggest a disk driver failed to perform/complete a write? Not right at that moment but perhaps in the recent past?
Yuichiro NAITO <[email protected]> wrote: > bsd.upgrade fails and shows following messages with a single partition disk. > > ``` > Force checking of clean non-root filesystems? [no] no > umount: /mnt: Device busy > Can't umount sd0a! > ``` > > sd0 has following partitions. > > ``` > # size offset fstype [fsize bsize cpg] > a: 37752672 64 4.2bsd 2048 16384 12959 # / > b: 4176900 37752750 swap # none > c: 41943040 0 unused > ``` > > I don't want to say any thing about disk partitioning policy. > I just want to improve bsd.upgrade more stable. > > This error happens in a specific environment. > In my cases, OpenBSD on FreeBSD bhyve in Intel Core i7-6700 box caused > this error. No other environments (that I have) reproduce it. > > In my investigation, the following patch caused panic in the bhyve > environment. > > diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c > index 43a7cbd4ae9..4f4176a77ac 100644 > --- a/sys/kern/vfs_subr.c > +++ b/sys/kern/vfs_subr.c > @@ -966,6 +966,7 @@ vflush_vnode(struct vnode *vp, void *arg) > vprint("vflush: busy vnode", vp); > #endif > va->busy++; > + panic("vflush_vnode: mark busy"); > return (0); > } > > I think some vnodes are still remaining while `umount /mnt`. > So, the kernel returns EBUSY. > It's right to kernel behavior and user land should handle this case. > > Doing `umount /mnt` just after `fsck -p` in disrib/miniroot/install.sub. > > ``` > 3264 # Create a skeletal /etc/fstab which is usable for the upgrade process. > 3265 munge_fstab > 3266 > 3267 # fsck -p non-root filesystems in /etc/fstab. > 3268 check_fs > 3269 > 3270 # Mount filesystems in /etc/fstab. > 3272 umount /mnt || { echo "Can't umount $ROOTDEV!"; exit; } > 3273 mount_fs > ``` > > Is it necessary that /mnt is mounted while `check_fs` function? > The target disk information is already read from /mnt/etc/fstab in > `munge_fstab` function. `check_fs` uses the merged fstab in /tmp. > > Just `umount /mnt` before `check_fs` can get avoid this error. > Is the following patch OK? > > ``` > diff --git a/distrib/miniroot/install.sub b/distrib/miniroot/install.sub > old mode 100644 > new mode 100755 > index 16d3b6e3420..cf7e15c9754 > --- a/distrib/miniroot/install.sub > +++ b/distrib/miniroot/install.sub > @@ -3243,11 +3243,12 @@ do_upgrade() { > # Create a skeletal /etc/fstab which is usable for the upgrade process. > munge_fstab > > + umount /mnt || { echo "Can't umount $ROOTDEV!"; exit; } > + > # fsck -p non-root filesystems in /etc/fstab. > check_fs > > # Mount filesystems in /etc/fstab. > - umount /mnt || { echo "Can't umount $ROOTDEV!"; exit; } > mount_fs > > rm -f /mnt/bsd.upgrade /mnt/auto_upgrade.conf > ``` > > -- > Yuichiro NAITO ([email protected]) >
