summaryrefslogtreecommitdiffstats
path: root/sys/vm
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2014-03-19 13:04:16 +0000
committerkib <kib@FreeBSD.org>2014-03-19 13:04:16 +0000
commit741b07ba7dba76992a59fbc194237db0bc56c0da (patch)
treee5a9f8877d89fb494645d1feb9916fb5d1a2c859 /sys/vm
parent5484edfdac67206f6b345270ebbd62b56adaed47 (diff)
downloadFreeBSD-src-741b07ba7dba76992a59fbc194237db0bc56c0da.zip
FreeBSD-src-741b07ba7dba76992a59fbc194237db0bc56c0da.tar.gz
MFC r263092:
Do not vdrop() the tmpfs vnode until it is unlocked. The hold reference might be the last, and then vdrop() would free the vnode.
Diffstat (limited to 'sys/vm')
-rw-r--r--sys/vm/vm_object.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c
index 6fbecc7..f5c9cbe 100644
--- a/sys/vm/vm_object.c
+++ b/sys/vm/vm_object.c
@@ -536,17 +536,18 @@ vm_object_deallocate(vm_object_t object)
vhold(vp);
VM_OBJECT_WUNLOCK(object);
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
- vdrop(vp);
VM_OBJECT_WLOCK(object);
if (object->type == OBJT_DEAD ||
object->ref_count != 1) {
VM_OBJECT_WUNLOCK(object);
VOP_UNLOCK(vp, 0);
+ vdrop(vp);
return;
}
if ((object->flags & OBJ_TMPFS) != 0)
VOP_UNSET_TEXT(vp);
VOP_UNLOCK(vp, 0);
+ vdrop(vp);
}
if (object->shadow_count == 0 &&
object->handle == NULL &&
OpenPOWER on IntegriCloud