Author: kib
Date: Tue Apr 26 12:07:07 2011
New Revision: 221061
URL: http://svn.freebsd.org/changeset/base/221061
Log:
MFC r220977:
Fix two bugs in r218670.
Hold the vnode around the region where object lock is dropped, until
vnode lock is acquired.
Do not drop the vnode reference for a case when the object was
deallocated during unlock. Note that in this case, VV_TEXT is cleared
by vnode_pager_dealloc().
Modified:
stable/8/sys/vm/vm_object.c
Directory Properties:
stable/8/sys/ (props changed)
stable/8/sys/amd64/include/xen/ (props changed)
stable/8/sys/cddl/contrib/opensolaris/ (props changed)
stable/8/sys/contrib/dev/acpica/ (props changed)
stable/8/sys/contrib/pf/ (props changed)
Modified: stable/8/sys/vm/vm_object.c
==============================================================================
--- stable/8/sys/vm/vm_object.c Tue Apr 26 11:43:57 2011 (r221060)
+++ stable/8/sys/vm/vm_object.c Tue Apr 26 12:07:07 2011 (r221061)
@@ -447,14 +447,21 @@ vm_object_vndeallocate(vm_object_t objec
/* vrele may need the vnode lock. */
vrele(vp);
} else {
+ vhold(vp);
VM_OBJECT_UNLOCK(object);
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
+ vdrop(vp);
VM_OBJECT_LOCK(object);
object->ref_count--;
- if (object->ref_count == 0)
- vp->v_vflag &= ~VV_TEXT;
- VM_OBJECT_UNLOCK(object);
- vput(vp);
+ if (object->type == OBJT_DEAD) {
+ VM_OBJECT_UNLOCK(object);
+ VOP_UNLOCK(vp, 0);
+ } else {
+ if (object->ref_count == 0)
+ vp->v_vflag &= ~VV_TEXT;
+ VM_OBJECT_UNLOCK(object);
+ vput(vp);
+ }
}
}
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"