nullfs: fix unmounts when filesystem is active.

If vflush() did not completely flushed the mount vnodes queue, either
retry for forced unmounts, or give up for non-forced.  This situation
can occur when new vnodes are instantiated while vflush() worked.

Reported and tested by:	pho
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
This commit is contained in:
Konstantin Belousov 2019-03-21 13:30:48 +00:00
parent 8b0f6c4215
commit 7ae3486e6d
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=345376

View file

@ -235,7 +235,7 @@ nullfs_unmount(mp, mntflags)
{
struct null_mount *mntdata;
struct mount *ump;
int error, flags;
int error, flags, rootrefs;
NULLFSDEBUG("nullfs_unmount: mp = %p\n", (void *)mp);
@ -244,10 +244,20 @@ nullfs_unmount(mp, mntflags)
else
flags = 0;
/* There is 1 extra root vnode reference (nullm_rootvp). */
error = vflush(mp, 1, flags, curthread);
if (error)
return (error);
for (rootrefs = 1;; rootrefs = 0) {
/* There is 1 extra root vnode reference (nullm_rootvp). */
error = vflush(mp, rootrefs, flags, curthread);
if (error)
return (error);
MNT_ILOCK(mp);
if (mp->mnt_nvnodelistsize == 0) {
MNT_IUNLOCK(mp);
break;
}
MNT_IUNLOCK(mp);
if ((mntflags & MNT_FORCE) == 0)
return (EBUSY);
}
/*
* Finally, throw away the null_mount structure