From: Jeff Layton <jlayton@kernel.org>
To: Dai Ngo <dai.ngo@oracle.com>,
chuck.lever@oracle.com, neilb@suse.de, okorniev@redhat.com,
tom@talpey.com
Cc: linux-nfs@vger.kernel.org, sagi@grimberg.me
Subject: Re: [PATCH V4 1/2] NFSD: Offer write delegation for OPEN with OPEN4_SHARE_ACCESS_WRITE
Date: Wed, 05 Mar 2025 09:36:37 -0500 [thread overview]
Message-ID: <81bbbea01bb478cad8eb2ad85e10f13e4b433e34.camel@kernel.org> (raw)
In-Reply-To: <1741120693-2517-2-git-send-email-dai.ngo@oracle.com>
On Tue, 2025-03-04 at 12:38 -0800, Dai Ngo wrote:
> RFC8881, section 9.1.2 says:
>
> "In the case of READ, the server may perform the corresponding
> check on the access mode, or it may choose to allow READ for
> OPEN4_SHARE_ACCESS_WRITE, to accommodate clients whose WRITE
> implementation may unavoidably do (e.g., due to buffer cache
> constraints)."
>
> and in section 10.4.1:
> "Similarly, when closing a file opened for OPEN4_SHARE_ACCESS_WRITE/
> OPEN4_SHARE_ACCESS_BOTH and if an OPEN_DELEGATE_WRITE delegation
> is in effect"
>
> This patch offers write delegation for OPEN with OPEN4_SHARE_ACCESS_WRITE
> only. Also deleted no longer use find_rw_file().
>
> Signed-off-by: Dai Ngo <dai.ngo@oracle.com>
> ---
> fs/nfsd/nfs4state.c | 34 +++++++++++++---------------------
> 1 file changed, 13 insertions(+), 21 deletions(-)
>
> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
> index 0f97f2c62b3a..b533225e57cf 100644
> --- a/fs/nfsd/nfs4state.c
> +++ b/fs/nfsd/nfs4state.c
> @@ -633,18 +633,6 @@ find_readable_file(struct nfs4_file *f)
> return ret;
> }
>
> -static struct nfsd_file *
> -find_rw_file(struct nfs4_file *f)
> -{
> - struct nfsd_file *ret;
> -
> - spin_lock(&f->fi_lock);
> - ret = nfsd_file_get(f->fi_fds[O_RDWR]);
> - spin_unlock(&f->fi_lock);
> -
> - return ret;
> -}
> -
> struct nfsd_file *
> find_any_file(struct nfs4_file *f)
> {
> @@ -5382,7 +5370,6 @@ static int nfsd4_cb_recall_done(struct nfsd4_callback *cb,
> if (dp->dl_stid.sc_status)
> /* CLOSED or REVOKED */
> return 1;
> -
> switch (task->tk_status) {
> case 0:
> return 1;
> @@ -5987,14 +5974,19 @@ nfs4_set_delegation(struct nfsd4_open *open, struct nfs4_ol_stateid *stp,
> * "An OPEN_DELEGATE_WRITE delegation allows the client to handle,
> * on its own, all opens."
> *
> - * Furthermore the client can use a write delegation for most READ
> - * operations as well, so we require a O_RDWR file here.
> + * Furthermore, section 9.1.2 says:
> + *
> + * "In the case of READ, the server may perform the corresponding
> + * check on the access mode, or it may choose to allow READ for
> + * OPEN4_SHARE_ACCESS_WRITE, to accommodate clients whose WRITE
> + * implementation may unavoidably do (e.g., due to buffer cache
> + * constraints)."
> *
> - * Offer a write delegation in the case of a BOTH open, and ensure
> - * we get the O_RDWR descriptor.
> + * We choose to offer a write delegation for OPEN with the
> + * OPEN4_SHARE_ACCESS_WRITE access mode to accommodate such clients.
> */
> - if ((open->op_share_access & NFS4_SHARE_ACCESS_BOTH) == NFS4_SHARE_ACCESS_BOTH) {
> - nf = find_rw_file(fp);
> + if (open->op_share_access & NFS4_SHARE_ACCESS_WRITE) {
> + nf = find_writeable_file(fp);
> dl_type = deleg_ts ? OPEN_DELEGATE_WRITE_ATTRS_DELEG : OPEN_DELEGATE_WRITE;
> }
>
> @@ -6116,7 +6108,7 @@ static bool
> nfs4_delegation_stat(struct nfs4_delegation *dp, struct svc_fh *currentfh,
> struct kstat *stat)
> {
> - struct nfsd_file *nf = find_rw_file(dp->dl_stid.sc_file);
> + struct nfsd_file *nf = find_writeable_file(dp->dl_stid.sc_file);
> struct path path;
> int rc;
>
> @@ -7063,7 +7055,7 @@ nfsd4_lookup_stateid(struct nfsd4_compound_state *cstate,
> return_revoked = true;
> if (typemask & SC_TYPE_DELEG)
> /* Always allow REVOKED for DELEG so we can
> - * retturn the appropriate error.
> + * return the appropriate error.
> */
> statusmask |= SC_STATUS_REVOKED;
>
This patch also looks good.
The only other issue I have with this is the patch ordering. If a
bisect lands between these two patches then delegations won't work
quite right. Is there a reason to order the patches this way?
Reviewed-by: Jeff Layton <jlayton@kernel.org>
next prev parent reply other threads:[~2025-03-05 14:36 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-04 20:38 [PATCH V4 0/2] NFSD: offer write delegation for OPEN with OPEN4_SHARE_ACCESS only Dai Ngo
2025-03-04 20:38 ` [PATCH V4 1/2] NFSD: Offer write delegation for OPEN with OPEN4_SHARE_ACCESS_WRITE Dai Ngo
2025-03-05 14:36 ` Jeff Layton [this message]
2025-03-05 14:45 ` Chuck Lever
2025-03-04 20:38 ` [PATCH V4 2/2] NFSD: allow client to use write delegation stateid for READ Dai Ngo
2025-03-05 14:34 ` Jeff Layton
2025-03-05 14:46 ` Chuck Lever
2025-03-05 16:08 ` Jeff Layton
2025-03-05 20:47 ` Dai Ngo
2025-03-05 20:59 ` Dai Ngo
2025-03-06 11:52 ` Jeff Layton
2025-03-06 15:08 ` Tom Talpey
2025-03-06 17:54 ` Dai Ngo
2025-03-05 14:19 ` [PATCH V4 0/2] NFSD: offer write delegation for OPEN with OPEN4_SHARE_ACCESS only cel
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=81bbbea01bb478cad8eb2ad85e10f13e4b433e34.camel@kernel.org \
--to=jlayton@kernel.org \
--cc=chuck.lever@oracle.com \
--cc=dai.ngo@oracle.com \
--cc=linux-nfs@vger.kernel.org \
--cc=neilb@suse.de \
--cc=okorniev@redhat.com \
--cc=sagi@grimberg.me \
--cc=tom@talpey.com \
/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.