svn commit: r221061 - stable/8/sys/vm
Konstantin Belousov
kib at FreeBSD.org
Tue Apr 26 12:07:08 UTC 2011
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);
+ }
}
}
More information about the svn-src-stable-8
mailing list