diff options
-rw-r--r-- | sys/kern/vfs_default.c | 28 | ||||
-rw-r--r-- | sys/sys/vnode.h | 1 | ||||
-rw-r--r-- | sys/vm/vnode_pager.c | 33 |
3 files changed, 36 insertions, 26 deletions
diff --git a/sys/kern/vfs_default.c b/sys/kern/vfs_default.c index 1798a9e..73643e0 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 8445326..ea55ece 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 96aa36c..0f9c3eb 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. |