From 23aacadb399d3f3dd29eaa0a598b0359a2cd352a Mon Sep 17 00:00:00 2001 From: dwmalone Date: Tue, 24 Oct 2000 10:13:36 +0000 Subject: Problem to avoid processes getting stuck in "vmopar". From Ian's mail: The problem seems to originate with NFS's postop_attr information that is returned with a read or write RPC. Within a vm_fault context, the code cannot deal with vnode_pager_setsize() shrinking a vnode. The workaround in the patch below stops the nfsm_postop_attr() macro from ever shrinking a vnode. If the new size in the postop_attr information is smaller, then it just sets the nfsnode n_attrstamp to 0 to stop the wrong size getting used in the future. This change only affects postop_attr attributes; the nfsm_loadattr() macro works as normal. The change is implemented by adding a new argument to nfs_loadattrcache() called 'dontshrink'. When this is non-zero, nfs_loadattrcache() will never reduce the vnode/nfsnode size; instead it zeros n_attrstamp. There remain other was processes can get stuck in vmopar. Submitted by: Ian Dowse Reviewed by: dillon Tested by: Vadim Belman --- sys/nfsclient/nfs_subs.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'sys/nfsclient/nfs_subs.c') diff --git a/sys/nfsclient/nfs_subs.c b/sys/nfsclient/nfs_subs.c index 5934465..95f7d5b 100644 --- a/sys/nfsclient/nfs_subs.c +++ b/sys/nfsclient/nfs_subs.c @@ -1203,11 +1203,12 @@ nfs_uninit(vfsp) * copy the attributes to *vaper */ int -nfs_loadattrcache(vpp, mdp, dposp, vaper) +nfs_loadattrcache(vpp, mdp, dposp, vaper, dontshrink) struct vnode **vpp; struct mbuf **mdp; caddr_t *dposp; struct vattr *vaper; + int dontshrink; { register struct vnode *vp = *vpp; register struct vattr *vap; @@ -1323,9 +1324,18 @@ nfs_loadattrcache(vpp, mdp, dposp, vaper) vap->va_gen = fxdr_unsigned(u_int32_t,fp->fa2_ctime.nfsv2_usec); vap->va_filerev = 0; } + np->n_attrstamp = time_second; if (vap->va_size != np->n_size) { if (vap->va_type == VREG) { - if (np->n_flag & NMODIFIED) { + if (dontshrink && vap->va_size < np->n_size) { + /* + * We've been told not to shrink the file; + * zero np->n_attrstamp to indicate that + * the attributes are stale. + */ + vap->va_size = np->n_size; + np->n_attrstamp = 0; + } else if (np->n_flag & NMODIFIED) { if (vap->va_size < np->n_size) vap->va_size = np->n_size; else @@ -1338,7 +1348,6 @@ nfs_loadattrcache(vpp, mdp, dposp, vaper) np->n_size = vap->va_size; } } - np->n_attrstamp = time_second; if (vaper != NULL) { bcopy((caddr_t)vap, (caddr_t)vaper, sizeof(*vap)); if (np->n_flag & NCHG) { -- cgit v1.1