Changeset View
Changeset View
Standalone View
Standalone View
sys/vm/vnode_pager.c
Show First 20 Lines • Show All 194 Lines • ▼ Show 20 Lines | vnode_destroy_vobject(struct vnode *vp) | ||||
ASSERT_VOP_ELOCKED(vp, "vnode_destroy_vobject"); | ASSERT_VOP_ELOCKED(vp, "vnode_destroy_vobject"); | ||||
VM_OBJECT_WLOCK(obj); | VM_OBJECT_WLOCK(obj); | ||||
umtx_shm_object_terminated(obj); | umtx_shm_object_terminated(obj); | ||||
if (obj->ref_count == 0) { | if (obj->ref_count == 0) { | ||||
/* | /* | ||||
* don't double-terminate the object | * don't double-terminate the object | ||||
*/ | */ | ||||
if ((obj->flags & OBJ_DEAD) == 0) { | if ((obj->flags & OBJ_DEAD) == 0) { | ||||
vm_object_terminate(obj); | vm_object_set_flag(obj, OBJ_DEAD); | ||||
/* | |||||
* Clean pages and flush buffers. | |||||
*/ | |||||
vm_object_page_clean(obj, 0, 0, OBJPC_SYNC); | |||||
VM_OBJECT_WUNLOCK(obj); | |||||
vinvalbuf(vp, V_SAVE, 0, 0); | |||||
BO_LOCK(&vp->v_bufobj); | |||||
vp->v_bufobj.bo_flag |= BO_DEAD; | |||||
BO_UNLOCK(&vp->v_bufobj); | |||||
VM_OBJECT_WLOCK(obj); | |||||
vm_object_terminate_dead(obj); | |||||
} else { | } else { | ||||
/* | /* | ||||
* Waiters were already handled during object | * Waiters were already handled during object | ||||
* termination. The exclusive vnode lock hopefully | * termination. The exclusive vnode lock hopefully | ||||
* prevented new waiters from referencing the dying | * prevented new waiters from referencing the dying | ||||
* object. | * object. | ||||
*/ | */ | ||||
KASSERT((obj->flags & OBJ_DISCONNECTWNT) == 0, | KASSERT((obj->flags & OBJ_DISCONNECTWNT) == 0, | ||||
▲ Show 20 Lines • Show All 1,379 Lines • Show Last 20 Lines |