diff options
author | Artur Grabowski <art@cvs.openbsd.org> | 1999-12-06 07:28:07 +0000 |
---|---|---|
committer | Artur Grabowski <art@cvs.openbsd.org> | 1999-12-06 07:28:07 +0000 |
commit | f23efc1cde668047135c6183f3ebc9b35337666e (patch) | |
tree | 3871a64a14f3d343483af12d23b116564591aaca /sys/kern/vfs_syscalls.c | |
parent | b06f4c02a6583aef15b521f3457134bb302b987b (diff) |
Yet another solution to the mfs unmount/kill race (not ugly this time).
Require that the mount point is vfs_busy on entry to dounmount.
Diffstat (limited to 'sys/kern/vfs_syscalls.c')
-rw-r--r-- | sys/kern/vfs_syscalls.c | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index ff4864b0345..50bb7cba61c 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vfs_syscalls.c,v 1.59 1999/07/30 18:27:47 deraadt Exp $ */ +/* $OpenBSD: vfs_syscalls.c,v 1.60 1999/12/06 07:28:06 art Exp $ */ /* $NetBSD: vfs_syscalls.c,v 1.71 1996/04/23 10:29:02 mycroft Exp $ */ /* @@ -412,6 +412,10 @@ sys_unmount(p, v, retval) return (EINVAL); } vput(vp); + + if (vfs_busy(mp, 0, NULL, p)) + return (EBUSY); + return (dounmount(mp, SCARG(uap, flags), p)); } @@ -428,13 +432,8 @@ dounmount(mp, flags, p) int error; simple_lock(&mountlist_slock); - if (mp->mnt_flag & MNT_UNMOUNT) { - mp->mnt_flag |= MNT_MWAIT; - simple_unlock(&mountlist_slock); - sleep(mp, PVFS); - return ENOENT; - } mp->mnt_flag |= MNT_UNMOUNT; + vfs_unbusy(mp, p); lockmgr(&mp->mnt_lock, LK_DRAIN | LK_INTERLOCK, &mountlist_slock, p); mp->mnt_flag &=~ MNT_ASYNC; #if !defined(UVM) |