Refactor nfsd_vfs_write() to support splitting a WRITE into parts (which will be either misaligned or DIO-aligned). Doing so in a preliminary commit just allows for indentation and slight transformation to be more easily understood and reviewed. Signed-off-by: Mike Snitzer <snitzer@xxxxxxxxxx> Reviewed-by: Jeff Layton <jlayton@xxxxxxxxxx> --- fs/nfsd/vfs.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 609b85f8bde3e..0d4f9f452d466 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c @@ -1342,7 +1342,6 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct super_block *sb = file_inode(file)->i_sb; struct kiocb kiocb; struct svc_export *exp; - struct iov_iter iter; errseq_t since; __be32 nfserr; int host_err; @@ -1350,6 +1349,9 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, unsigned int pflags = current->flags; bool restore_flags = false; unsigned int nvecs; + struct iov_iter iter_stack[1]; + struct iov_iter *iter = iter_stack; + unsigned int n_iters = 0; trace_nfsd_write_opened(rqstp, fhp, offset, *cnt); @@ -1379,14 +1381,15 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, kiocb.ki_flags |= IOCB_DSYNC; nvecs = xdr_buf_to_bvec(rqstp->rq_bvec, rqstp->rq_maxpages, payload); - iov_iter_bvec(&iter, ITER_SOURCE, rqstp->rq_bvec, nvecs, *cnt); + iov_iter_bvec(&iter[0], ITER_SOURCE, rqstp->rq_bvec, nvecs, *cnt); + n_iters++; switch (nfsd_io_cache_write) { case NFSD_IO_DIRECT: /* direct I/O must be aligned to device logical sector size */ if (nf->nf_dio_mem_align && nf->nf_dio_offset_align && (((offset | *cnt) & (nf->nf_dio_offset_align-1)) == 0) && - iov_iter_is_aligned(&iter, nf->nf_dio_mem_align - 1, + iov_iter_is_aligned(&iter[0], nf->nf_dio_mem_align - 1, nf->nf_dio_offset_align - 1)) kiocb.ki_flags = IOCB_DIRECT; break; @@ -1400,13 +1403,17 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, since = READ_ONCE(file->f_wb_err); if (verf) nfsd_copy_write_verifier(verf, nn); - host_err = vfs_iocb_iter_write(file, &kiocb, &iter); - if (host_err < 0) { - commit_reset_write_verifier(nn, rqstp, host_err); - goto out_nfserr; + *cnt = 0; + for (int i = 0; i < n_iters; i++) { + host_err = vfs_iocb_iter_write(file, &kiocb, &iter[i]); + if (host_err < 0) { + commit_reset_write_verifier(nn, rqstp, host_err); + goto out_nfserr; + } + *cnt += host_err; + nfsd_stats_io_write_add(nn, exp, host_err); } - *cnt = host_err; - nfsd_stats_io_write_add(nn, exp, *cnt); + fsnotify_modify(file); host_err = filemap_check_wb_err(file->f_mapping, since); if (host_err < 0) -- 2.44.0