From: Chuck Lever <chuck.lever@oracle.com>
To: Jeff Layton <jlayton@kernel.org>
Cc: linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-doc@vger.kernel.org, Anna Schumaker <anna@kernel.org>,
Trond Myklebust <trondmy@kernel.org>,
Jonathan Corbet <corbet@lwn.net>, Dai Ngo <Dai.Ngo@oracle.com>,
Tom Talpey <tom@talpey.com>,
Olga Kornievskaia <okorniev@redhat.com>,
Neil Brown <neilb@suse.de>
Subject: Re: [PATCH v5 01/10] nfsd: fix handling of delegated change attr in CB_GETATTR
Date: Sun, 19 Jan 2025 10:19:04 -0500 [thread overview]
Message-ID: <83aad379-81fb-4e11-a462-e02fd536fda2@oracle.com> (raw)
In-Reply-To: <20241209-delstid-v5-1-42308228f692@kernel.org>
On 12/9/24 4:13 PM, Jeff Layton wrote:
> RFC8881, section 10.4.3 has some specific guidance as to how the
> delegated change attribute should be handled. We currently don't follow
> that guidance properly.
>
> In particular, when the file is modified, the server always reports the
> initial change attribute + 1. Section 10.4.3 however indicates that it
> should be incremented on every GETATTR request from other clients.
>
> Only request the change attribute until the file has been modified. If
> there is an outstanding delegation, then increment the cached change
> attribute on every GETATTR.
>
> Signed-off-by: Jeff Layton <jlayton@kernel.org>
After review of LTS backport instructions in the candidate patches for
v6.14, this commit stuck out. Should it have a Fixes: or Cc: stable ?
How about
Fixes: 6487a13b5c6b ("NFSD: add support for CB_GETATTR callback") ??
> ---
> fs/nfsd/nfs4callback.c | 8 +++++---
> fs/nfsd/nfs4xdr.c | 15 +++++++++------
> 2 files changed, 14 insertions(+), 9 deletions(-)
>
> diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c
> index 3877b53e429fd89899d7dc35086bee8bda6eed07..25acb8624b854f5d0d184efec660e1f72cad8885 100644
> --- a/fs/nfsd/nfs4callback.c
> +++ b/fs/nfsd/nfs4callback.c
> @@ -361,12 +361,14 @@ static void
> encode_cb_getattr4args(struct xdr_stream *xdr, struct nfs4_cb_compound_hdr *hdr,
> struct nfs4_cb_fattr *fattr)
> {
> - struct nfs4_delegation *dp =
> - container_of(fattr, struct nfs4_delegation, dl_cb_fattr);
> + struct nfs4_delegation *dp = container_of(fattr, struct nfs4_delegation, dl_cb_fattr);
> struct knfsd_fh *fh = &dp->dl_stid.sc_file->fi_fhandle;
> + struct nfs4_cb_fattr *ncf = &dp->dl_cb_fattr;
> u32 bmap[1];
>
> - bmap[0] = FATTR4_WORD0_CHANGE | FATTR4_WORD0_SIZE;
> + bmap[0] = FATTR4_WORD0_SIZE;
> + if (!ncf->ncf_file_modified)
> + bmap[0] |= FATTR4_WORD0_CHANGE;
>
> encode_nfs_cb_opnum4(xdr, OP_CB_GETATTR);
> encode_nfs_fh4(xdr, fh);
> diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
> index 53fac037611c05ff8ba2618f9e324a9cb54c3890..c8e8d3f0dff4bb5288186369aad821906e684db7 100644
> --- a/fs/nfsd/nfs4xdr.c
> +++ b/fs/nfsd/nfs4xdr.c
> @@ -2919,6 +2919,7 @@ struct nfsd4_fattr_args {
> struct kstat stat;
> struct kstatfs statfs;
> struct nfs4_acl *acl;
> + u64 change_attr;
> #ifdef CONFIG_NFSD_V4_SECURITY_LABEL
> void *context;
> int contextlen;
> @@ -3018,7 +3019,6 @@ static __be32 nfsd4_encode_fattr4_change(struct xdr_stream *xdr,
> const struct nfsd4_fattr_args *args)
> {
> const struct svc_export *exp = args->exp;
> - u64 c;
>
> if (unlikely(exp->ex_flags & NFSEXP_V4ROOT)) {
> u32 flush_time = convert_to_wallclock(exp->cd->flush_time);
> @@ -3029,9 +3029,7 @@ static __be32 nfsd4_encode_fattr4_change(struct xdr_stream *xdr,
> return nfserr_resource;
> return nfs_ok;
> }
> -
> - c = nfsd4_change_attribute(&args->stat);
> - return nfsd4_encode_changeid4(xdr, c);
> + return nfsd4_encode_changeid4(xdr, args->change_attr);
> }
>
> static __be32 nfsd4_encode_fattr4_size(struct xdr_stream *xdr,
> @@ -3556,11 +3554,16 @@ nfsd4_encode_fattr4(struct svc_rqst *rqstp, struct xdr_stream *xdr,
> if (dp) {
> struct nfs4_cb_fattr *ncf = &dp->dl_cb_fattr;
>
> - if (ncf->ncf_file_modified)
> + if (ncf->ncf_file_modified) {
> + ++ncf->ncf_initial_cinfo;
> args.stat.size = ncf->ncf_cur_fsize;
> -
> + }
> + args.change_attr = ncf->ncf_initial_cinfo;
> nfs4_put_stid(&dp->dl_stid);
> + } else {
> + args.change_attr = nfsd4_change_attribute(&args.stat);
> }
> +
> if (err)
> goto out_nfserr;
>
>
--
Chuck Lever
next prev parent reply other threads:[~2025-01-19 15:19 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-12-09 21:13 [PATCH v5 00/10] nfsd: implement the "delstid" draft Jeff Layton
2024-12-09 21:13 ` [PATCH v5 01/10] nfsd: fix handling of delegated change attr in CB_GETATTR Jeff Layton
2025-01-19 15:19 ` Chuck Lever [this message]
2024-12-09 21:13 ` [PATCH v5 02/10] nfs_common: make include/linux/nfs4.h include generated nfs4_1.h Jeff Layton
2024-12-09 21:13 ` [PATCH v5 03/10] nfsd: switch to autogenerated definitions for open_delegation_type4 Jeff Layton
2024-12-09 21:13 ` [PATCH v5 04/10] nfsd: rename NFS4_SHARE_WANT_* constants to OPEN4_SHARE_ACCESS_WANT_* Jeff Layton
2024-12-09 21:13 ` [PATCH v5 05/10] nfsd: prepare delegation code for handing out *_ATTRS_DELEG delegations Jeff Layton
2024-12-09 21:13 ` [PATCH v5 06/10] nfsd: add support for FATTR4_OPEN_ARGUMENTS Jeff Layton
2024-12-09 21:13 ` [PATCH v5 07/10] nfsd: rework NFS4_SHARE_WANT_* flag handling Jeff Layton
2024-12-09 21:14 ` [PATCH v5 08/10] nfsd: add support for delegated timestamps Jeff Layton
2024-12-09 21:14 ` [PATCH v5 09/10] nfsd: handle delegated timestamps in SETATTR Jeff Layton
2024-12-12 21:06 ` Chuck Lever
2024-12-13 14:14 ` Jeff Layton
2024-12-13 14:18 ` Chuck Lever
2024-12-14 14:55 ` Jeff Layton
2024-12-14 16:34 ` Chuck Lever
2024-12-14 17:02 ` Chuck Lever
2024-12-15 18:52 ` Chuck Lever
2024-12-09 21:14 ` [PATCH v5 10/10] nfsd: implement OPEN_ARGS_SHARE_ACCESS_WANT_OPEN_XOR_DELEGATION Jeff Layton
2024-12-09 22:33 ` [PATCH v5 00/10] nfsd: implement the "delstid" draft 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=83aad379-81fb-4e11-a462-e02fd536fda2@oracle.com \
--to=chuck.lever@oracle.com \
--cc=Dai.Ngo@oracle.com \
--cc=anna@kernel.org \
--cc=corbet@lwn.net \
--cc=jlayton@kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-nfs@vger.kernel.org \
--cc=neilb@suse.de \
--cc=okorniev@redhat.com \
--cc=tom@talpey.com \
--cc=trondmy@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.