diff options
author | bde <bde@FreeBSD.org> | 1997-02-27 16:08:43 +0000 |
---|---|---|
committer | bde <bde@FreeBSD.org> | 1997-02-27 16:08:43 +0000 |
commit | b19a6b276f7f77f7a94a4f70fc1a0284e9235910 (patch) | |
tree | a772b9f85f6c2834a3629044d7c7f5cb9645e76a /sys | |
parent | 61157dd0d7f60bd4defc224af2a0aa3548fdd314 (diff) | |
download | FreeBSD-src-b19a6b276f7f77f7a94a4f70fc1a0284e9235910.zip FreeBSD-src-b19a6b276f7f77f7a94a4f70fc1a0284e9235910.tar.gz |
Fixed Lite2 merge of spechash simplelocking. It was misplaced in
checkalias() and missing in vfinddev() and vcount().
Diffstat (limited to 'sys')
-rw-r--r-- | sys/kern/vfs_export.c | 17 | ||||
-rw-r--r-- | sys/kern/vfs_subr.c | 17 |
2 files changed, 22 insertions, 12 deletions
diff --git a/sys/kern/vfs_export.c b/sys/kern/vfs_export.c index dd9ece2..f745e93 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.73 1997/02/27 02:57:03 dyson Exp $ + * $Id: vfs_subr.c,v 1.74 1997/02/27 05:28:58 dyson Exp $ */ /* @@ -772,14 +772,12 @@ loop: vgonel(vp, p); goto loop; } - simple_unlock(&spechash_slock); if (vget(vp, LK_EXCLUSIVE | LK_INTERLOCK, p)) { + simple_unlock(&spechash_slock); goto loop; } - simple_lock(&spechash_slock); break; } - if (vp == NULL || vp->v_tag != VT_NON) { MALLOC(nvp->v_specinfo, struct specinfo *, sizeof(struct specinfo), M_VNODE, M_WAITOK); @@ -1524,14 +1522,18 @@ vfinddev(dev, type, vpp) struct vnode **vpp; { register struct vnode *vp; + int rc = 0; + simple_lock(&spechash_slock); for (vp = speclisth[SPECHASH(dev)]; vp; vp = vp->v_specnext) { if (dev != vp->v_rdev || type != vp->v_type) continue; *vpp = vp; - return (1); + rc = 1; + break; } - return (0); + simple_unlock(&spechash_slock); + return (rc); } /* @@ -1547,6 +1549,7 @@ vcount(vp) loop: if ((vp->v_flag & VALIASED) == 0) return (vp->v_usecount); + simple_lock(&spechash_slock); for (count = 0, vq = *vp->v_hashchain; vq; vq = vnext) { vnext = vq->v_specnext; if (vq->v_rdev != vp->v_rdev || vq->v_type != vp->v_type) @@ -1555,11 +1558,13 @@ loop: * Alias, but not in use, so flush it out. */ if (vq->v_usecount == 0 && vq != vp) { + simple_unlock(&spechash_slock); vgone(vq); goto loop; } count += vq->v_usecount; } + simple_unlock(&spechash_slock); return (count); } diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index dd9ece2..f745e93 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.73 1997/02/27 02:57:03 dyson Exp $ + * $Id: vfs_subr.c,v 1.74 1997/02/27 05:28:58 dyson Exp $ */ /* @@ -772,14 +772,12 @@ loop: vgonel(vp, p); goto loop; } - simple_unlock(&spechash_slock); if (vget(vp, LK_EXCLUSIVE | LK_INTERLOCK, p)) { + simple_unlock(&spechash_slock); goto loop; } - simple_lock(&spechash_slock); break; } - if (vp == NULL || vp->v_tag != VT_NON) { MALLOC(nvp->v_specinfo, struct specinfo *, sizeof(struct specinfo), M_VNODE, M_WAITOK); @@ -1524,14 +1522,18 @@ vfinddev(dev, type, vpp) struct vnode **vpp; { register struct vnode *vp; + int rc = 0; + simple_lock(&spechash_slock); for (vp = speclisth[SPECHASH(dev)]; vp; vp = vp->v_specnext) { if (dev != vp->v_rdev || type != vp->v_type) continue; *vpp = vp; - return (1); + rc = 1; + break; } - return (0); + simple_unlock(&spechash_slock); + return (rc); } /* @@ -1547,6 +1549,7 @@ vcount(vp) loop: if ((vp->v_flag & VALIASED) == 0) return (vp->v_usecount); + simple_lock(&spechash_slock); for (count = 0, vq = *vp->v_hashchain; vq; vq = vnext) { vnext = vq->v_specnext; if (vq->v_rdev != vp->v_rdev || vq->v_type != vp->v_type) @@ -1555,11 +1558,13 @@ loop: * Alias, but not in use, so flush it out. */ if (vq->v_usecount == 0 && vq != vp) { + simple_unlock(&spechash_slock); vgone(vq); goto loop; } count += vq->v_usecount; } + simple_unlock(&spechash_slock); return (count); } |