summaryrefslogtreecommitdiff
path: root/sys/vm
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2011-04-26 12:07:07 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2011-04-26 12:07:07 +0000
commitcf297315fc8e3e7f95ac54e2620fca45e21f1240 (patch)
tree5164b7f4526494b402c83e3d1e8aabb02aa109e6 /sys/vm
parent7f6b034f1ebaede0f9034e6ffa81a812bfff0d3a (diff)
Notes
Diffstat (limited to 'sys/vm')
-rw-r--r--sys/vm/vm_object.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c
index a541d59346b8..0f71c6ad95de 100644
--- a/sys/vm/vm_object.c
+++ b/sys/vm/vm_object.c
@@ -447,14 +447,21 @@ vm_object_vndeallocate(vm_object_t object)
/* 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);
+ }
}
}