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
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to