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-all mailing list