diff options
| -rw-r--r-- | sys/kern/vfs_extattr.c | 9 | ||||
| -rw-r--r-- | sys/kern/vfs_syscalls.c | 9 |
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) |
