summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authorbde <bde@FreeBSD.org>1997-02-27 16:08:43 +0000
committerbde <bde@FreeBSD.org>1997-02-27 16:08:43 +0000
commitb19a6b276f7f77f7a94a4f70fc1a0284e9235910 (patch)
treea772b9f85f6c2834a3629044d7c7f5cb9645e76a /sys/kern
parent61157dd0d7f60bd4defc224af2a0aa3548fdd314 (diff)
downloadFreeBSD-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/kern')
-rw-r--r--sys/kern/vfs_export.c17
-rw-r--r--sys/kern/vfs_subr.c17
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);
}
OpenPOWER on IntegriCloud