aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/fs/nullfs/null_vfsops.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/sys/fs/nullfs/null_vfsops.c b/sys/fs/nullfs/null_vfsops.c
index fdb5e9e7e7e0..361a878687d3 100644
--- a/sys/fs/nullfs/null_vfsops.c
+++ b/sys/fs/nullfs/null_vfsops.c
@@ -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