diff options
author | jhb <jhb@FreeBSD.org> | 2000-12-01 03:43:33 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2000-12-01 03:43:33 +0000 |
commit | c91f8bd1fb2414d034600b374cbf8f241621b7f8 (patch) | |
tree | 7a307002e642f3e886b4d754db23bbba7daf3fdb /sys/kern/vfs_export.c | |
parent | 83d14553fcd8bd25049ae5b34b34acc66963e1a0 (diff) | |
download | FreeBSD-src-c91f8bd1fb2414d034600b374cbf8f241621b7f8.zip FreeBSD-src-c91f8bd1fb2414d034600b374cbf8f241621b7f8.tar.gz |
Use msleep() instead of mtx_exit()/tsleep() so that we release the lock and
go to sleep as an "atomic" operation.
Diffstat (limited to 'sys/kern/vfs_export.c')
-rw-r--r-- | sys/kern/vfs_export.c | 20 |
1 files changed, 7 insertions, 13 deletions
diff --git a/sys/kern/vfs_export.c b/sys/kern/vfs_export.c index e6fa0d7..cf6029a 100644 --- a/sys/kern/vfs_export.c +++ b/sys/kern/vfs_export.c @@ -281,19 +281,13 @@ vfs_busy(mp, flags, interlkp, p) if (flags & LK_NOWAIT) return (ENOENT); mp->mnt_kern_flag |= MNTK_MWAIT; - if (interlkp) { - mtx_exit(interlkp, MTX_DEF); - } /* * Since all busy locks are shared except the exclusive * lock granted when unmounting, the only place that a * wakeup needs to be done is at the release of the * exclusive lock at the end of dounmount. */ - tsleep((caddr_t)mp, PVFS, "vfs_busy", 0); - if (interlkp) { - mtx_enter(interlkp, MTX_DEF); - } + msleep((caddr_t)mp, interlkp, PVFS, "vfs_busy", 0); return (ENOENT); } lkflags = LK_SHARED | LK_NOPAUSE; @@ -1442,8 +1436,8 @@ vget(vp, flags, p) printf("VXLOCK interlock avoided\n"); } else { vp->v_flag |= VXWANT; - mtx_exit(&vp->v_interlock, MTX_DEF); - tsleep((caddr_t)vp, PINOD, "vget", 0); + msleep((caddr_t)vp, &vp->v_interlock, PINOD | PDROP, + "vget", 0); return (ENOENT); } } @@ -1842,8 +1836,8 @@ vop_revoke(ap) */ if (vp->v_flag & VXLOCK) { vp->v_flag |= VXWANT; - mtx_exit(&vp->v_interlock, MTX_DEF); - tsleep((caddr_t)vp, PINOD, "vop_revokeall", 0); + msleep((caddr_t)vp, &vp->v_interlock, PINOD | PDROP, + "vop_revokeall", 0); return (0); } dev = vp->v_rdev; @@ -1911,8 +1905,8 @@ vgonel(vp, p) */ if (vp->v_flag & VXLOCK) { vp->v_flag |= VXWANT; - mtx_exit(&vp->v_interlock, MTX_DEF); - tsleep((caddr_t)vp, PINOD, "vgone", 0); + msleep((caddr_t)vp, &vp->v_interlock, PINOD | PDROP, + "vgone", 0); return; } |