From 7146d6cb3e9b88a881f8133cb98106feb39a1f44 Mon Sep 17 00:00:00 2001 From: Poul-Henning Kamp Date: Fri, 28 Jan 2005 08:56:48 +0000 Subject: [PATCH] Move the contents of vop_stddestroyvobject() to the new vnode_pager function vnode_destroy_vobject(). Make the new function zero the vp->v_object pointer so we can tell if a call is missing. --- sys/kern/vfs_default.c | 26 +------------------------- sys/sys/vnode.h | 1 + sys/vm/vnode_pager.c | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 25 deletions(-) diff --git a/sys/kern/vfs_default.c b/sys/kern/vfs_default.c index 1798a9ec0cbb..73643e013c70 100644 --- a/sys/kern/vfs_default.c +++ b/sys/kern/vfs_default.c @@ -366,32 +366,8 @@ vop_stddestroyvobject(ap) struct vnode *vp; } */ *ap; { - struct vnode *vp = ap->a_vp; - vm_object_t obj = vp->v_object; - if (obj == NULL) - return (0); - VM_OBJECT_LOCK(obj); - if (obj->ref_count == 0) { - /* - * vclean() may be called twice. The first time - * removes the primary reference to the object, - * the second time goes one further and is a - * special-case to terminate the object. - * - * don't double-terminate the object - */ - if ((obj->flags & OBJ_DEAD) == 0) - vm_object_terminate(obj); - else - VM_OBJECT_UNLOCK(obj); - } else { - /* - * Woe to the process that tries to page now :-). - */ - vm_pager_deallocate(obj); - VM_OBJECT_UNLOCK(obj); - } + vnode_destroy_vobject(ap->a_vp); return (0); } diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h index 8445326ac3ac..ea55ece339e3 100644 --- a/sys/sys/vnode.h +++ b/sys/sys/vnode.h @@ -687,6 +687,7 @@ void vbusy(struct vnode *vp); void v_addpollinfo(struct vnode *vp); int vnode_create_vobject(struct vnode *vp, size_t size, struct thread *td); +void vnode_destroy_vobject(struct vnode *vp); extern struct vop_vector fifo_specops; extern struct vop_vector dead_vnodeops; diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c index 96aa36ceb084..0f9c3ebd5337 100644 --- a/sys/vm/vnode_pager.c +++ b/sys/vm/vnode_pager.c @@ -150,6 +150,39 @@ vnode_create_vobject(struct vnode *vp, size_t isize, struct thread *td) return (0); } +void +vnode_destroy_vobject(struct vnode *vp) +{ + struct vm_object *obj; + + obj = vp->v_object; + if (obj == NULL) + return; + vp->v_object = NULL; + VM_OBJECT_LOCK(obj); + if (obj->ref_count == 0) { + /* + * vclean() may be called twice. The first time + * removes the primary reference to the object, + * the second time goes one further and is a + * special-case to terminate the object. + * + * don't double-terminate the object + */ + if ((obj->flags & OBJ_DEAD) == 0) + vm_object_terminate(obj); + else + VM_OBJECT_UNLOCK(obj); + } else { + /* + * Woe to the process that tries to page now :-). + */ + vm_pager_deallocate(obj); + VM_OBJECT_UNLOCK(obj); + } +} + + /* * Allocate (or lookup) pager for a vnode. * Handle is a vnode pointer.