summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/kern/spec_vnops.c4
-rw-r--r--sys/kern/vfs_default.c4
-rw-r--r--sys/kern/vfs_subr.c36
-rw-r--r--sys/sys/specdev.h10
4 files changed, 22 insertions, 32 deletions
diff --git a/sys/kern/spec_vnops.c b/sys/kern/spec_vnops.c
index 7cdfd6b7708..66529da7096 100644
--- a/sys/kern/spec_vnops.c
+++ b/sys/kern/spec_vnops.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: spec_vnops.c,v 1.98 2019/10/29 16:24:42 visa Exp $ */
+/* $OpenBSD: spec_vnops.c,v 1.99 2019/12/27 22:17:01 bluhm Exp $ */
/* $NetBSD: spec_vnops.c,v 1.29 1996/04/22 01:42:38 christos Exp $ */
/*
@@ -60,7 +60,7 @@
int spec_open_clone(struct vop_open_args *);
-struct vnode *speclisth[SPECHSZ];
+struct vnodechain speclisth[SPECHSZ];
struct vops spec_vops = {
.vop_lookup = vop_generic_lookup,
diff --git a/sys/kern/vfs_default.c b/sys/kern/vfs_default.c
index 7b6a58f8f1d..92fbd818636 100644
--- a/sys/kern/vfs_default.c
+++ b/sys/kern/vfs_default.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vfs_default.c,v 1.44 2019/12/08 12:29:42 mpi Exp $ */
+/* $OpenBSD: vfs_default.c,v 1.45 2019/12/27 22:17:01 bluhm Exp $ */
/*
* Portions of this code are:
@@ -98,7 +98,7 @@ vop_generic_revoke(void *v)
*/
vp->v_flag |= VXLOCK;
while (vp->v_flag & VALIASED) {
- for (vq = *vp->v_hashchain; vq; vq = vq->v_specnext) {
+ SLIST_FOREACH(vq, vp->v_hashchain, v_specnext) {
if (vq->v_rdev != vp->v_rdev ||
vq->v_type != vp->v_type || vp == vq)
continue;
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index edf191444db..7806935464f 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vfs_subr.c,v 1.295 2019/12/26 18:59:05 bluhm Exp $ */
+/* $OpenBSD: vfs_subr.c,v 1.296 2019/12/27 22:17:01 bluhm Exp $ */
/* $NetBSD: vfs_subr.c,v 1.53 1996/04/22 01:39:13 christos Exp $ */
/*
@@ -551,14 +551,14 @@ checkalias(struct vnode *nvp, dev_t nvp_rdev, struct mount *mp)
{
struct proc *p = curproc;
struct vnode *vp;
- struct vnode **vpp;
+ struct vnodechain *vchain;
if (nvp->v_type != VBLK && nvp->v_type != VCHR)
return (NULLVP);
- vpp = &speclisth[SPECHASH(nvp_rdev)];
+ vchain = &speclisth[SPECHASH(nvp_rdev)];
loop:
- for (vp = *vpp; vp; vp = vp->v_specnext) {
+ SLIST_FOREACH(vp, vchain, v_specnext) {
if (nvp_rdev != vp->v_rdev || nvp->v_type != vp->v_type) {
continue;
}
@@ -582,8 +582,7 @@ loop:
nvp->v_specinfo = malloc(sizeof(struct specinfo), M_VNODE,
M_WAITOK);
nvp->v_rdev = nvp_rdev;
- nvp->v_hashchain = vpp;
- nvp->v_specnext = *vpp;
+ nvp->v_hashchain = vchain;
nvp->v_specmountpoint = NULL;
nvp->v_speclockf = NULL;
nvp->v_specbitmap = NULL;
@@ -596,7 +595,7 @@ loop:
nvp->v_specbitmap = malloc(CLONE_MAPSZ,
M_VNODE, M_WAITOK | M_ZERO);
}
- *vpp = nvp;
+ SLIST_INSERT_HEAD(vchain, nvp, v_specnext);
if (vp != NULLVP) {
nvp->v_flag |= VALIASED;
vp->v_flag |= VALIASED;
@@ -1127,21 +1126,10 @@ vgonel(struct vnode *vp, struct proc *p)
(minor(vp->v_rdev) >> CLONE_SHIFT == 0)) {
free(vp->v_specbitmap, M_VNODE, CLONE_MAPSZ);
}
- 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");
- }
+ SLIST_REMOVE(vp->v_hashchain, vp, vnode, v_specnext);
if (vp->v_flag & VALIASED) {
vx = NULL;
- for (vq = *vp->v_hashchain; vq; vq = vq->v_specnext) {
+ SLIST_FOREACH(vq, vp->v_hashchain, v_specnext) {
if (vq->v_rdev != vp->v_rdev ||
vq->v_type != vp->v_type)
continue;
@@ -1195,7 +1183,7 @@ vfinddev(dev_t dev, enum vtype type, struct vnode **vpp)
struct vnode *vp;
int rc =0;
- for (vp = speclisth[SPECHASH(dev)]; vp; vp = vp->v_specnext) {
+ SLIST_FOREACH(vp, &speclisth[SPECHASH(dev)], v_specnext) {
if (dev != vp->v_rdev || type != vp->v_type)
continue;
*vpp = vp;
@@ -1232,8 +1220,8 @@ vcount(struct vnode *vp)
loop:
if ((vp->v_flag & VALIASED) == 0)
return (vp->v_usecount);
- for (count = 0, vq = *vp->v_hashchain; vq; vq = vnext) {
- vnext = vq->v_specnext;
+ count = 0;
+ SLIST_FOREACH_SAFE(vq, vp->v_hashchain, v_specnext, vnext) {
if (vq->v_rdev != vp->v_rdev || vq->v_type != vp->v_type)
continue;
/*
@@ -1386,7 +1374,7 @@ vfs_mountedon(struct vnode *vp)
if (vp->v_specmountpoint != NULL)
return (EBUSY);
if (vp->v_flag & VALIASED) {
- for (vq = *vp->v_hashchain; vq; vq = vq->v_specnext) {
+ SLIST_FOREACH(vq, vp->v_hashchain, v_specnext) {
if (vq->v_rdev != vp->v_rdev ||
vq->v_type != vp->v_type)
continue;
diff --git a/sys/sys/specdev.h b/sys/sys/specdev.h
index 870aec0d324..2570b20ba81 100644
--- a/sys/sys/specdev.h
+++ b/sys/sys/specdev.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: specdev.h,v 1.38 2019/01/21 18:09:21 anton Exp $ */
+/* $OpenBSD: specdev.h,v 1.39 2019/12/27 22:17:01 bluhm Exp $ */
/* $NetBSD: specdev.h,v 1.12 1996/02/13 13:13:01 mycroft Exp $ */
/*
@@ -32,14 +32,16 @@
* @(#)specdev.h 8.3 (Berkeley) 8/10/94
*/
+SLIST_HEAD(vnodechain, vnode);
+
/*
* This structure defines the information maintained about
* special devices. It is allocated in checkalias and freed
* in vgone.
*/
struct specinfo {
- struct vnode **si_hashchain;
- struct vnode *si_specnext;
+ struct vnodechain *si_hashchain;
+ SLIST_ENTRY(vnode) si_specnext;
struct mount *si_mountpoint;
dev_t si_rdev;
struct lockf_state *si_lockf;
@@ -85,7 +87,7 @@ struct cloneinfo {
#ifdef _KERNEL
-extern struct vnode *speclisth[SPECHSZ];
+extern struct vnodechain speclisth[SPECHSZ];
/*
* Prototypes for special file operations on vnodes.