diff options
author | phk <phk@FreeBSD.org> | 2005-02-17 10:49:51 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2005-02-17 10:49:51 +0000 |
commit | af1fa2025c1adbd3aa43852fd421e5de95e7e48a (patch) | |
tree | c6ca1c2d787f19fc07fe230b8960fbd1ed235cbb /sys | |
parent | b6768ad7ab5e57fa2022ae70c6a59bf4b89bdfb8 (diff) | |
download | FreeBSD-src-af1fa2025c1adbd3aa43852fd421e5de95e7e48a.zip FreeBSD-src-af1fa2025c1adbd3aa43852fd421e5de95e7e48a.tar.gz |
Introduce vx_wait{l}() and use it instead of home-rolled versions.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/fs/deadfs/dead_vnops.c | 31 | ||||
-rw-r--r-- | sys/fs/devfs/devfs_vnops.c | 8 | ||||
-rw-r--r-- | sys/fs/nullfs/null_vnops.c | 6 | ||||
-rw-r--r-- | sys/kern/vfs_subr.c | 37 | ||||
-rw-r--r-- | sys/kern/vfs_vnops.c | 3 | ||||
-rw-r--r-- | sys/sys/vnode.h | 3 |
6 files changed, 44 insertions, 44 deletions
diff --git a/sys/fs/deadfs/dead_vnops.c b/sys/fs/deadfs/dead_vnops.c index 3d3a65a..ca32893 100644 --- a/sys/fs/deadfs/dead_vnops.c +++ b/sys/fs/deadfs/dead_vnops.c @@ -38,7 +38,6 @@ #include <sys/poll.h> #include <sys/vnode.h> -static int chkvnlock(struct vnode *); /* * Prototypes for dead operations on vnodes. */ @@ -129,7 +128,7 @@ dead_read(ap) } */ *ap; { - if (chkvnlock(ap->a_vp)) + if (vx_wait(ap->a_vp)) panic("dead_read: lock"); /* * Return EOF for tty devices, EIO for others @@ -153,7 +152,7 @@ dead_write(ap) } */ *ap; { - if (chkvnlock(ap->a_vp)) + if (vx_wait(ap->a_vp)) panic("dead_write: lock"); return (EIO); } @@ -174,7 +173,7 @@ dead_ioctl(ap) } */ *ap; { - if (!chkvnlock(ap->a_vp)) + if (!vx_wait(ap->a_vp)) return (ENOTTY); /* XXX: Doesn't this just recurse back here ? */ return (VOP_IOCTL_AP(ap)); @@ -202,7 +201,7 @@ dead_lock(ap) mtx_unlock(&vp->v_interlock); ap->a_flags &= ~LK_INTERLOCK; } - if (!chkvnlock(vp)) + if (!vx_wait(vp)) return (0); return (VOP_LOCK_AP(ap)); } @@ -222,32 +221,12 @@ dead_bmap(ap) } */ *ap; { - if (!chkvnlock(ap->a_vp)) + if (!vx_wait(ap->a_vp)) return (EIO); return (VOP_BMAP(ap->a_vp, ap->a_bn, ap->a_bop, ap->a_bnp, ap->a_runp, ap->a_runb)); } /* - * We have to wait during times when the vnode is - * in a state of change. - */ -static int -chkvnlock(vp) - register struct vnode *vp; -{ - int locked = 0; - - VI_LOCK(vp); - while (vp->v_iflag & VI_XLOCK) { - vp->v_iflag |= VI_XWANT; - (void) msleep((caddr_t)vp, VI_MTX(vp), PINOD, "ckvnlk", 0); - locked = 1; - } - VI_UNLOCK(vp); - return (locked); -} - -/* * Trivial poll routine that always returns POLLHUP. * This is necessary so that a process which is polling a file * gets notified when that file is revoke()d. diff --git a/sys/fs/devfs/devfs_vnops.c b/sys/fs/devfs/devfs_vnops.c index 96fc730..dc20a60 100644 --- a/sys/fs/devfs/devfs_vnops.c +++ b/sys/fs/devfs/devfs_vnops.c @@ -1109,17 +1109,13 @@ devfs_revoke(ap) de = vp->v_data; de->de_vnode = NULL; - VI_LOCK(vp); /* * If a vgone (or vclean) is already in progress, * wait until it is done and return. */ - if (vp->v_iflag & VI_XLOCK) { - vp->v_iflag |= VI_XWANT; - msleep(vp, VI_MTX(vp), PINOD | PDROP, "vop_revokeall", 0); + if (vx_wait(vp)) return (0); - } - VI_UNLOCK(vp); + dev = vp->v_rdev; for (;;) { dev_lock(); diff --git a/sys/fs/nullfs/null_vnops.c b/sys/fs/nullfs/null_vnops.c index 9049e62..f02adbc5 100644 --- a/sys/fs/nullfs/null_vnops.c +++ b/sys/fs/nullfs/null_vnops.c @@ -599,10 +599,8 @@ null_lock(struct vop_lock_args *ap) wakeup(&nn->null_pending_locks); } if (error == ENOENT && (vp->v_iflag & VI_XLOCK) != 0 && - vp->v_vxthread != curthread) { - vp->v_iflag |= VI_XWANT; - msleep(vp, VI_MTX(vp), PINOD, "nulbo", 0); - } + vp->v_vxthread != curthread) + vx_waitl(vp); VI_UNLOCK(vp); return error; } else { diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index 70b0ba1..b0f6aeb 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -1795,8 +1795,8 @@ vget(vp, flags, td) VI_LOCK(vp); if (vp->v_iflag & VI_XLOCK && vp->v_vxthread != curthread) { if ((flags & LK_NOWAIT) == 0) { - vp->v_iflag |= VI_XWANT; - msleep(vp, VI_MTX(vp), PINOD | PDROP, "vget", 0); + vx_waitl(vp); + VI_UNLOCK(vp); return (ENOENT); } VI_UNLOCK(vp); @@ -2216,6 +2216,33 @@ vx_unlock(struct vnode *vp) wakeup(vp); } } + +int +vx_wait(struct vnode *vp) +{ + int locked; + + ASSERT_VI_UNLOCKED(vp, "vx_wait"); + VI_LOCK(vp); + locked = vx_waitl(vp); + VI_UNLOCK(vp); + return (locked); +} + +int +vx_waitl(struct vnode *vp) +{ + int locked = 0; + + ASSERT_VI_LOCKED(vp, "vx_wait"); + while (vp->v_iflag & VI_XLOCK) { + locked = 1; + vp->v_iflag |= VI_XWANT; + msleep(vp, VI_MTX(vp), PINOD, "vxwait", 0); + } + return (locked); +} + /* * Recycle an unused vnode to the front of the free list. * Release the passed interlock if the vnode will be recycled. @@ -2259,11 +2286,9 @@ vgonel(struct vnode *vp, struct thread *td) * wait until it is done and return. */ ASSERT_VI_LOCKED(vp, "vgonel"); - if (vp->v_iflag & VI_XLOCK) { - vp->v_iflag |= VI_XWANT; - msleep(vp, VI_MTX(vp), PINOD | PDROP, "vgone", 0); + if (vx_waitl(vp)) return; - } + vx_lock(vp); /* diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index bb7872b..718d4e0 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -822,8 +822,7 @@ debug_vn_lock(vp, flags, td, filename, line) VI_UNLOCK(vp); return (ENOENT); } - vp->v_iflag |= VI_XWANT; - msleep(vp, VI_MTX(vp), PINOD, "vn_lock", 0); + vx_waitl(vp); if ((flags & LK_RETRY) == 0) { VI_UNLOCK(vp); return (ENOENT); diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h index dbf83c8..2839888 100644 --- a/sys/sys/vnode.h +++ b/sys/sys/vnode.h @@ -671,6 +671,9 @@ void vref(struct vnode *vp); int vrefcnt(struct vnode *vp); void v_addpollinfo(struct vnode *vp); +int vx_wait(struct vnode *vp); +int vx_waitl(struct vnode *vp); + int vnode_create_vobject(struct vnode *vp, size_t size, struct thread *td); void vnode_destroy_vobject(struct vnode *vp); |