From 576dd5e9f61048e157385203efbf83c1d9afac6f Mon Sep 17 00:00:00 2001 From: dyson Date: Thu, 17 Oct 1996 02:49:35 +0000 Subject: Clean up the rundown of the object backing a vnode. This should fix NFS problems associated with forcible dismounts. --- sys/kern/vfs_export.c | 13 +++++++++++-- sys/kern/vfs_subr.c | 13 +++++++++++-- sys/vm/vm_object.h | 3 ++- sys/vm/vnode_pager.c | 8 +++++++- 4 files changed, 31 insertions(+), 6 deletions(-) (limited to 'sys') diff --git a/sys/kern/vfs_export.c b/sys/kern/vfs_export.c index 61764b1..c3badf7 100644 --- a/sys/kern/vfs_export.c +++ b/sys/kern/vfs_export.c @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)vfs_subr.c 8.13 (Berkeley) 4/18/94 - * $Id: vfs_subr.c,v 1.60 1996/09/19 18:20:22 nate Exp $ + * $Id: vfs_subr.c,v 1.61 1996/09/28 03:36:07 dyson Exp $ */ /* @@ -979,8 +979,11 @@ loop: (vp->v_writecount == 0 || vp->v_type != VREG)) continue; - if ((vp->v_usecount == 1) && vp->v_object) { + if (vp->v_object && (vp->v_object->flags & OBJ_VFS_REF)) { + vm_object_reference(vp->v_object); pager_cache(vp->v_object, FALSE); + vp->v_object->flags &= ~OBJ_VFS_REF; + vm_object_deallocate(vp->v_object); } /* @@ -991,6 +994,7 @@ loop: vgone(vp); continue; } + /* * If FORCECLOSE is set, forcibly close the vnode. For block * or character devices, revert to an anonymous device. For @@ -1149,6 +1153,11 @@ vgone(vp) (void) tsleep((caddr_t) vp, PINOD, "vgone", 0); return; } + + if (vp->v_object) { + vp->v_object->flags |= OBJ_VNODE_GONE; + } + /* * Clean out the filesystem specific data. */ diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index 61764b1..c3badf7 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)vfs_subr.c 8.13 (Berkeley) 4/18/94 - * $Id: vfs_subr.c,v 1.60 1996/09/19 18:20:22 nate Exp $ + * $Id: vfs_subr.c,v 1.61 1996/09/28 03:36:07 dyson Exp $ */ /* @@ -979,8 +979,11 @@ loop: (vp->v_writecount == 0 || vp->v_type != VREG)) continue; - if ((vp->v_usecount == 1) && vp->v_object) { + if (vp->v_object && (vp->v_object->flags & OBJ_VFS_REF)) { + vm_object_reference(vp->v_object); pager_cache(vp->v_object, FALSE); + vp->v_object->flags &= ~OBJ_VFS_REF; + vm_object_deallocate(vp->v_object); } /* @@ -991,6 +994,7 @@ loop: vgone(vp); continue; } + /* * If FORCECLOSE is set, forcibly close the vnode. For block * or character devices, revert to an anonymous device. For @@ -1149,6 +1153,11 @@ vgone(vp) (void) tsleep((caddr_t) vp, PINOD, "vgone", 0); return; } + + if (vp->v_object) { + vp->v_object->flags |= OBJ_VNODE_GONE; + } + /* * Clean out the filesystem specific data. */ diff --git a/sys/vm/vm_object.h b/sys/vm/vm_object.h index e62a14b..4a19888 100644 --- a/sys/vm/vm_object.h +++ b/sys/vm/vm_object.h @@ -61,7 +61,7 @@ * any improvements or extensions that they make and grant Carnegie the * rights to redistribute these changes. * - * $Id: vm_object.h,v 1.31 1996/09/28 03:33:31 dyson Exp $ + * $Id: vm_object.h,v 1.32 1996/10/15 18:23:38 bde Exp $ */ /* @@ -133,6 +133,7 @@ struct vm_object { #define OBJ_VFS_REF 0x0400 /* object is refed by vfs layer */ +#define OBJ_VNODE_GONE 0x0800 /* vnode is gone */ #define OBJ_NORMAL 0x0 /* default behavior */ #define OBJ_SEQUENTIAL 0x1 /* expect sequential accesses */ #define OBJ_RANDOM 0x2 /* expect random accesses */ diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c index 6f31dd3..7581086 100644 --- a/sys/vm/vnode_pager.c +++ b/sys/vm/vnode_pager.c @@ -38,7 +38,7 @@ * SUCH DAMAGE. * * from: @(#)vnode_pager.c 7.5 (Berkeley) 4/20/91 - * $Id: vnode_pager.c,v 1.63 1996/08/21 21:56:23 dyson Exp $ + * $Id: vnode_pager.c,v 1.64 1996/09/10 05:28:23 dyson Exp $ */ /* @@ -614,6 +614,8 @@ vnode_pager_getpages(object, m, count, reqpage) { int rtval; struct vnode *vp; + if (object->flags & OBJ_VNODE_GONE) + return VM_PAGER_ERROR; vp = object->handle; rtval = VOP_GETPAGES(vp, m, count*PAGE_SIZE, reqpage, 0); if (rtval == EOPNOTSUPP) @@ -857,6 +859,10 @@ vnode_pager_putpages(object, m, count, sync, rtvals) { int rtval; struct vnode *vp; + + if (object->flags & OBJ_VNODE_GONE) + return VM_PAGER_ERROR; + vp = object->handle; rtval = VOP_PUTPAGES(vp, m, count*PAGE_SIZE, sync, rtvals, 0); if (rtval == EOPNOTSUPP) -- cgit v1.1