diff options
| author | Konstantin Belousov <kib@FreeBSD.org> | 2011-04-26 12:07:07 +0000 |
|---|---|---|
| committer | Konstantin Belousov <kib@FreeBSD.org> | 2011-04-26 12:07:07 +0000 |
| commit | cf297315fc8e3e7f95ac54e2620fca45e21f1240 (patch) | |
| tree | 5164b7f4526494b402c83e3d1e8aabb02aa109e6 /sys/vm | |
| parent | 7f6b034f1ebaede0f9034e6ffa81a812bfff0d3a (diff) | |
Notes
Diffstat (limited to 'sys/vm')
| -rw-r--r-- | sys/vm/vm_object.c | 15 |
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); + } } } |
