summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/compat/svr4/svr4_fcntl.c4
-rw-r--r--sys/fs/cd9660/cd9660_vfsops.c20
-rw-r--r--sys/fs/specfs/spec_vnops.c5
-rw-r--r--sys/isofs/cd9660/cd9660_vfsops.c20
-rw-r--r--sys/kern/vfs_export.c275
-rw-r--r--sys/kern/vfs_extattr.c4
-rw-r--r--sys/kern/vfs_subr.c275
-rw-r--r--sys/kern/vfs_syscalls.c4
-rw-r--r--sys/miscfs/devfs/devfs_tree.c18
-rw-r--r--sys/miscfs/specfs/spec_vnops.c5
-rw-r--r--sys/nfs/nfs_common.c23
-rw-r--r--sys/nfs/nfs_subs.c23
-rw-r--r--sys/nfsclient/nfs_subs.c23
-rw-r--r--sys/nfsserver/nfs_srvsubs.c23
-rw-r--r--sys/svr4/svr4_fcntl.c4
-rw-r--r--sys/sys/conf.h4
-rw-r--r--sys/sys/linedisc.h4
-rw-r--r--sys/sys/lock.h3
-rw-r--r--sys/sys/lockmgr.h3
-rw-r--r--sys/sys/vnode.h16
-rw-r--r--sys/ufs/mfs/mfs_vfsops.c5
-rw-r--r--sys/ufs/ufs/ufs_vnops.c21
-rw-r--r--sys/vm/vm_swap.c8
23 files changed, 160 insertions, 630 deletions
diff --git a/sys/compat/svr4/svr4_fcntl.c b/sys/compat/svr4/svr4_fcntl.c
index f4dd337..add04e3 100644
--- a/sys/compat/svr4/svr4_fcntl.c
+++ b/sys/compat/svr4/svr4_fcntl.c
@@ -28,7 +28,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id$
+ * $Id: svr4_fcntl.c,v 1.3 1999/07/30 12:45:15 newton Exp $
*/
#include <sys/param.h>
#include <sys/systm.h>
@@ -280,7 +280,7 @@ fd_revoke(p, fd)
(error = suser(p)) != 0)
goto out;
- if (vp->v_usecount > 1 || (vp->v_flag & VALIASED))
+ if (vcount(vp) > 1)
VOP_REVOKE(vp, REVOKEALL);
out:
vrele(vp);
diff --git a/sys/fs/cd9660/cd9660_vfsops.c b/sys/fs/cd9660/cd9660_vfsops.c
index 1dc080d..59421d0 100644
--- a/sys/fs/cd9660/cd9660_vfsops.c
+++ b/sys/fs/cd9660/cd9660_vfsops.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)cd9660_vfsops.c 8.18 (Berkeley) 5/22/95
- * $Id: cd9660_vfsops.c,v 1.59 1999/08/23 21:07:12 bde Exp $
+ * $Id: cd9660_vfsops.c,v 1.60 1999/08/25 12:24:39 phk Exp $
*/
#include <sys/param.h>
@@ -892,23 +892,7 @@ cd9660_vget_internal(mp, ino, vpp, relocated, isodir)
* if device, look at device number table for translation
*/
vp->v_op = cd9660_specop_p;
- if ((nvp = checkalias(vp, ip->inode.iso_rdev, mp)) != NULL) {
- /*
- * Discard unneeded vnode, but save its iso_node.
- * Note that the lock is carried over in the iso_node
- * to the replacement vnode.
- */
- nvp->v_data = vp->v_data;
- vp->v_data = NULL;
- vp->v_op = spec_vnodeop_p;
- vrele(vp);
- vgone(vp);
- /*
- * Reinitialize aliased inode.
- */
- vp = nvp;
- ip->i_vnode = vp;
- }
+ addaliasu(vp, ip->inode.iso_rdev);
break;
default:
break;
diff --git a/sys/fs/specfs/spec_vnops.c b/sys/fs/specfs/spec_vnops.c
index d353060..ca1835e 100644
--- a/sys/fs/specfs/spec_vnops.c
+++ b/sys/fs/specfs/spec_vnops.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)spec_vnops.c 8.14 (Berkeley) 5/21/95
- * $Id: spec_vnops.c,v 1.97 1999/08/17 04:02:04 alc Exp $
+ * $Id: spec_vnops.c,v 1.98 1999/08/25 00:26:34 julian Exp $
*/
#include <sys/param.h>
@@ -686,8 +686,7 @@ spec_print(ap)
} */ *ap;
{
- printf("tag VT_NON, dev %d, %d\n", major(ap->a_vp->v_rdev),
- minor(ap->a_vp->v_rdev));
+ printf("tag VT_NON, dev %s\n", devtoname(ap->a_vp->v_rdev));
return (0);
}
diff --git a/sys/isofs/cd9660/cd9660_vfsops.c b/sys/isofs/cd9660/cd9660_vfsops.c
index 1dc080d..59421d0 100644
--- a/sys/isofs/cd9660/cd9660_vfsops.c
+++ b/sys/isofs/cd9660/cd9660_vfsops.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)cd9660_vfsops.c 8.18 (Berkeley) 5/22/95
- * $Id: cd9660_vfsops.c,v 1.59 1999/08/23 21:07:12 bde Exp $
+ * $Id: cd9660_vfsops.c,v 1.60 1999/08/25 12:24:39 phk Exp $
*/
#include <sys/param.h>
@@ -892,23 +892,7 @@ cd9660_vget_internal(mp, ino, vpp, relocated, isodir)
* if device, look at device number table for translation
*/
vp->v_op = cd9660_specop_p;
- if ((nvp = checkalias(vp, ip->inode.iso_rdev, mp)) != NULL) {
- /*
- * Discard unneeded vnode, but save its iso_node.
- * Note that the lock is carried over in the iso_node
- * to the replacement vnode.
- */
- nvp->v_data = vp->v_data;
- vp->v_data = NULL;
- vp->v_op = spec_vnodeop_p;
- vrele(vp);
- vgone(vp);
- /*
- * Reinitialize aliased inode.
- */
- vp = nvp;
- ip->i_vnode = vp;
- }
+ addaliasu(vp, ip->inode.iso_rdev);
break;
default:
break;
diff --git a/sys/kern/vfs_export.c b/sys/kern/vfs_export.c
index 46d31fc..dc2502d 100644
--- a/sys/kern/vfs_export.c
+++ b/sys/kern/vfs_export.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)vfs_subr.c 8.31 (Berkeley) 5/26/95
- * $Id: vfs_subr.c,v 1.219 1999/08/25 04:55:17 julian Exp $
+ * $Id: vfs_subr.c,v 1.220 1999/08/25 12:24:34 phk Exp $
*/
/*
@@ -1278,119 +1278,48 @@ bdevvp(dev, vpp)
return (error);
}
vp = nvp;
- /* dev2udev() results in a CDEV, so we need to cheat here. */
vp->v_type = VBLK;
- if ((nvp = checkalias2(vp, dev, (struct mount *)0)) != NULL) {
- vput(vp);
- vp = nvp;
- }
+ addalias(vp, dev);
*vpp = vp;
return (0);
}
/*
- * Check to see if the new vnode represents a special device
- * for which we already have a vnode (either because of
- * bdevvp() or because of a different vnode representing
- * the same block device). If such an alias exists, deallocate
- * the existing contents and return the aliased vnode. The
- * caller is responsible for filling it with its new contents.
+ * Add vnode to the alias list hung off the dev_t.
+ *
+ * The reason for this gunk is that multiple vnodes can reference
+ * the same physical device, so checking vp->v_usecount to see
+ * how many users there are is inadequate; the v_usecount for
+ * the vnodes need to be accumulated. vcount() does that.
*/
-struct vnode *
-checkalias(nvp, nvp_rdev, mp)
- register struct vnode *nvp;
+void
+addaliasu(nvp, nvp_rdev)
+ struct vnode *nvp;
udev_t nvp_rdev;
- struct mount *mp;
{
- dev_t dev;
if (nvp->v_type != VBLK && nvp->v_type != VCHR)
- return (NULLVP);
+ panic("addaliasu on non-special vnode");
- dev = udev2dev(nvp_rdev, nvp->v_type == VBLK ? 1 : 0);
- return (checkalias2(nvp, dev, mp));
+ nvp->v_rdev = udev2dev(nvp_rdev, nvp->v_type == VBLK ? 1 : 0);
+ simple_lock(&spechash_slock);
+ SLIST_INSERT_HEAD(&nvp->v_rdev->si_hlist, nvp, v_specnext);
+ simple_unlock(&spechash_slock);
}
-struct vnode *
-checkalias2(nvp, dev, mp)
- register struct vnode *nvp;
+void
+addalias(nvp, dev)
+ struct vnode *nvp;
dev_t dev;
- struct mount *mp;
{
- struct proc *p = curproc; /* XXX */
- struct vnode *vp;
- struct vnode **vpp;
if (nvp->v_type != VBLK && nvp->v_type != VCHR)
- return (NULLVP);
-
- vpp = &dev->si_hlist;
-loop:
- simple_lock(&spechash_slock);
- for (vp = *vpp; vp; vp = vp->v_specnext) {
- if (nvp->v_type != vp->v_type)
- continue;
- /*
- * Alias, but not in use, so flush it out.
- * Only alias active device nodes.
- * Not sure why we don't re-use this like we do below.
- */
- simple_lock(&vp->v_interlock);
- if (vp->v_usecount == 0) {
- simple_unlock(&spechash_slock);
- vgonel(vp, p);
- goto loop;
- }
- if (vget(vp, LK_EXCLUSIVE | LK_INTERLOCK, p)) {
- /*
- * It dissappeared, and we may have slept.
- * Restart from the beginning
- */
- simple_unlock(&spechash_slock);
- goto loop;
- }
- break;
- }
- /*
- * It would be a lot clearer what is going on here if
- * this had been expressed as:
- * if ( vp && (vp->v_tag == VT_NULL))
- * and the clauses had been swapped.
- */
- if (vp == NULL || vp->v_tag != VT_NON) {
- struct specinfo *sinfo;
+ panic("addalias on non-special vnode");
- /*
- * Put the new vnode into the hash chain.
- * and if there was an alias, connect them.
- */
- nvp->v_specnext = *vpp;
- *vpp = nvp;
- nvp->v_rdev = sinfo = dev;
-
- simple_unlock(&spechash_slock);
- if (vp != NULLVP) {
- nvp->v_flag |= VALIASED;
- vp->v_flag |= VALIASED;
- vput(vp);
- }
- return (NULLVP);
- }
- /*
- * if ( vp && (vp->v_tag == VT_NULL))
- * We have a vnode alias, but it is a trashed.
- * Make it look like it's newly allocated. (by getnewvnode())
- * The caller should use this instead.
- */
+ nvp->v_rdev = dev;
+ simple_lock(&spechash_slock);
+ SLIST_INSERT_HEAD(&dev->si_hlist, nvp, v_specnext);
simple_unlock(&spechash_slock);
- VOP_UNLOCK(vp, 0, p);
- simple_lock(&vp->v_interlock);
- vclean(vp, 0, p);
- vp->v_op = nvp->v_op;
- vp->v_tag = nvp->v_tag;
- nvp->v_type = VNON;
- insmntque(vp, mp);
- return (vp);
}
/*
@@ -1757,12 +1686,6 @@ vclean(vp, flags, p)
cache_purge(vp);
if (vp->v_vnlock) {
-#if 0 /* This is the only place we have LK_DRAINED in the entire kernel ??? */
-#ifdef DIAGNOSTIC
- if ((vp->v_vnlock->lk_flags & LK_DRAINED) == 0)
- vprint("vclean: lock not drained", vp);
-#endif
-#endif
FREE(vp->v_vnlock, M_VNODE);
vp->v_vnlock = NULL;
}
@@ -1795,56 +1718,30 @@ vop_revoke(ap)
} */ *ap;
{
struct vnode *vp, *vq;
- struct proc *p = curproc; /* XXX */
+ dev_t dev;
KASSERT((ap->a_flags & REVOKEALL) != 0, ("vop_revoke"));
vp = ap->a_vp;
- simple_lock(&vp->v_interlock);
-
- if (vp->v_flag & VALIASED) {
- /*
- * If a vgone (or vclean) is already in progress,
- * wait until it is done and return.
- */
- if (vp->v_flag & VXLOCK) {
- vp->v_flag |= VXWANT;
- simple_unlock(&vp->v_interlock);
- tsleep((caddr_t)vp, PINOD, "vop_revokeall", 0);
- return (0);
- }
- /*
- * Ensure that vp will not be vgone'd while we
- * are eliminating its aliases.
- */
- vp->v_flag |= VXLOCK;
+ /*
+ * If a vgone (or vclean) is already in progress,
+ * wait until it is done and return.
+ */
+ if (vp->v_flag & VXLOCK) {
+ vp->v_flag |= VXWANT;
simple_unlock(&vp->v_interlock);
- while (vp->v_flag & VALIASED) {
- simple_lock(&spechash_slock);
- for (vq = vp->v_hashchain; vq; vq = vq->v_specnext) {
- if (vq->v_type != vp->v_type || vp == vq)
- continue;
- simple_unlock(&spechash_slock);
- vgone(vq);
- break;
- }
- if (vq == NULLVP) {
- simple_unlock(&spechash_slock);
- }
- }
- /*
- * Remove the lock so that vgone below will
- * really eliminate the vnode after which time
- * vgone will awaken any sleepers.
- */
- simple_lock(&vp->v_interlock);
- vp->v_flag &= ~VXLOCK;
- if (vp->v_flag & VXWANT) {
- vp->v_flag &= ~VXWANT;
- wakeup(vp);
- }
+ tsleep((caddr_t)vp, PINOD, "vop_revokeall", 0);
+ return (0);
+ }
+ dev = vp->v_rdev;
+ for (;;) {
+ simple_lock(&spechash_slock);
+ vq = SLIST_FIRST(&dev->si_hlist);
+ simple_unlock(&spechash_slock);
+ if (!vq)
+ break;
+ vgone(vq);
}
- vgonel(vp, p);
return (0);
}
@@ -1894,8 +1791,6 @@ vgonel(vp, p)
struct proc *p;
{
int s;
- struct vnode *vq;
- struct vnode *vx;
/*
* If a vgone (or vclean) is already in progress,
@@ -1923,35 +1818,9 @@ vgonel(vp, p)
* If special device, remove it from special device alias list
* if it is on one.
*/
- if ((vp->v_type == VBLK || vp->v_type == VCHR) && vp->v_rdev != 0) {
+ if ((vp->v_type == VBLK || vp->v_type == VCHR) && vp->v_rdev != NULL) {
simple_lock(&spechash_slock);
- if (vp->v_hashchain == vp) {
- vp->v_hashchain = vp->v_specnext;
- } else {
- for (vq = vp->v_hashchain; vq; vq = vq->v_specnext) {
- if (vq->v_specnext != vp)
- continue;
- vq->v_specnext = vp->v_specnext;
- break;
- }
- if (vq == NULL)
- panic("missing bdev");
- }
- if (vp->v_flag & VALIASED) {
- vx = NULL;
- for (vq = vp->v_hashchain; vq; vq = vq->v_specnext) {
- if (vq->v_type != vp->v_type)
- continue;
- if (vx)
- break;
- vx = vq;
- }
- if (vx == NULL)
- panic("missing alias");
- if (vq == NULL)
- vx->v_flag &= ~VALIASED;
- vp->v_flag &= ~VALIASED;
- }
+ SLIST_REMOVE(&vp->v_hashchain, vp, vnode, v_specnext);
simple_unlock(&spechash_slock);
vp->v_rdev = NULL;
}
@@ -1996,19 +1865,18 @@ vfinddev(dev, type, vpp)
enum vtype type;
struct vnode **vpp;
{
- register struct vnode *vp;
- int rc = 0;
+ struct vnode *vp;
simple_lock(&spechash_slock);
- for (vp = dev->si_hlist; vp; vp = vp->v_specnext) {
- if (type != vp->v_type)
- continue;
- *vpp = vp;
- rc = 1;
- break;
+ SLIST_FOREACH(vp, &dev->si_hlist, v_specnext) {
+ if (type == vp->v_type) {
+ *vpp = vp;
+ simple_unlock(&spechash_slock);
+ return (1);
+ }
}
simple_unlock(&spechash_slock);
- return (rc);
+ return (0);
}
/*
@@ -2016,32 +1884,19 @@ vfinddev(dev, type, vpp)
*/
int
vcount(vp)
- register struct vnode *vp;
+ struct vnode *vp;
{
struct vnode *vq, *vnext;
int count;
-loop:
- if ((vp->v_flag & VALIASED) == 0)
- return (vp->v_usecount);
+ count = 0;
simple_lock(&spechash_slock);
- for (count = 0, vq = vp->v_hashchain; vq; vq = vnext) {
- vnext = vq->v_specnext;
- if (vq->v_type != vp->v_type)
- continue;
- /*
- * Alias, but not in use, so flush it out.
- */
- if (vq->v_usecount == 0 && vq != vp) {
- simple_unlock(&spechash_slock);
- vgone(vq);
- goto loop;
- }
+ SLIST_FOREACH(vq, &vp->v_hashchain, v_specnext)
count += vq->v_usecount;
- }
simple_unlock(&spechash_slock);
return (count);
}
+
/*
* Print out a description of a vnode.
*/
@@ -2051,7 +1906,7 @@ static char *typename[] =
void
vprint(label, vp)
char *label;
- register struct vnode *vp;
+ struct vnode *vp;
{
char buf[96];
@@ -2075,8 +1930,6 @@ vprint(label, vp)
strcat(buf, "|VXWANT");
if (vp->v_flag & VBWAIT)
strcat(buf, "|VBWAIT");
- if (vp->v_flag & VALIASED)
- strcat(buf, "|VALIASED");
if (vp->v_flag & VDOOMED)
strcat(buf, "|VDOOMED");
if (vp->v_flag & VFREE)
@@ -2281,24 +2134,10 @@ int
vfs_mountedon(vp)
struct vnode *vp;
{
- struct vnode *vq;
- int error = 0;
if (vp->v_specmountpoint != NULL)
return (EBUSY);
- if (vp->v_flag & VALIASED) {
- simple_lock(&spechash_slock);
- for (vq = vp->v_hashchain; vq; vq = vq->v_specnext) {
- if (vq->v_type != vp->v_type)
- continue;
- if (vq->v_specmountpoint != NULL) {
- error = EBUSY;
- break;
- }
- }
- simple_unlock(&spechash_slock);
- }
- return (error);
+ return (0);
}
/*
diff --git a/sys/kern/vfs_extattr.c b/sys/kern/vfs_extattr.c
index ef8cb7a..6b6a687 100644
--- a/sys/kern/vfs_extattr.c
+++ b/sys/kern/vfs_extattr.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)vfs_syscalls.c 8.13 (Berkeley) 4/15/94
- * $Id: vfs_syscalls.c,v 1.131 1999/08/22 01:46:57 jdp Exp $
+ * $Id: vfs_syscalls.c,v 1.132 1999/08/22 16:50:30 jdp Exp $
*/
/* For 4.3 integer FS ID compatibility */
@@ -3010,7 +3010,7 @@ revoke(p, uap)
if (p->p_ucred->cr_uid != vattr.va_uid &&
(error = suser_xxx(0, p, PRISON_ROOT)))
goto out;
- if (vp->v_usecount > 1 || (vp->v_flag & VALIASED))
+ if (vcount(vp) > 1)
VOP_REVOKE(vp, REVOKEALL);
out:
vrele(vp);
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index 46d31fc..dc2502d 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)vfs_subr.c 8.31 (Berkeley) 5/26/95
- * $Id: vfs_subr.c,v 1.219 1999/08/25 04:55:17 julian Exp $
+ * $Id: vfs_subr.c,v 1.220 1999/08/25 12:24:34 phk Exp $
*/
/*
@@ -1278,119 +1278,48 @@ bdevvp(dev, vpp)
return (error);
}
vp = nvp;
- /* dev2udev() results in a CDEV, so we need to cheat here. */
vp->v_type = VBLK;
- if ((nvp = checkalias2(vp, dev, (struct mount *)0)) != NULL) {
- vput(vp);
- vp = nvp;
- }
+ addalias(vp, dev);
*vpp = vp;
return (0);
}
/*
- * Check to see if the new vnode represents a special device
- * for which we already have a vnode (either because of
- * bdevvp() or because of a different vnode representing
- * the same block device). If such an alias exists, deallocate
- * the existing contents and return the aliased vnode. The
- * caller is responsible for filling it with its new contents.
+ * Add vnode to the alias list hung off the dev_t.
+ *
+ * The reason for this gunk is that multiple vnodes can reference
+ * the same physical device, so checking vp->v_usecount to see
+ * how many users there are is inadequate; the v_usecount for
+ * the vnodes need to be accumulated. vcount() does that.
*/
-struct vnode *
-checkalias(nvp, nvp_rdev, mp)
- register struct vnode *nvp;
+void
+addaliasu(nvp, nvp_rdev)
+ struct vnode *nvp;
udev_t nvp_rdev;
- struct mount *mp;
{
- dev_t dev;
if (nvp->v_type != VBLK && nvp->v_type != VCHR)
- return (NULLVP);
+ panic("addaliasu on non-special vnode");
- dev = udev2dev(nvp_rdev, nvp->v_type == VBLK ? 1 : 0);
- return (checkalias2(nvp, dev, mp));
+ nvp->v_rdev = udev2dev(nvp_rdev, nvp->v_type == VBLK ? 1 : 0);
+ simple_lock(&spechash_slock);
+ SLIST_INSERT_HEAD(&nvp->v_rdev->si_hlist, nvp, v_specnext);
+ simple_unlock(&spechash_slock);
}
-struct vnode *
-checkalias2(nvp, dev, mp)
- register struct vnode *nvp;
+void
+addalias(nvp, dev)
+ struct vnode *nvp;
dev_t dev;
- struct mount *mp;
{
- struct proc *p = curproc; /* XXX */
- struct vnode *vp;
- struct vnode **vpp;
if (nvp->v_type != VBLK && nvp->v_type != VCHR)
- return (NULLVP);
-
- vpp = &dev->si_hlist;
-loop:
- simple_lock(&spechash_slock);
- for (vp = *vpp; vp; vp = vp->v_specnext) {
- if (nvp->v_type != vp->v_type)
- continue;
- /*
- * Alias, but not in use, so flush it out.
- * Only alias active device nodes.
- * Not sure why we don't re-use this like we do below.
- */
- simple_lock(&vp->v_interlock);
- if (vp->v_usecount == 0) {
- simple_unlock(&spechash_slock);
- vgonel(vp, p);
- goto loop;
- }
- if (vget(vp, LK_EXCLUSIVE | LK_INTERLOCK, p)) {
- /*
- * It dissappeared, and we may have slept.
- * Restart from the beginning
- */
- simple_unlock(&spechash_slock);
- goto loop;
- }
- break;
- }
- /*
- * It would be a lot clearer what is going on here if
- * this had been expressed as:
- * if ( vp && (vp->v_tag == VT_NULL))
- * and the clauses had been swapped.
- */
- if (vp == NULL || vp->v_tag != VT_NON) {
- struct specinfo *sinfo;
+ panic("addalias on non-special vnode");
- /*
- * Put the new vnode into the hash chain.
- * and if there was an alias, connect them.
- */
- nvp->v_specnext = *vpp;
- *vpp = nvp;
- nvp->v_rdev = sinfo = dev;
-
- simple_unlock(&spechash_slock);
- if (vp != NULLVP) {
- nvp->v_flag |= VALIASED;
- vp->v_flag |= VALIASED;
- vput(vp);
- }
- return (NULLVP);
- }
- /*
- * if ( vp && (vp->v_tag == VT_NULL))
- * We have a vnode alias, but it is a trashed.
- * Make it look like it's newly allocated. (by getnewvnode())
- * The caller should use this instead.
- */
+ nvp->v_rdev = dev;
+ simple_lock(&spechash_slock);
+ SLIST_INSERT_HEAD(&dev->si_hlist, nvp, v_specnext);
simple_unlock(&spechash_slock);
- VOP_UNLOCK(vp, 0, p);
- simple_lock(&vp->v_interlock);
- vclean(vp, 0, p);
- vp->v_op = nvp->v_op;
- vp->v_tag = nvp->v_tag;
- nvp->v_type = VNON;
- insmntque(vp, mp);
- return (vp);
}
/*
@@ -1757,12 +1686,6 @@ vclean(vp, flags, p)
cache_purge(vp);
if (vp->v_vnlock) {
-#if 0 /* This is the only place we have LK_DRAINED in the entire kernel ??? */
-#ifdef DIAGNOSTIC
- if ((vp->v_vnlock->lk_flags & LK_DRAINED) == 0)
- vprint("vclean: lock not drained", vp);
-#endif
-#endif
FREE(vp->v_vnlock, M_VNODE);
vp->v_vnlock = NULL;
}
@@ -1795,56 +1718,30 @@ vop_revoke(ap)
} */ *ap;
{
struct vnode *vp, *vq;
- struct proc *p = curproc; /* XXX */
+ dev_t dev;
KASSERT((ap->a_flags & REVOKEALL) != 0, ("vop_revoke"));
vp = ap->a_vp;
- simple_lock(&vp->v_interlock);
-
- if (vp->v_flag & VALIASED) {
- /*
- * If a vgone (or vclean) is already in progress,
- * wait until it is done and return.
- */
- if (vp->v_flag & VXLOCK) {
- vp->v_flag |= VXWANT;
- simple_unlock(&vp->v_interlock);
- tsleep((caddr_t)vp, PINOD, "vop_revokeall", 0);
- return (0);
- }
- /*
- * Ensure that vp will not be vgone'd while we
- * are eliminating its aliases.
- */
- vp->v_flag |= VXLOCK;
+ /*
+ * If a vgone (or vclean) is already in progress,
+ * wait until it is done and return.
+ */
+ if (vp->v_flag & VXLOCK) {
+ vp->v_flag |= VXWANT;
simple_unlock(&vp->v_interlock);
- while (vp->v_flag & VALIASED) {
- simple_lock(&spechash_slock);
- for (vq = vp->v_hashchain; vq; vq = vq->v_specnext) {
- if (vq->v_type != vp->v_type || vp == vq)
- continue;
- simple_unlock(&spechash_slock);
- vgone(vq);
- break;
- }
- if (vq == NULLVP) {
- simple_unlock(&spechash_slock);
- }
- }
- /*
- * Remove the lock so that vgone below will
- * really eliminate the vnode after which time
- * vgone will awaken any sleepers.
- */
- simple_lock(&vp->v_interlock);
- vp->v_flag &= ~VXLOCK;
- if (vp->v_flag & VXWANT) {
- vp->v_flag &= ~VXWANT;
- wakeup(vp);
- }
+ tsleep((caddr_t)vp, PINOD, "vop_revokeall", 0);
+ return (0);
+ }
+ dev = vp->v_rdev;
+ for (;;) {
+ simple_lock(&spechash_slock);
+ vq = SLIST_FIRST(&dev->si_hlist);
+ simple_unlock(&spechash_slock);
+ if (!vq)
+ break;
+ vgone(vq);
}
- vgonel(vp, p);
return (0);
}
@@ -1894,8 +1791,6 @@ vgonel(vp, p)
struct proc *p;
{
int s;
- struct vnode *vq;
- struct vnode *vx;
/*
* If a vgone (or vclean) is already in progress,
@@ -1923,35 +1818,9 @@ vgonel(vp, p)
* If special device, remove it from special device alias list
* if it is on one.
*/
- if ((vp->v_type == VBLK || vp->v_type == VCHR) && vp->v_rdev != 0) {
+ if ((vp->v_type == VBLK || vp->v_type == VCHR) && vp->v_rdev != NULL) {
simple_lock(&spechash_slock);
- if (vp->v_hashchain == vp) {
- vp->v_hashchain = vp->v_specnext;
- } else {
- for (vq = vp->v_hashchain; vq; vq = vq->v_specnext) {
- if (vq->v_specnext != vp)
- continue;
- vq->v_specnext = vp->v_specnext;
- break;
- }
- if (vq == NULL)
- panic("missing bdev");
- }
- if (vp->v_flag & VALIASED) {
- vx = NULL;
- for (vq = vp->v_hashchain; vq; vq = vq->v_specnext) {
- if (vq->v_type != vp->v_type)
- continue;
- if (vx)
- break;
- vx = vq;
- }
- if (vx == NULL)
- panic("missing alias");
- if (vq == NULL)
- vx->v_flag &= ~VALIASED;
- vp->v_flag &= ~VALIASED;
- }
+ SLIST_REMOVE(&vp->v_hashchain, vp, vnode, v_specnext);
simple_unlock(&spechash_slock);
vp->v_rdev = NULL;
}
@@ -1996,19 +1865,18 @@ vfinddev(dev, type, vpp)
enum vtype type;
struct vnode **vpp;
{
- register struct vnode *vp;
- int rc = 0;
+ struct vnode *vp;
simple_lock(&spechash_slock);
- for (vp = dev->si_hlist; vp; vp = vp->v_specnext) {
- if (type != vp->v_type)
- continue;
- *vpp = vp;
- rc = 1;
- break;
+ SLIST_FOREACH(vp, &dev->si_hlist, v_specnext) {
+ if (type == vp->v_type) {
+ *vpp = vp;
+ simple_unlock(&spechash_slock);
+ return (1);
+ }
}
simple_unlock(&spechash_slock);
- return (rc);
+ return (0);
}
/*
@@ -2016,32 +1884,19 @@ vfinddev(dev, type, vpp)
*/
int
vcount(vp)
- register struct vnode *vp;
+ struct vnode *vp;
{
struct vnode *vq, *vnext;
int count;
-loop:
- if ((vp->v_flag & VALIASED) == 0)
- return (vp->v_usecount);
+ count = 0;
simple_lock(&spechash_slock);
- for (count = 0, vq = vp->v_hashchain; vq; vq = vnext) {
- vnext = vq->v_specnext;
- if (vq->v_type != vp->v_type)
- continue;
- /*
- * Alias, but not in use, so flush it out.
- */
- if (vq->v_usecount == 0 && vq != vp) {
- simple_unlock(&spechash_slock);
- vgone(vq);
- goto loop;
- }
+ SLIST_FOREACH(vq, &vp->v_hashchain, v_specnext)
count += vq->v_usecount;
- }
simple_unlock(&spechash_slock);
return (count);
}
+
/*
* Print out a description of a vnode.
*/
@@ -2051,7 +1906,7 @@ static char *typename[] =
void
vprint(label, vp)
char *label;
- register struct vnode *vp;
+ struct vnode *vp;
{
char buf[96];
@@ -2075,8 +1930,6 @@ vprint(label, vp)
strcat(buf, "|VXWANT");
if (vp->v_flag & VBWAIT)
strcat(buf, "|VBWAIT");
- if (vp->v_flag & VALIASED)
- strcat(buf, "|VALIASED");
if (vp->v_flag & VDOOMED)
strcat(buf, "|VDOOMED");
if (vp->v_flag & VFREE)
@@ -2281,24 +2134,10 @@ int
vfs_mountedon(vp)
struct vnode *vp;
{
- struct vnode *vq;
- int error = 0;
if (vp->v_specmountpoint != NULL)
return (EBUSY);
- if (vp->v_flag & VALIASED) {
- simple_lock(&spechash_slock);
- for (vq = vp->v_hashchain; vq; vq = vq->v_specnext) {
- if (vq->v_type != vp->v_type)
- continue;
- if (vq->v_specmountpoint != NULL) {
- error = EBUSY;
- break;
- }
- }
- simple_unlock(&spechash_slock);
- }
- return (error);
+ return (0);
}
/*
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index ef8cb7a..6b6a687 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)vfs_syscalls.c 8.13 (Berkeley) 4/15/94
- * $Id: vfs_syscalls.c,v 1.131 1999/08/22 01:46:57 jdp Exp $
+ * $Id: vfs_syscalls.c,v 1.132 1999/08/22 16:50:30 jdp Exp $
*/
/* For 4.3 integer FS ID compatibility */
@@ -3010,7 +3010,7 @@ revoke(p, uap)
if (p->p_ucred->cr_uid != vattr.va_uid &&
(error = suser_xxx(0, p, PRISON_ROOT)))
goto out;
- if (vp->v_usecount > 1 || (vp->v_flag & VALIASED))
+ if (vcount(vp) > 1)
VOP_REVOKE(vp, REVOKEALL);
out:
vrele(vp);
diff --git a/sys/miscfs/devfs/devfs_tree.c b/sys/miscfs/devfs/devfs_tree.c
index 1e0eed4..c7bfb56 100644
--- a/sys/miscfs/devfs/devfs_tree.c
+++ b/sys/miscfs/devfs/devfs_tree.c
@@ -24,7 +24,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: devfs_tree.c,v 1.61 1999/08/25 04:55:18 julian Exp $
+ * $Id: devfs_tree.c,v 1.62 1999/08/25 22:50:11 julian Exp $
*/
@@ -982,23 +982,11 @@ DBPRINT(("(New vnode)"));
break;
case DEV_BDEV:
vn_p->v_type = VBLK;
- if ((nvp = checkalias2(vn_p,
- dnp->by.dev.dev,
- (struct mount *)0)) != NULL)
- {
- vput(vn_p);
- vn_p = nvp;
- }
+ addalias(vn_p, dnp->by.dev.dev);
break;
case DEV_CDEV:
vn_p->v_type = VCHR;
- if ((nvp = checkalias2(vn_p,
- dnp->by.dev.dev,
- (struct mount *)0)) != NULL)
- {
- vput(vn_p);
- vn_p = nvp;
- }
+ addalias(vn_p, dnp->by.dev.dev);
break;
case DEV_DDEV:
break;
diff --git a/sys/miscfs/specfs/spec_vnops.c b/sys/miscfs/specfs/spec_vnops.c
index d353060..ca1835e 100644
--- a/sys/miscfs/specfs/spec_vnops.c
+++ b/sys/miscfs/specfs/spec_vnops.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)spec_vnops.c 8.14 (Berkeley) 5/21/95
- * $Id: spec_vnops.c,v 1.97 1999/08/17 04:02:04 alc Exp $
+ * $Id: spec_vnops.c,v 1.98 1999/08/25 00:26:34 julian Exp $
*/
#include <sys/param.h>
@@ -686,8 +686,7 @@ spec_print(ap)
} */ *ap;
{
- printf("tag VT_NON, dev %d, %d\n", major(ap->a_vp->v_rdev),
- minor(ap->a_vp->v_rdev));
+ printf("tag VT_NON, dev %s\n", devtoname(ap->a_vp->v_rdev));
return (0);
}
diff --git a/sys/nfs/nfs_common.c b/sys/nfs/nfs_common.c
index 08108a6..9ffb490 100644
--- a/sys/nfs/nfs_common.c
+++ b/sys/nfs/nfs_common.c
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* @(#)nfs_subs.c 8.8 (Berkeley) 5/22/95
- * $Id: nfs_subs.c,v 1.79 1999/07/17 18:43:47 phk Exp $
+ * $Id: nfs_subs.c,v 1.80 1999/08/08 18:42:55 phk Exp $
*/
/*
@@ -1311,26 +1311,7 @@ nfs_loadattrcache(vpp, mdp, dposp, vaper)
}
if (vp->v_type == VCHR || vp->v_type == VBLK) {
vp->v_op = spec_nfsv2nodeop_p;
- nvp = checkalias(vp, rdev, vp->v_mount);
- if (nvp) {
- /*
- * Discard unneeded vnode, but save its nfsnode.
- * Since the nfsnode does not have a lock, its
- * vnode lock has to be carried over.
- */
- nvp->v_vnlock = vp->v_vnlock;
- vp->v_vnlock = NULL;
- nvp->v_data = vp->v_data;
- vp->v_data = NULL;
- vp->v_op = spec_vnodeop_p;
- vrele(vp);
- vgone(vp);
- /*
- * Reinitialize aliased node.
- */
- np->n_vnode = nvp;
- *vpp = vp = nvp;
- }
+ addaliasu(vp, rdev);
}
np->n_mtime = mtime.tv_sec;
}
diff --git a/sys/nfs/nfs_subs.c b/sys/nfs/nfs_subs.c
index 08108a6..9ffb490 100644
--- a/sys/nfs/nfs_subs.c
+++ b/sys/nfs/nfs_subs.c
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* @(#)nfs_subs.c 8.8 (Berkeley) 5/22/95
- * $Id: nfs_subs.c,v 1.79 1999/07/17 18:43:47 phk Exp $
+ * $Id: nfs_subs.c,v 1.80 1999/08/08 18:42:55 phk Exp $
*/
/*
@@ -1311,26 +1311,7 @@ nfs_loadattrcache(vpp, mdp, dposp, vaper)
}
if (vp->v_type == VCHR || vp->v_type == VBLK) {
vp->v_op = spec_nfsv2nodeop_p;
- nvp = checkalias(vp, rdev, vp->v_mount);
- if (nvp) {
- /*
- * Discard unneeded vnode, but save its nfsnode.
- * Since the nfsnode does not have a lock, its
- * vnode lock has to be carried over.
- */
- nvp->v_vnlock = vp->v_vnlock;
- vp->v_vnlock = NULL;
- nvp->v_data = vp->v_data;
- vp->v_data = NULL;
- vp->v_op = spec_vnodeop_p;
- vrele(vp);
- vgone(vp);
- /*
- * Reinitialize aliased node.
- */
- np->n_vnode = nvp;
- *vpp = vp = nvp;
- }
+ addaliasu(vp, rdev);
}
np->n_mtime = mtime.tv_sec;
}
diff --git a/sys/nfsclient/nfs_subs.c b/sys/nfsclient/nfs_subs.c
index 08108a6..9ffb490 100644
--- a/sys/nfsclient/nfs_subs.c
+++ b/sys/nfsclient/nfs_subs.c
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* @(#)nfs_subs.c 8.8 (Berkeley) 5/22/95
- * $Id: nfs_subs.c,v 1.79 1999/07/17 18:43:47 phk Exp $
+ * $Id: nfs_subs.c,v 1.80 1999/08/08 18:42:55 phk Exp $
*/
/*
@@ -1311,26 +1311,7 @@ nfs_loadattrcache(vpp, mdp, dposp, vaper)
}
if (vp->v_type == VCHR || vp->v_type == VBLK) {
vp->v_op = spec_nfsv2nodeop_p;
- nvp = checkalias(vp, rdev, vp->v_mount);
- if (nvp) {
- /*
- * Discard unneeded vnode, but save its nfsnode.
- * Since the nfsnode does not have a lock, its
- * vnode lock has to be carried over.
- */
- nvp->v_vnlock = vp->v_vnlock;
- vp->v_vnlock = NULL;
- nvp->v_data = vp->v_data;
- vp->v_data = NULL;
- vp->v_op = spec_vnodeop_p;
- vrele(vp);
- vgone(vp);
- /*
- * Reinitialize aliased node.
- */
- np->n_vnode = nvp;
- *vpp = vp = nvp;
- }
+ addaliasu(vp, rdev);
}
np->n_mtime = mtime.tv_sec;
}
diff --git a/sys/nfsserver/nfs_srvsubs.c b/sys/nfsserver/nfs_srvsubs.c
index 08108a6..9ffb490 100644
--- a/sys/nfsserver/nfs_srvsubs.c
+++ b/sys/nfsserver/nfs_srvsubs.c
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* @(#)nfs_subs.c 8.8 (Berkeley) 5/22/95
- * $Id: nfs_subs.c,v 1.79 1999/07/17 18:43:47 phk Exp $
+ * $Id: nfs_subs.c,v 1.80 1999/08/08 18:42:55 phk Exp $
*/
/*
@@ -1311,26 +1311,7 @@ nfs_loadattrcache(vpp, mdp, dposp, vaper)
}
if (vp->v_type == VCHR || vp->v_type == VBLK) {
vp->v_op = spec_nfsv2nodeop_p;
- nvp = checkalias(vp, rdev, vp->v_mount);
- if (nvp) {
- /*
- * Discard unneeded vnode, but save its nfsnode.
- * Since the nfsnode does not have a lock, its
- * vnode lock has to be carried over.
- */
- nvp->v_vnlock = vp->v_vnlock;
- vp->v_vnlock = NULL;
- nvp->v_data = vp->v_data;
- vp->v_data = NULL;
- vp->v_op = spec_vnodeop_p;
- vrele(vp);
- vgone(vp);
- /*
- * Reinitialize aliased node.
- */
- np->n_vnode = nvp;
- *vpp = vp = nvp;
- }
+ addaliasu(vp, rdev);
}
np->n_mtime = mtime.tv_sec;
}
diff --git a/sys/svr4/svr4_fcntl.c b/sys/svr4/svr4_fcntl.c
index f4dd337..add04e3 100644
--- a/sys/svr4/svr4_fcntl.c
+++ b/sys/svr4/svr4_fcntl.c
@@ -28,7 +28,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id$
+ * $Id: svr4_fcntl.c,v 1.3 1999/07/30 12:45:15 newton Exp $
*/
#include <sys/param.h>
#include <sys/systm.h>
@@ -280,7 +280,7 @@ fd_revoke(p, fd)
(error = suser(p)) != 0)
goto out;
- if (vp->v_usecount > 1 || (vp->v_flag & VALIASED))
+ if (vcount(vp) > 1)
VOP_REVOKE(vp, REVOKEALL);
out:
vrele(vp);
diff --git a/sys/sys/conf.h b/sys/sys/conf.h
index 5690f70..00645fb 100644
--- a/sys/sys/conf.h
+++ b/sys/sys/conf.h
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)conf.h 8.5 (Berkeley) 1/9/95
- * $Id: conf.h,v 1.77 1999/08/23 20:59:17 phk Exp $
+ * $Id: conf.h,v 1.78 1999/08/25 22:50:12 julian Exp $
*/
#ifndef _SYS_CONF_H_
@@ -53,7 +53,7 @@ struct specinfo {
udev_t si_udev;
SLIST_ENTRY(specinfo) si_hash;
- struct vnode *si_hlist;
+ SLIST_HEAD(, vnode) si_hlist;
char si_name[SPECNAMELEN + 1];
void *si_drv1, *si_drv2;
struct cdevsw *si_devsw;
diff --git a/sys/sys/linedisc.h b/sys/sys/linedisc.h
index 5690f70..00645fb 100644
--- a/sys/sys/linedisc.h
+++ b/sys/sys/linedisc.h
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)conf.h 8.5 (Berkeley) 1/9/95
- * $Id: conf.h,v 1.77 1999/08/23 20:59:17 phk Exp $
+ * $Id: conf.h,v 1.78 1999/08/25 22:50:12 julian Exp $
*/
#ifndef _SYS_CONF_H_
@@ -53,7 +53,7 @@ struct specinfo {
udev_t si_udev;
SLIST_ENTRY(specinfo) si_hash;
- struct vnode *si_hlist;
+ SLIST_HEAD(, vnode) si_hlist;
char si_name[SPECNAMELEN + 1];
void *si_drv1, *si_drv2;
struct cdevsw *si_devsw;
diff --git a/sys/sys/lock.h b/sys/sys/lock.h
index 038774f..67a56d9 100644
--- a/sys/sys/lock.h
+++ b/sys/sys/lock.h
@@ -35,7 +35,7 @@
* SUCH DAMAGE.
*
* @(#)lock.h 8.12 (Berkeley) 5/19/95
- * $Id: lock.h,v 1.13 1999/01/20 14:49:12 eivind Exp $
+ * $Id: lock.h,v 1.14 1999/06/26 02:45:40 mckusick Exp $
*/
#ifndef _LOCK_H_
@@ -129,7 +129,6 @@ struct lock {
#define LK_HAVE_EXCL 0x00000400 /* exclusive lock obtained */
#define LK_WAITDRAIN 0x00000800 /* process waiting for lock to drain */
#define LK_DRAINING 0x00004000 /* lock is being drained */
-#define LK_DRAINED 0x00008000 /* lock has been decommissioned */
/*
* Control flags
*
diff --git a/sys/sys/lockmgr.h b/sys/sys/lockmgr.h
index 038774f..67a56d9 100644
--- a/sys/sys/lockmgr.h
+++ b/sys/sys/lockmgr.h
@@ -35,7 +35,7 @@
* SUCH DAMAGE.
*
* @(#)lock.h 8.12 (Berkeley) 5/19/95
- * $Id: lock.h,v 1.13 1999/01/20 14:49:12 eivind Exp $
+ * $Id: lock.h,v 1.14 1999/06/26 02:45:40 mckusick Exp $
*/
#ifndef _LOCK_H_
@@ -129,7 +129,6 @@ struct lock {
#define LK_HAVE_EXCL 0x00000400 /* exclusive lock obtained */
#define LK_WAITDRAIN 0x00000800 /* process waiting for lock to drain */
#define LK_DRAINING 0x00004000 /* lock is being drained */
-#define LK_DRAINED 0x00008000 /* lock has been decommissioned */
/*
* Control flags
*
diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h
index ee3a325..b9c43e3 100644
--- a/sys/sys/vnode.h
+++ b/sys/sys/vnode.h
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)vnode.h 8.7 (Berkeley) 2/4/94
- * $Id: vnode.h,v 1.96 1999/08/25 04:55:20 julian Exp $
+ * $Id: vnode.h,v 1.97 1999/08/25 12:24:30 phk Exp $
*/
#ifndef _SYS_VNODE_H_
@@ -103,7 +103,7 @@ struct vnode {
struct socket *vu_socket; /* unix ipc (VSOCK) */
struct {
struct specinfo *vu_specinfo; /* device (VCHR, VBLK) */
- struct vnode *vu_specnext;
+ SLIST_ENTRY(vnode) vu_specnext;
} vu_spec;
struct fifoinfo *vu_fifoinfo; /* fifo (VFIFO) */
} v_un;
@@ -155,10 +155,10 @@ struct vnode {
#define VXLOCK 0x00100 /* vnode is locked to change underlying type */
#define VXWANT 0x00200 /* process is waiting for vnode */
#define VBWAIT 0x00400 /* waiting for output to complete */
-#define VALIASED 0x00800 /* vnode has an alias */
-#define VDIROP 0x01000 /* LFS: vnode is involved in a directory op */
+/* open for business 0x00800 */
+/* open for business 0x01000 */
#define VOBJBUF 0x02000 /* Allocate buffers in VM object */
-#define VNINACT 0x04000 /* LFS: skip ufs_inactive() in lfs_vunref */
+/* open for business 0x04000 */
#define VAGE 0x08000 /* Insert vnode at head of free list */
#define VOLOCK 0x10000 /* vnode is locked waiting for an object */
#define VOWANT 0x20000 /* a process is waiting for VOLOCK */
@@ -491,6 +491,8 @@ struct vop_bwrite_args;
extern int (*lease_check_hook) __P((struct vop_lease_args *));
+void addalias __P((struct vnode *vp, dev_t nvp_rdev));
+void addaliasu __P((struct vnode *vp, udev_t nvp_rdev));
int bdevvp __P((dev_t dev, struct vnode **vpp));
/* cache_* may belong in namei.h. */
void cache_enter __P((struct vnode *dvp, struct vnode *vp,
@@ -567,10 +569,6 @@ int vop_defaultop __P((struct vop_generic_args *ap));
int vop_null __P((struct vop_generic_args *ap));
int vop_panic __P((struct vop_generic_args *ap));
-struct vnode *
- checkalias __P((struct vnode *vp, udev_t nvp_rdev, struct mount *mp));
-struct vnode *
- checkalias2 __P((struct vnode *vp, dev_t nvp_rdev, struct mount *mp));
void vput __P((struct vnode *vp));
void vrele __P((struct vnode *vp));
void vref __P((struct vnode *vp));
diff --git a/sys/ufs/mfs/mfs_vfsops.c b/sys/ufs/mfs/mfs_vfsops.c
index 78a0ff4..87b129a 100644
--- a/sys/ufs/mfs/mfs_vfsops.c
+++ b/sys/ufs/mfs/mfs_vfsops.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)mfs_vfsops.c 8.11 (Berkeley) 6/19/95
- * $Id: mfs_vfsops.c,v 1.66 1999/07/20 09:47:55 phk Exp $
+ * $Id: mfs_vfsops.c,v 1.67 1999/08/24 18:35:33 phk Exp $
*/
@@ -335,8 +335,7 @@ mfs_mount(mp, path, data, ndp, p)
dev->si_bsize_phys = DEV_BSIZE;
dev->si_bsize_best = BLKDEV_IOSIZE;
dev->si_bsize_max = MAXBSIZE;
- if (checkalias(devvp, makeudev(253, mfs_minor++), (struct mount *)0))
- panic("mfs_mount: dup dev");
+ addaliasu(devvp, makeudev(253, mfs_minor++));
devvp->v_data = mfsp;
mfsp->mfs_baseoff = args.base;
mfsp->mfs_size = args.size;
diff --git a/sys/ufs/ufs/ufs_vnops.c b/sys/ufs/ufs/ufs_vnops.c
index 77c37e1..e474bda 100644
--- a/sys/ufs/ufs/ufs_vnops.c
+++ b/sys/ufs/ufs/ufs_vnops.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)ufs_vnops.c 8.27 (Berkeley) 5/27/95
- * $Id: ufs_vnops.c,v 1.120 1999/08/22 00:15:16 jdp Exp $
+ * $Id: ufs_vnops.c,v 1.121 1999/08/23 20:35:21 bde Exp $
*/
#include "opt_quota.h"
@@ -2035,24 +2035,7 @@ ufs_vinit(mntp, specops, fifoops, vpp)
case VCHR:
case VBLK:
vp->v_op = specops;
- nvp = checkalias(vp, ip->i_rdev, mntp);
- if (nvp) {
- /*
- * Discard unneeded vnode, but save its inode.
- * Note that the lock is carried over in the inode
- * to the replacement vnode.
- */
- nvp->v_data = vp->v_data;
- vp->v_data = NULL;
- vp->v_op = spec_vnodeop_p;
- vrele(vp);
- vgone(vp);
- /*
- * Reinitialize aliased inode.
- */
- vp = nvp;
- ip->i_vnode = vp;
- }
+ addaliasu(vp, ip->i_rdev);
break;
case VFIFO:
vp->v_op = fifoops;
diff --git a/sys/vm/vm_swap.c b/sys/vm/vm_swap.c
index e6337bb..a2218cd 100644
--- a/sys/vm/vm_swap.c
+++ b/sys/vm/vm_swap.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)vm_swap.c 8.5 (Berkeley) 2/17/94
- * $Id: vm_swap.c,v 1.82 1999/08/23 20:59:21 phk Exp $
+ * $Id: vm_swap.c,v 1.83 1999/08/24 05:58:35 green Exp $
*/
#include "opt_swap.h"
@@ -349,11 +349,7 @@ swaponvp(p, vp, dev, nblks)
panic("Cannot get vnode for swapdev");
vp1 = nvp;
vp1->v_type = VBLK;
- if ((nvp = checkalias(vp1, makeudev(BDEV_MAJOR, 0),
- (struct mount *) 0))) {
- vput(vp1);
- vp1 = nvp;
- }
+ addaliasu(vp1, makeudev(BDEV_MAJOR, 0));
swapdev_vp = vp1;
}
return (0);
OpenPOWER on IntegriCloud