diff options
author | ups <ups@FreeBSD.org> | 2008-06-12 20:46:47 +0000 |
---|---|---|
committer | ups <ups@FreeBSD.org> | 2008-06-12 20:46:47 +0000 |
commit | 16b9649ce4bef3616af728e0639b5919187612ec (patch) | |
tree | 5d90514763aef321689ec1a716c0e5ae498b3f3e /sys/vm | |
parent | 2f592aa3d469fbead0b060bef1d07632adec9ea1 (diff) | |
download | FreeBSD-src-16b9649ce4bef3616af728e0639b5919187612ec.zip FreeBSD-src-16b9649ce4bef3616af728e0639b5919187612ec.tar.gz |
Fix vm object creation locking to allow SHARED vnode locking for vnode_create_vobject.
(Not currently used)
Noticed by: kib@
Diffstat (limited to 'sys/vm')
-rw-r--r-- | sys/vm/vnode_pager.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c index 40e75d9..4758456 100644 --- a/sys/vm/vnode_pager.c +++ b/sys/vm/vnode_pager.c @@ -225,20 +225,21 @@ retry: object->handle = handle; if (VFS_NEEDSGIANT(vp->v_mount)) vm_object_set_flag(object, OBJ_NEEDGIANT); - VM_OBJECT_LOCK(object); - if ( vp->v_object != NULL) { + VI_LOCK(vp); + if (vp->v_object != NULL) { /* * Object has been created while we were sleeping */ - VM_OBJECT_UNLOCK(object); + VI_UNLOCK(vp); vm_object_destroy(object); goto retry; } vp->v_object = object; - } else + VI_UNLOCK(vp); + } else { object->ref_count++; - - VM_OBJECT_UNLOCK(object); + VM_OBJECT_UNLOCK(object); + } vref(vp); return (object); } |