Move OBJT_VNODE specific code from vm_object_terminate() to

vnode_destroy_vobject().

Reviewed by:	alc, jeff (previous version), markj
Tested by:	pho
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D21357
This commit is contained in:
Konstantin Belousov 2019-08-25 13:26:06 +00:00
parent 4e8671dd78
commit 783a68aa33
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=351478
2 changed files with 20 additions and 30 deletions

View file

@ -653,9 +653,10 @@ vm_object_deallocate(vm_object_t object)
* recursion due to the terminate having to sync data
* to disk.
*/
if ((object->flags & OBJ_DEAD) == 0)
if ((object->flags & OBJ_DEAD) == 0) {
vm_object_set_flag(object, OBJ_DEAD);
vm_object_terminate(object);
else
} else
VM_OBJECT_WUNLOCK(object);
object = temp;
}
@ -746,35 +747,9 @@ vm_object_terminate_pages(vm_object_t object)
void
vm_object_terminate(vm_object_t object)
{
VM_OBJECT_ASSERT_WLOCKED(object);
/*
* Make sure no one uses us.
*/
vm_object_set_flag(object, OBJ_DEAD);
/*
* Clean and free the pages, as appropriate. All references to the
* object are gone, so we don't need to lock it.
*/
if (object->type == OBJT_VNODE) {
struct vnode *vp = (struct vnode *)object->handle;
/*
* Clean pages and flush buffers.
*/
vm_object_page_clean(object, 0, 0, OBJPC_SYNC);
VM_OBJECT_WUNLOCK(object);
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(object);
}
KASSERT((object->flags & OBJ_DEAD) != 0,
("terminating non-dead obj %p", object));
/*
* wait for the pageout daemon to be done with the object

View file

@ -200,6 +200,21 @@ vnode_destroy_vobject(struct vnode *vp)
* don't double-terminate the object
*/
if ((obj->flags & OBJ_DEAD) == 0) {
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(obj);
} else {
/*