summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/kern/vfs_extattr.c9
-rw-r--r--sys/kern/vfs_syscalls.c9
2 files changed, 16 insertions, 2 deletions
diff --git a/sys/kern/vfs_extattr.c b/sys/kern/vfs_extattr.c
index a54c81ab9fd7..fced0d76b5a8 100644
--- a/sys/kern/vfs_extattr.c
+++ b/sys/kern/vfs_extattr.c
@@ -553,7 +553,14 @@ dounmount(mp, flags, td)
mtx_lock(&mountlist_mtx);
mp->mnt_kern_flag |= MNTK_UNMOUNT;
- lockmgr(&mp->mnt_lock, LK_DRAIN | LK_INTERLOCK, &mountlist_mtx, td);
+ error = lockmgr(&mp->mnt_lock, LK_DRAIN | LK_INTERLOCK |
+ ((flags & MNT_FORCE) ? 0 : LK_NOWAIT), &mountlist_mtx, td);
+ if (error) {
+ mp->mnt_kern_flag &= ~MNTK_UNMOUNT;
+ if (mp->mnt_kern_flag & MNTK_MWAIT)
+ wakeup((caddr_t)mp);
+ return (error);
+ }
vn_start_write(NULL, &mp, V_WAIT);
if (mp->mnt_flag & MNT_EXPUBLIC)
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index a54c81ab9fd7..fced0d76b5a8 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.c
@@ -553,7 +553,14 @@ dounmount(mp, flags, td)
mtx_lock(&mountlist_mtx);
mp->mnt_kern_flag |= MNTK_UNMOUNT;
- lockmgr(&mp->mnt_lock, LK_DRAIN | LK_INTERLOCK, &mountlist_mtx, td);
+ error = lockmgr(&mp->mnt_lock, LK_DRAIN | LK_INTERLOCK |
+ ((flags & MNT_FORCE) ? 0 : LK_NOWAIT), &mountlist_mtx, td);
+ if (error) {
+ mp->mnt_kern_flag &= ~MNTK_UNMOUNT;
+ if (mp->mnt_kern_flag & MNTK_MWAIT)
+ wakeup((caddr_t)mp);
+ return (error);
+ }
vn_start_write(NULL, &mp, V_WAIT);
if (mp->mnt_flag & MNT_EXPUBLIC)