From 49b7607eba2502e64bf19806ee213e665fca51c9 Mon Sep 17 00:00:00 2001 From: Poul-Henning Kamp Date: Sat, 13 Nov 2004 23:37:29 +0000 Subject: [PATCH] Integrate most of vop_revoke() into devfs_revoke() where it belongs. --- sys/fs/devfs/devfs_vnops.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/sys/fs/devfs/devfs_vnops.c b/sys/fs/devfs/devfs_vnops.c index c3d8ba62793..00b04437239 100644 --- a/sys/fs/devfs/devfs_vnops.c +++ b/sys/fs/devfs/devfs_vnops.c @@ -1240,11 +1240,34 @@ devfs_revoke(ap) } */ *ap; { struct vnode *vp = ap->a_vp; + struct vnode *vq; struct devfs_dirent *de; + struct cdev *dev; + KASSERT((ap->a_flags & REVOKEALL) != 0, ("devfs_revoke !REVOKEALL")); de = vp->v_data; de->de_vnode = NULL; - vop_revoke(ap); + + 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); + return (0); + } + VI_UNLOCK(vp); + dev = vp->v_rdev; + for (;;) { + dev_lock(); + vq = SLIST_FIRST(&dev->si_hlist); + dev_unlock(); + if (vq == NULL) + break; + vgone(vq); + } return (0); }