summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_vnops.c
diff options
context:
space:
mode:
authordg <dg@FreeBSD.org>1995-05-10 18:59:11 +0000
committerdg <dg@FreeBSD.org>1995-05-10 18:59:11 +0000
commit6d9a56d4efcace942d1f7436837005cb44d3cebb (patch)
treee2dd3f91ea89643ddd148187c03f9caa3f33e136 /sys/kern/vfs_vnops.c
parenta2a89cc5d76e3cce6d2f366e27d157dcf019f31b (diff)
downloadFreeBSD-src-6d9a56d4efcace942d1f7436837005cb44d3cebb.zip
FreeBSD-src-6d9a56d4efcace942d1f7436837005cb44d3cebb.tar.gz
Unlock the vnode before sleeping on an OBJ_DEAD object. Should fix Bruce's
hang. Fixed some formatting anomolies and removed some unneeded casts.
Diffstat (limited to 'sys/kern/vfs_vnops.c')
-rw-r--r--sys/kern/vfs_vnops.c31
1 files changed, 16 insertions, 15 deletions
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c
index 45889f2..187ff3b 100644
--- a/sys/kern/vfs_vnops.c
+++ b/sys/kern/vfs_vnops.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)vfs_vnops.c 8.2 (Berkeley) 1/21/94
- * $Id: vfs_vnops.c,v 1.8 1995/02/14 06:31:13 phk Exp $
+ * $Id: vfs_vnops.c,v 1.9 1995/03/19 12:08:03 davidg Exp $
*/
#include <sys/param.h>
@@ -131,10 +131,10 @@ vn_open(ndp, fmode, cmode)
goto bad;
}
error = vn_writechk(vp);
- if(error)
+ if (error)
goto bad;
error = VOP_ACCESS(vp, VWRITE, cred, p);
- if(error)
+ if (error)
goto bad;
}
}
@@ -156,31 +156,32 @@ vn_open(ndp, fmode, cmode)
/*
* this is here for VMIO support
*/
- if( vp->v_type == VREG) {
+ if (vp->v_type == VREG) {
vm_object_t object;
vm_pager_t pager;
retry:
- if( (vp->v_flag & VVMIO) == 0) {
- pager = (vm_pager_t) vnode_pager_alloc(
- (caddr_t) vp, 0, 0, 0);
+ if ((vp->v_flag & VVMIO) == 0) {
+ pager = (vm_pager_t) vnode_pager_alloc(vp, 0, 0, 0);
object = (vm_object_t) vp->v_vmdata;
- if( object->pager != pager)
+ if (object->pager != pager)
panic("vn_open: pager/object mismatch");
- (void) vm_object_lookup( pager);
- pager_cache( object, TRUE);
+ (void) vm_object_lookup(pager);
+ pager_cache(object, TRUE);
vp->v_flag |= VVMIO;
} else {
- if( (object = (vm_object_t)vp->v_vmdata) &&
+ if ((object = (vm_object_t)vp->v_vmdata) &&
(object->flags & OBJ_DEAD)) {
- tsleep( (caddr_t) object, PVM, "vodead", 0);
+ VOP_UNLOCK(vp);
+ tsleep(object, PVM, "vodead", 0);
+ VOP_LOCK(vp);
goto retry;
}
- if( !object)
+ if (!object)
panic("vn_open: VMIO object missing");
pager = object->pager;
- if( !pager)
+ if (!pager)
panic("vn_open: VMIO pager missing");
- (void) vm_object_lookup( pager);
+ (void) vm_object_lookup(pager);
}
}
return (0);
OpenPOWER on IntegriCloud