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])
> 

Reply via email to