On Fri, Jul 04, 2025 at 02:49:05PM +0300, Sergey Bashirov wrote: > The data type of loca_last_write_offset is newoffset4 and is switched > on a boolean value, no_newoffset, that indicates if a previous write > occurred or not. If no_newoffset is FALSE, an offset is not given. > This means that client does not try to update the file size. Thus, > server should not try to calculate new file size and check if it fits > into the seg range. > > Co-developed-by: Konstantin Evtushenko <koevtushenko@xxxxxxxxxx> > Signed-off-by: Konstantin Evtushenko <koevtushenko@xxxxxxxxxx> > Signed-off-by: Sergey Bashirov <sergeybashirov@xxxxxxxxx> > --- > fs/nfsd/blocklayout.c | 2 +- > fs/nfsd/nfs4proc.c | 16 ++++++++-------- > 2 files changed, 9 insertions(+), 9 deletions(-) > > diff --git a/fs/nfsd/blocklayout.c b/fs/nfsd/blocklayout.c > index 19078a043e85..ee6544bdc045 100644 > --- a/fs/nfsd/blocklayout.c > +++ b/fs/nfsd/blocklayout.c > @@ -118,7 +118,7 @@ nfsd4_block_commit_blocks(struct inode *inode, struct nfsd4_layoutcommit *lcp, > struct iomap *iomaps, int nr_iomaps) > { > struct timespec64 mtime = inode_get_mtime(inode); > - loff_t new_size = lcp->lc_last_wr + 1; > + loff_t new_size = (lcp->lc_newoffset) ? lcp->lc_last_wr + 1 : 0; > struct iattr iattr = { .ia_valid = 0 }; > int error; Please guard the entire new_size check below instead, i.e. if (lcp->lc_newoffset) { loff_t new_size = lcp->lc_last_wr + 1; if (new_size > i_size_read(inode)) { iattr.ia_valid |= ATTR_SIZE; iattr.ia_size = new_size; } } > diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c > index 37bdb937a0ae..ff38be803d8b 100644 > --- a/fs/nfsd/nfs4proc.c > +++ b/fs/nfsd/nfs4proc.c > @@ -2482,7 +2482,7 @@ nfsd4_layoutcommit(struct svc_rqst *rqstp, > const struct nfsd4_layout_seg *seg = &lcp->lc_seg; > struct svc_fh *current_fh = &cstate->current_fh; > const struct nfsd4_layout_ops *ops; > - loff_t new_size = lcp->lc_last_wr + 1; > + loff_t new_size = (lcp->lc_newoffset) ? lcp->lc_last_wr + 1 : 0; Same here.