summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2005-02-17 10:49:51 +0000
committerphk <phk@FreeBSD.org>2005-02-17 10:49:51 +0000
commitaf1fa2025c1adbd3aa43852fd421e5de95e7e48a (patch)
treec6ca1c2d787f19fc07fe230b8960fbd1ed235cbb
parentb6768ad7ab5e57fa2022ae70c6a59bf4b89bdfb8 (diff)
downloadFreeBSD-src-af1fa2025c1adbd3aa43852fd421e5de95e7e48a.zip
FreeBSD-src-af1fa2025c1adbd3aa43852fd421e5de95e7e48a.tar.gz
Introduce vx_wait{l}() and use it instead of home-rolled versions.
-rw-r--r--sys/fs/deadfs/dead_vnops.c31
-rw-r--r--sys/fs/devfs/devfs_vnops.c8
-rw-r--r--sys/fs/nullfs/null_vnops.c6
-rw-r--r--sys/kern/vfs_subr.c37
-rw-r--r--sys/kern/vfs_vnops.c3
-rw-r--r--sys/sys/vnode.h3
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);
OpenPOWER on IntegriCloud