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);
+               }
        }
 }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to