summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkato <kato@FreeBSD.org>1998-02-10 02:54:24 +0000
committerkato <kato@FreeBSD.org>1998-02-10 02:54:24 +0000
commit8b0f1ac87b298f08db63ee0a20f461649805e00a (patch)
tree33a5f77020ea1b2d39a5549996423a8507c8629f
parent1e5cccbfcc2bd171056d6b379e3dfbb00937c228 (diff)
downloadFreeBSD-src-8b0f1ac87b298f08db63ee0a20f461649805e00a.zip
FreeBSD-src-8b0f1ac87b298f08db63ee0a20f461649805e00a.tar.gz
Fixed vnode interlock handling.
Reviewed by: Bruce Evans <bde@zeta.org.au> Tor Egge <Tor.Egge@idi.ntnu.no>
-rw-r--r--sys/kern/vfs_export.c16
-rw-r--r--sys/kern/vfs_subr.c16
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;
}
OpenPOWER on IntegriCloud