From 081129c5e39d1f59e63bacf97d7ea2eeeab5439f Mon Sep 17 00:00:00 2001 From: David Greenman Date: Mon, 6 Feb 1995 02:20:40 +0000 Subject: [PATCH] Changed order of release of vnode/object to fix a problem where the vnode is freed with an old object still attached (subsequently causing a panic). Fixes NFS server panic "object/pager mismatch". Submitted by: John Dyson --- sys/nfs/nfs_common.c | 11 +++++++---- sys/nfs/nfs_subs.c | 11 +++++++---- sys/nfsclient/nfs_subs.c | 11 +++++++---- sys/nfsserver/nfs_srvsubs.c | 11 +++++++---- 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/sys/nfs/nfs_common.c b/sys/nfs/nfs_common.c index f28136087602..7b2cf6441f61 100644 --- a/sys/nfs/nfs_common.c +++ b/sys/nfs/nfs_common.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * @(#)nfs_subs.c 8.3 (Berkeley) 1/4/94 - * $Id: nfs_subs.c,v 1.7 1994/10/17 17:47:37 phk Exp $ + * $Id: nfs_subs.c,v 1.8 1995/01/09 16:05:08 davidg Exp $ */ /* @@ -1207,17 +1207,20 @@ nfsrv_vmio( struct vnode *vp) { int nfsrv_vput( struct vnode *vp) { if( (vp->v_flag & VVMIO) && vp->v_vmdata) { + vput( vp); vm_object_deallocate( (vm_object_t) vp->v_vmdata); + } else { + vput( vp); } - vput( vp); return 0; } int nfsrv_vrele( struct vnode *vp) { if( (vp->v_flag & VVMIO) && vp->v_vmdata) { + vrele( vp); vm_object_deallocate( (vm_object_t) vp->v_vmdata); + } else { + vrele( vp); } - vrele( vp); return 0; } - diff --git a/sys/nfs/nfs_subs.c b/sys/nfs/nfs_subs.c index f28136087602..7b2cf6441f61 100644 --- a/sys/nfs/nfs_subs.c +++ b/sys/nfs/nfs_subs.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * @(#)nfs_subs.c 8.3 (Berkeley) 1/4/94 - * $Id: nfs_subs.c,v 1.7 1994/10/17 17:47:37 phk Exp $ + * $Id: nfs_subs.c,v 1.8 1995/01/09 16:05:08 davidg Exp $ */ /* @@ -1207,17 +1207,20 @@ nfsrv_vmio( struct vnode *vp) { int nfsrv_vput( struct vnode *vp) { if( (vp->v_flag & VVMIO) && vp->v_vmdata) { + vput( vp); vm_object_deallocate( (vm_object_t) vp->v_vmdata); + } else { + vput( vp); } - vput( vp); return 0; } int nfsrv_vrele( struct vnode *vp) { if( (vp->v_flag & VVMIO) && vp->v_vmdata) { + vrele( vp); vm_object_deallocate( (vm_object_t) vp->v_vmdata); + } else { + vrele( vp); } - vrele( vp); return 0; } - diff --git a/sys/nfsclient/nfs_subs.c b/sys/nfsclient/nfs_subs.c index f28136087602..7b2cf6441f61 100644 --- a/sys/nfsclient/nfs_subs.c +++ b/sys/nfsclient/nfs_subs.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * @(#)nfs_subs.c 8.3 (Berkeley) 1/4/94 - * $Id: nfs_subs.c,v 1.7 1994/10/17 17:47:37 phk Exp $ + * $Id: nfs_subs.c,v 1.8 1995/01/09 16:05:08 davidg Exp $ */ /* @@ -1207,17 +1207,20 @@ nfsrv_vmio( struct vnode *vp) { int nfsrv_vput( struct vnode *vp) { if( (vp->v_flag & VVMIO) && vp->v_vmdata) { + vput( vp); vm_object_deallocate( (vm_object_t) vp->v_vmdata); + } else { + vput( vp); } - vput( vp); return 0; } int nfsrv_vrele( struct vnode *vp) { if( (vp->v_flag & VVMIO) && vp->v_vmdata) { + vrele( vp); vm_object_deallocate( (vm_object_t) vp->v_vmdata); + } else { + vrele( vp); } - vrele( vp); return 0; } - diff --git a/sys/nfsserver/nfs_srvsubs.c b/sys/nfsserver/nfs_srvsubs.c index f28136087602..7b2cf6441f61 100644 --- a/sys/nfsserver/nfs_srvsubs.c +++ b/sys/nfsserver/nfs_srvsubs.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * @(#)nfs_subs.c 8.3 (Berkeley) 1/4/94 - * $Id: nfs_subs.c,v 1.7 1994/10/17 17:47:37 phk Exp $ + * $Id: nfs_subs.c,v 1.8 1995/01/09 16:05:08 davidg Exp $ */ /* @@ -1207,17 +1207,20 @@ nfsrv_vmio( struct vnode *vp) { int nfsrv_vput( struct vnode *vp) { if( (vp->v_flag & VVMIO) && vp->v_vmdata) { + vput( vp); vm_object_deallocate( (vm_object_t) vp->v_vmdata); + } else { + vput( vp); } - vput( vp); return 0; } int nfsrv_vrele( struct vnode *vp) { if( (vp->v_flag & VVMIO) && vp->v_vmdata) { + vrele( vp); vm_object_deallocate( (vm_object_t) vp->v_vmdata); + } else { + vrele( vp); } - vrele( vp); return 0; } -