From: bfields@fieldses.org (J. Bruce Fields)
To: Chuck Lever <chuck.lever@oracle.com>
Cc: linux-nfs@vger.kernel.org
Subject: Re: [PATCH RFC] NFSD: Fix zero-length NFSv3 WRITEs
Date: Mon, 3 Jan 2022 16:00:13 -0500 [thread overview]
Message-ID: <20220103210013.GK21514@fieldses.org> (raw)
In-Reply-To: <164010014140.6448.18108343631467243001.stgit@klimt.1015granger.net>
On Tue, Dec 21, 2021 at 10:23:25AM -0500, Chuck Lever wrote:
> The Linux NFS server currently responds to a zero-length NFSv3 WRITE
> request with NFS3ERR_IO. It responds to a zero-length NFSv4 WRITE
> with NFS4_OK and count of zero.
>
> RFC 1813 says of the WRITE procedure's @count argument:
>
> count
> The number of bytes of data to be written. If count is
> 0, the WRITE will succeed and return a count of 0,
> barring errors due to permissions checking.
>
> RFC 8881 has similar language for NFSv4, though NFSv4 removed the
> explicit @count argument because that value is already contained in
> the opaque payload array.
>
> The synthetic client pynfs's WRT4 and WRT15 tests do emit zero-
> length WRITEs to exercise this spec requirement, but interestingly
> the Linux NFS client does not appear to emit zero-length WRITEs,
> instead squelching them.
>
> I'm not aware of a test that can generate such WRITEs for NFSv3, so
> I wrote a naive C program to generate a zero-length WRITE and test
> this fix.
I know it's probably only a few lines, but still may be worth posting
somewhere and making it the start of a collection of protocol-level v3
tests.
--b.
>
> Fixes: 14168d678a0f ("NFSD: Remove the RETURN_STATUS() macro")
> Reported-by: Trond Myklebust <trond.myklebust@hammerspace.com>
> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
> ---
>
> Here's an alternate approach to addressing the zero-length NFSv3
> WRITE failures.
>
>
> fs/nfsd/nfs3proc.c | 6 +-----
> fs/nfsd/nfsproc.c | 5 -----
> 2 files changed, 1 insertion(+), 10 deletions(-)
>
> diff --git a/fs/nfsd/nfs3proc.c b/fs/nfsd/nfs3proc.c
> index 4418517f6f12..2c681785186f 100644
> --- a/fs/nfsd/nfs3proc.c
> +++ b/fs/nfsd/nfs3proc.c
> @@ -202,15 +202,11 @@ nfsd3_proc_write(struct svc_rqst *rqstp)
> fh_copy(&resp->fh, &argp->fh);
> resp->committed = argp->stable;
> nvecs = svc_fill_write_vector(rqstp, &argp->payload);
> - if (!nvecs) {
> - resp->status = nfserr_io;
> - goto out;
> - }
> +
> resp->status = nfsd_write(rqstp, &resp->fh, argp->offset,
> rqstp->rq_vec, nvecs, &cnt,
> resp->committed, resp->verf);
> resp->count = cnt;
> -out:
> return rpc_success;
> }
>
> diff --git a/fs/nfsd/nfsproc.c b/fs/nfsd/nfsproc.c
> index eea5b59b6a6c..1743ed04197e 100644
> --- a/fs/nfsd/nfsproc.c
> +++ b/fs/nfsd/nfsproc.c
> @@ -235,10 +235,6 @@ nfsd_proc_write(struct svc_rqst *rqstp)
> argp->len, argp->offset);
>
> nvecs = svc_fill_write_vector(rqstp, &argp->payload);
> - if (!nvecs) {
> - resp->status = nfserr_io;
> - goto out;
> - }
>
> resp->status = nfsd_write(rqstp, fh_copy(&resp->fh, &argp->fh),
> argp->offset, rqstp->rq_vec, nvecs,
> @@ -247,7 +243,6 @@ nfsd_proc_write(struct svc_rqst *rqstp)
> resp->status = fh_getattr(&resp->fh, &resp->stat);
> else if (resp->status == nfserr_jukebox)
> return rpc_drop_reply;
> -out:
> return rpc_success;
> }
>
next prev parent reply other threads:[~2022-01-03 21:00 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-12-21 15:23 [PATCH RFC] NFSD: Fix zero-length NFSv3 WRITEs Chuck Lever
2022-01-03 21:00 ` J. Bruce Fields [this message]
2022-01-04 1:12 ` Chuck Lever III
2022-01-04 3:07 ` Bruce Fields
2022-01-06 18:28 ` Frank Filz
2022-01-06 18:34 ` 'Bruce Fields'
2022-01-06 19:37 ` Frank Filz
2022-01-06 19:43 ` 'Bruce Fields'
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220103210013.GK21514@fieldses.org \
--to=bfields@fieldses.org \
--cc=chuck.lever@oracle.com \
--cc=linux-nfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.