git: e6ff640738b5 - stable/13 - nfs client: block vnode_pager_setsize() calls from nfscl_loadattrcache in nfs_write
Konstantin Belousov
kib at FreeBSD.org
Mon Aug 16 09:23:32 UTC 2021
The branch stable/13 has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=e6ff640738b5a158fa7de33349ca51d278609dc1
commit e6ff640738b5a158fa7de33349ca51d278609dc1
Author: Konstantin Belousov <kib at FreeBSD.org>
AuthorDate: 2021-01-22 21:47:06 +0000
Commit: Konstantin Belousov <kib at FreeBSD.org>
CommitDate: 2021-08-16 09:23:12 +0000
nfs client: block vnode_pager_setsize() calls from nfscl_loadattrcache in nfs_write
(cherry picked from commit aa8c1f8d84d2638a354e71f9593e978d00878243)
---
sys/fs/nfsclient/nfs_clbio.c | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/sys/fs/nfsclient/nfs_clbio.c b/sys/fs/nfsclient/nfs_clbio.c
index 67bc3b7ce4d5..f4b0855f7dda 100644
--- a/sys/fs/nfsclient/nfs_clbio.c
+++ b/sys/fs/nfsclient/nfs_clbio.c
@@ -903,7 +903,7 @@ ncl_write(struct vop_write_args *ap)
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;
@@ -995,6 +995,7 @@ ncl_write(struct vop_write_args *ap)
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
@@ -1033,7 +1034,7 @@ ncl_write(struct vop_write_args *ap)
error = ncl_vinvalbuf(vp, V_SAVE | ((ioflag &
IO_VMIO) != 0 ? V_VMIO : 0), td, 1);
if (error != 0)
- return (error);
+ goto out;
wouldcommit = biosize;
}
}
@@ -1073,6 +1074,7 @@ again:
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);
@@ -1102,6 +1104,7 @@ again:
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);
@@ -1291,6 +1294,13 @@ again:
}
}
+out:
+ curthread_pflags2_restore(save2);
+ if ((curthread->td_pflags2 & TDP2_SBPAGES) == 0) {
+ NFSLOCKNODE(np);
+ ncl_pager_setsize(vp, NULL);
+ }
+
return (error);
}
More information about the dev-commits-src-all
mailing list