From 8b0f1ac87b298f08db63ee0a20f461649805e00a Mon Sep 17 00:00:00 2001 From: kato Date: Tue, 10 Feb 1998 02:54:24 +0000 Subject: Fixed vnode interlock handling. Reviewed by: Bruce Evans Tor Egge --- sys/kern/vfs_export.c | 16 +++++++++++++--- sys/kern/vfs_subr.c | 16 +++++++++++++--- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/sys/kern/vfs_export.c b/sys/kern/vfs_export.c index e764907..1be00d4 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.131 1998/02/07 08:44:31 kato Exp $ + * $Id: vfs_subr.c,v 1.132 1998/02/09 06:09:35 eivind Exp $ */ /* @@ -919,8 +919,16 @@ vget(vp, flags, p) (vp->v_type == VREG) && ((vp->v_object == NULL) || (vp->v_object->flags & OBJ_DEAD))) { - vfs_object_create(vp, curproc, curproc->p_ucred, - VOP_ISLOCKED(vp)); + /* + * XXX + * When the object is locked with shared lock, VOP_ISLOCKED() + * returns true. + */ + if (VOP_ISLOCKED(vp)) { + simple_unlock(&vp->v_interlock); + vfs_object_create(vp, curproc, curproc->p_ucred, 1); + } else + vfs_object_create(vp, curproc, curproc->p_ucred, 0); simple_lock(&vp->v_interlock); } if (flags & LK_TYPE_MASK) { @@ -2137,6 +2145,8 @@ vfs_object_create(vp, p, cred, waslocked) int error = 0; if ((vp->v_type != VREG) && (vp->v_type != VBLK)) { + if (!waslocked) + simple_unlock(&vp->v_interlock); return 0; } diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index e764907..1be00d4 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.131 1998/02/07 08:44:31 kato Exp $ + * $Id: vfs_subr.c,v 1.132 1998/02/09 06:09:35 eivind Exp $ */ /* @@ -919,8 +919,16 @@ vget(vp, flags, p) (vp->v_type == VREG) && ((vp->v_object == NULL) || (vp->v_object->flags & OBJ_DEAD))) { - vfs_object_create(vp, curproc, curproc->p_ucred, - VOP_ISLOCKED(vp)); + /* + * XXX + * When the object is locked with shared lock, VOP_ISLOCKED() + * returns true. + */ + if (VOP_ISLOCKED(vp)) { + simple_unlock(&vp->v_interlock); + vfs_object_create(vp, curproc, curproc->p_ucred, 1); + } else + vfs_object_create(vp, curproc, curproc->p_ucred, 0); simple_lock(&vp->v_interlock); } if (flags & LK_TYPE_MASK) { @@ -2137,6 +2145,8 @@ vfs_object_create(vp, p, cred, waslocked) int error = 0; if ((vp->v_type != VREG) && (vp->v_type != VBLK)) { + if (!waslocked) + simple_unlock(&vp->v_interlock); return 0; } -- cgit v1.1