svn commit: r345376 - head/sys/fs/nullfs
Konstantin Belousov
kib at FreeBSD.org
Thu Mar 21 13:30:49 UTC 2019
Author: kib
Date: Thu Mar 21 13:30:48 2019
New Revision: 345376
URL: https://svnweb.freebsd.org/changeset/base/345376
Log:
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
Modified:
head/sys/fs/nullfs/null_vfsops.c
Modified: head/sys/fs/nullfs/null_vfsops.c
==============================================================================
--- head/sys/fs/nullfs/null_vfsops.c Thu Mar 21 11:32:52 2019 (r345375)
+++ head/sys/fs/nullfs/null_vfsops.c Thu Mar 21 13:30:48 2019 (r345376)
@@ -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
More information about the svn-src-all
mailing list