diff --git a/sys/fs/nfs/nfsport.h.orig b/sys/fs/nfs/nfsport.h --- a/sys/fs/nfs/nfsport.h.orig +++ b/sys/fs/nfs/nfsport.h @@ -995,7 +995,7 @@ int nfscl_loadattrcache(struct vnode **, struct nfsvattr *, void *, void *, int, int); int newnfs_realign(struct mbuf **, int); -bool ncl_pager_setsize(struct vnode *vp, u_quad_t *nsizep); +bool ncl_pager_setsize(struct vnode *vp, u_quad_t nsize, u_quad_t *nsizep); /* * If the port runs on an SMP box that can enforce Atomic ops with low diff --git a/sys/fs/nfsclient/nfs_clbio.c.orig b/sys/fs/nfsclient/nfs_clbio.c --- a/sys/fs/nfsclient/nfs_clbio.c.orig +++ b/sys/fs/nfsclient/nfs_clbio.c @@ -723,7 +723,7 @@ curthread_pflags2_restore(save2); if ((curthread->td_pflags2 & TDP2_SBPAGES) == 0) { NFSLOCKNODE(np); - ncl_pager_setsize(vp, NULL); + ncl_pager_setsize(vp, np->n_vattr.na_size, NULL); } return (error); } @@ -893,7 +893,7 @@ struct nfsmount *nmp = VFSTONFS(vp->v_mount); daddr_t lbn; int bcount, noncontig_write, obcount; - int bp_cached, n, on, error = 0, error1, wouldcommit; + int bp_cached, n, on, error = 0, error1, save2, wouldcommit; size_t orig_resid, local_resid; off_t orig_size, tmp_off; @@ -985,6 +985,7 @@ if (vn_rlimit_fsize(vp, uio, td)) return (EFBIG); + save2 = curthread_pflags2_set(TDP2_SBPAGES); biosize = vp->v_bufobj.bo_bsize; /* * Find all of this file's B_NEEDCOMMIT buffers. If our writes @@ -1023,7 +1024,7 @@ error = ncl_vinvalbuf(vp, V_SAVE | ((ioflag & IO_VMIO) != 0 ? V_VMIO : 0), td, 1); if (error != 0) - return (error); + goto out; wouldcommit = biosize; } } @@ -1063,6 +1064,7 @@ NFSLOCKNODE(np); np->n_size = uio->uio_offset + n; np->n_flag |= NMODIFIED; + np->n_flag &= ~NVNSETSZSKIP; vnode_pager_setsize(vp, np->n_size); NFSUNLOCKNODE(np); @@ -1092,6 +1094,7 @@ if (uio->uio_offset + n > np->n_size) { np->n_size = uio->uio_offset + n; np->n_flag |= NMODIFIED; + np->n_flag &= ~NVNSETSZSKIP; vnode_pager_setsize(vp, np->n_size); } NFSUNLOCKNODE(np); @@ -1279,6 +1282,13 @@ uio->uio_offset -= orig_resid - uio->uio_resid; uio->uio_resid = orig_resid; } + } + +out: + curthread_pflags2_restore(save2); + if ((curthread->td_pflags2 & TDP2_SBPAGES) == 0) { + NFSLOCKNODE(np); + ncl_pager_setsize(vp, np->n_size, NULL); } return (error); diff --git a/sys/fs/nfsclient/nfs_clport.c.orig b/sys/fs/nfsclient/nfs_clport.c --- a/sys/fs/nfsclient/nfs_clport.c.orig +++ b/sys/fs/nfsclient/nfs_clport.c @@ -565,7 +565,7 @@ if (np->n_attrstamp != 0) KDTRACE_NFS_ATTRCACHE_LOAD_DONE(vp, vap, error); #endif - (void)ncl_pager_setsize(vp, NULL); + (void)ncl_pager_setsize(vp, vap->va_size, NULL); return (error); } diff --git a/sys/fs/nfsclient/nfs_clsubs.c.orig b/sys/fs/nfsclient/nfs_clsubs.c --- a/sys/fs/nfsclient/nfs_clsubs.c.orig +++ b/sys/fs/nfsclient/nfs_clsubs.c @@ -243,7 +243,7 @@ } else { np->n_size = vap->va_size; } - setnsize = ncl_pager_setsize(vp, &nsize); + setnsize = ncl_pager_setsize(vp, 0, &nsize); } else { np->n_size = vap->va_size; }