public inbox for linux-nfs@vger.kernel.org
 help / color / mirror / Atom feed
From: Chuck Lever <chuck.lever@oracle.com>
To: Jeff Layton <jlayton@kernel.org>, Neil Brown <neilb@suse.de>,
	Olga Kornievskaia <okorniev@redhat.com>,
	Dai Ngo <Dai.Ngo@oracle.com>, Tom Talpey <tom@talpey.com>,
	Jonathan Corbet <corbet@lwn.net>,
	Trond Myklebust <trondmy@kernel.org>,
	Anna Schumaker <anna@kernel.org>
Cc: linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-doc@vger.kernel.org
Subject: Re: [PATCH v5 09/10] nfsd: handle delegated timestamps in SETATTR
Date: Sun, 15 Dec 2024 13:52:51 -0500	[thread overview]
Message-ID: <7cbff5aa-71da-448a-bd6c-3a37d9bf10db@oracle.com> (raw)
In-Reply-To: <09a8f219-c639-4fef-b3e5-44e030a76c24@oracle.com>

On 12/14/24 12:02 PM, Chuck Lever wrote:
> On 12/14/24 11:34 AM, Chuck Lever wrote:
>> On 12/14/24 9:55 AM, Jeff Layton wrote:
>>> On Fri, 2024-12-13 at 09:18 -0500, Chuck Lever wrote:
>>>> On 12/13/24 9:14 AM, Jeff Layton wrote:
>>>>> On Thu, 2024-12-12 at 16:06 -0500, Chuck Lever wrote:
>>>>>> On 12/9/24 4:14 PM, Jeff Layton wrote:
>>>>>>> Allow SETATTR to handle delegated timestamps. This patch assumes 
>>>>>>> that
>>>>>>> only the delegation holder has the ability to set the timestamps 
>>>>>>> in this
>>>>>>> way, so we allow this only if the SETATTR stateid refers to a
>>>>>>> *_ATTRS_DELEG delegation.
>>>>>>>
>>>>>>> Signed-off-by: Jeff Layton <jlayton@kernel.org>
>>>>>>> ---
>>>>>>>     fs/nfsd/nfs4proc.c  | 31 ++++++++++++++++++++++++++++---
>>>>>>>     fs/nfsd/nfs4state.c |  2 +-
>>>>>>>     fs/nfsd/nfs4xdr.c   | 20 ++++++++++++++++++++
>>>>>>>     fs/nfsd/nfsd.h      |  5 ++++-
>>>>>>>     4 files changed, 53 insertions(+), 5 deletions(-)
>>>>>>>
>>>>>>> diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
>>>>>>> index 
>>>>>>> f8a10f90bc7a4b288c20d2733c85f331cc0a8dba..fea171ffed623818c61886b786339b0b73f1053d 100644
>>>>>>> --- a/fs/nfsd/nfs4proc.c
>>>>>>> +++ b/fs/nfsd/nfs4proc.c
>>>>>>> @@ -1135,18 +1135,43 @@ nfsd4_setattr(struct svc_rqst *rqstp, 
>>>>>>> struct nfsd4_compound_state *cstate,
>>>>>>>             .na_iattr    = &setattr->sa_iattr,
>>>>>>>             .na_seclabel    = &setattr->sa_label,
>>>>>>>         };
>>>>>>> +    bool save_no_wcc, deleg_attrs;
>>>>>>> +    struct nfs4_stid *st = NULL;
>>>>>>>         struct inode *inode;
>>>>>>>         __be32 status = nfs_ok;
>>>>>>> -    bool save_no_wcc;
>>>>>>>         int err;
>>>>>>> -    if (setattr->sa_iattr.ia_valid & ATTR_SIZE) {
>>>>>>> +    deleg_attrs = setattr->sa_bmval[2] & 
>>>>>>> (FATTR4_WORD2_TIME_DELEG_ACCESS |
>>>>>>> +                          FATTR4_WORD2_TIME_DELEG_MODIFY);
>>>>>>> +
>>>>>>> +    if (deleg_attrs || (setattr->sa_iattr.ia_valid & ATTR_SIZE)) {
>>>>>>> +        int flags = WR_STATE;
>>>>>>> +
>>>>>>> +        if (setattr->sa_bmval[2] & FATTR4_WORD2_TIME_DELEG_ACCESS)
>>>>>>> +            flags |= RD_STATE;
>>>>>>> +
>>>>>>>             status = nfs4_preprocess_stateid_op(rqstp, cstate,
>>>>>>>                     &cstate->current_fh, &setattr->sa_stateid,
>>>>>>> -                WR_STATE, NULL, NULL);
>>>>>>> +                flags, NULL, &st);
>>>>>>>             if (status)
>>>>>>>                 return status;
>>>>>>>         }
>>>>>>> +
>>>>>>> +    if (deleg_attrs) {
>>>>>>> +        status = nfserr_bad_stateid;
>>>>>>> +        if (st->sc_type & SC_TYPE_DELEG) {
>>>>>>> +            struct nfs4_delegation *dp = delegstateid(st);
>>>>>>> +
>>>>>>> +            /* Only for *_ATTRS_DELEG flavors */
>>>>>>> +            if (deleg_attrs_deleg(dp->dl_type))
>>>>>>> +                status = nfs_ok;
>>>>>>> +        }
>>>>>>> +    }
>>>>>>> +    if (st)
>>>>>>> +        nfs4_put_stid(st);
>>>>>>> +    if (status)
>>>>>>> +        return status;
>>>>>>> +
>>>>>>>         err = fh_want_write(&cstate->current_fh);
>>>>>>>         if (err)
>>>>>>>             return nfserrno(err);
>>>>>>> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
>>>>>>> index 
>>>>>>> c882eeba7830b0249ccd74654f81e63b12a30f14..a76e35f86021c5657e31e4fddf08cb5781f01e32 100644
>>>>>>> --- a/fs/nfsd/nfs4state.c
>>>>>>> +++ b/fs/nfsd/nfs4state.c
>>>>>>> @@ -5486,7 +5486,7 @@ nfsd4_process_open1(struct 
>>>>>>> nfsd4_compound_state *cstate,
>>>>>>>     static inline __be32
>>>>>>>     nfs4_check_delegmode(struct nfs4_delegation *dp, int flags)
>>>>>>>     {
>>>>>>> -    if ((flags & WR_STATE) && deleg_is_read(dp->dl_type))
>>>>>>> +    if (!(flags & RD_STATE) && deleg_is_read(dp->dl_type))
>>>>>>>             return nfserr_openmode;
>>>>>>>         else
>>>>>>>             return nfs_ok;
>>>>>>> diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
>>>>>>> index 
>>>>>>> 0561c99b5def2eccf679bf3ea0e5b1a57d5d8374..ce93a31ac5cec75b0f944d288e796e7a73641572 100644
>>>>>>> --- a/fs/nfsd/nfs4xdr.c
>>>>>>> +++ b/fs/nfsd/nfs4xdr.c
>>>>>>> @@ -521,6 +521,26 @@ nfsd4_decode_fattr4(struct 
>>>>>>> nfsd4_compoundargs *argp, u32 *bmval, u32 bmlen,
>>>>>>>             *umask = mask & S_IRWXUGO;
>>>>>>>             iattr->ia_valid |= ATTR_MODE;
>>>>>>>         }
>>>>>>> +    if (bmval[2] & FATTR4_WORD2_TIME_DELEG_ACCESS) {
>>>>>>> +        fattr4_time_deleg_access access;
>>>>>>> +
>>>>>>> +        if (!xdrgen_decode_fattr4_time_deleg_access(argp->xdr, 
>>>>>>> &access))
>>>>>>> +            return nfserr_bad_xdr;
>>>>>>> +        iattr->ia_atime.tv_sec = access.seconds;
>>>>>>> +        iattr->ia_atime.tv_nsec = access.nseconds;
>>>>>>> +        iattr->ia_valid |= ATTR_ATIME | ATTR_ATIME_SET | 
>>>>>>> ATTR_DELEG;
>>>>>>> +    }
>>>>>>> +    if (bmval[2] & FATTR4_WORD2_TIME_DELEG_MODIFY) {
>>>>>>> +        fattr4_time_deleg_modify modify;
>>>>>>> +
>>>>>>> +        if (!xdrgen_decode_fattr4_time_deleg_modify(argp->xdr, 
>>>>>>> &modify))
>>>>>>> +            return nfserr_bad_xdr;
>>>>>>> +        iattr->ia_mtime.tv_sec = modify.seconds;
>>>>>>> +        iattr->ia_mtime.tv_nsec = modify.nseconds;
>>>>>>> +        iattr->ia_ctime.tv_sec = modify.seconds;
>>>>>>> +        iattr->ia_ctime.tv_nsec = modify.seconds;
>>>>>>> +        iattr->ia_valid |= ATTR_CTIME | ATTR_MTIME | 
>>>>>>> ATTR_MTIME_SET | ATTR_DELEG;
>>>>>>> +    }
>>>>>>>         /* request sanity: did attrlist4 contain the expected 
>>>>>>> number of words? */
>>>>>>>         if (attrlist4_count != xdr_stream_pos(argp->xdr) - 
>>>>>>> starting_pos)
>>>>>>> diff --git a/fs/nfsd/nfsd.h b/fs/nfsd/nfsd.h
>>>>>>> index 
>>>>>>> 004415651295891b3440f52a4c986e3a668a48cb..f007699aa397fe39042d80ccd568db4654d19dd5 100644
>>>>>>> --- a/fs/nfsd/nfsd.h
>>>>>>> +++ b/fs/nfsd/nfsd.h
>>>>>>> @@ -531,7 +531,10 @@ static inline bool nfsd_attrs_supported(u32 
>>>>>>> minorversion, const u32 *bmval)
>>>>>>>     #endif
>>>>>>>     #define NFSD_WRITEABLE_ATTRS_WORD2 \
>>>>>>>         (FATTR4_WORD2_MODE_UMASK \
>>>>>>> -    | MAYBE_FATTR4_WORD2_SECURITY_LABEL)
>>>>>>> +    | MAYBE_FATTR4_WORD2_SECURITY_LABEL \
>>>>>>> +    | FATTR4_WORD2_TIME_DELEG_ACCESS \
>>>>>>> +    | FATTR4_WORD2_TIME_DELEG_MODIFY \
>>>>>>> +    )
>>>>>>>     #define NFSD_SUPPATTR_EXCLCREAT_WORD0 \
>>>>>>>         NFSD_WRITEABLE_ATTRS_WORD0
>>>>>>>
>>>>>>
>>>>>> Hi Jeff-
>>>>>>
>>>>>> After this patch is applied, I see failures of the git regression 
>>>>>> suite
>>>>>> on NFSv4.2 mounts.
>>>>>>
>>>>>> Test Summary Report
>>>>>> -------------------
>>>>>> ./t3412-rebase-root.sh                             (Wstat: 256 
>>>>>> (exited
>>>>>> 1) Tests: 25 Failed: 5)
>>>>>>      Failed tests:  6, 19, 21-22, 24
>>>>>>      Non-zero exit status: 1
>>>>>> ./t3400-rebase.sh                                  (Wstat: 256 
>>>>>> (exited
>>>>>> 1) Tests: 38 Failed: 1)
>>>>>>      Failed test:  31
>>>>>>      Non-zero exit status: 1
>>>>>> ./t3406-rebase-message.sh                          (Wstat: 256 
>>>>>> (exited
>>>>>> 1) Tests: 32 Failed: 2)
>>>>>>      Failed tests:  15, 20
>>>>>>      Non-zero exit status: 1
>>>>>> ./t3428-rebase-signoff.sh                          (Wstat: 256 
>>>>>> (exited
>>>>>> 1) Tests: 7 Failed: 2)
>>>>>>      Failed tests:  6-7
>>>>>>      Non-zero exit status: 1
>>>>>> ./t3418-rebase-continue.sh                         (Wstat: 256 
>>>>>> (exited
>>>>>> 1) Tests: 29 Failed: 1)
>>>>>>      Failed test:  7
>>>>>>      Non-zero exit status: 1
>>>>>> ./t3415-rebase-autosquash.sh                       (Wstat: 256 
>>>>>> (exited
>>>>>> 1) Tests: 27 Failed: 2)
>>>>>>      Failed tests:  3-4
>>>>>>      Non-zero exit status: 1
>>>>>> ./t3404-rebase-interactive.sh                      (Wstat: 256 
>>>>>> (exited
>>>>>> 1) Tests: 131 Failed: 15)
>>>>>>      Failed tests:  32, 34-43, 45, 121-123
>>>>>>      Non-zero exit status: 1
>>>>>> ./t1013-read-tree-submodule.sh                     (Wstat: 256 
>>>>>> (exited
>>>>>> 1) Tests: 68 Failed: 1)
>>>>>>      Failed test:  34
>>>>>>      Non-zero exit status: 1
>>>>>> ./t2013-checkout-submodule.sh                      (Wstat: 256 
>>>>>> (exited
>>>>>> 1) Tests: 74 Failed: 4)
>>>>>>      Failed tests:  26-27, 30-31
>>>>>>      Non-zero exit status: 1
>>>>>> ./t5500-fetch-pack.sh                              (Wstat: 256 
>>>>>> (exited
>>>>>> 1) Tests: 375 Failed: 1)
>>>>>>      Failed test:  28
>>>>>>      Non-zero exit status: 1
>>>>>> ./t5572-pull-submodule.sh                          (Wstat: 256 
>>>>>> (exited
>>>>>> 1) Tests: 67 Failed: 2)
>>>>>>      Failed tests:  5, 7
>>>>>>      Non-zero exit status: 1
>>>>>> Files=1007, Tests=30810, 1417 wallclock secs (11.18 usr 10.17 sys +
>>>>>> 1037.05 cusr 6529.12 csys = 7587.52 CPU)
>>>>>> Result: FAIL
>>>>>>
>>>>>> The NFS client and NFS server under test are running the same 
>>>>>> v6.13-rc2
>>>>>> kernel from my git.kernel.org nfsd-testing branch.
>>>>>>
>>>>>>
>>>>>
>>>>> I'm not seeing these failures. I ran the gitr suite under kdevops with
>>>>> your nfsd-testing branch (6.13.0-rc2-ge9a809c5714e):
>>>>>
>>>>> All tests successful.
>>>>> Files=1007, Tests=30695, 10767 wallclock secs (13.87 usr 16.86 sys 
>>>>> + 1160.76 cusr 17870.80 csys = 19062.29 CPU)
>>>>> Result: PASS
>>>>>
>>>>> ...and looking at the results of those specific tests, they did run 
>>>>> and
>>>>> they did pass.
>>>>>
>>>>> I'm rerunning the tests now. It's possible the underlying fs matters.
>>>>> Mine is exporting xfs. Yours?
>>>>
>>>> Mine is btrfs, and the NFS version is v4.2 on TCP.
>>>>
>>>>
>>>
>>> Nope, I still can't reproduce this with btrfs either. I'm also using
>>> v4.2 on TCP. I assume you're running this under kdevops, so we should
>>> have a relatively similar environment.
>>
>> I'm running the "stress" setting, which starts twice as many threads
>> as there are CPUs (so, 16, I think?). 32 nfsd threads.
> 
> Also, I'm testing 2.47.0 of git. The default version that kdevops uses
> might be older.
> 
> 
>>> Are you also testing the same commit?
>>
>> The first failing test run is on 6.13.0-rc2-00016-gb45eda1daa7d
>>
>> https://git.kernel.org/pub/scm/linux/kernel/git/cel/linux.git/commit/? 
>> h=nfsd-testing&id=b45eda1daa7d79a2bf0426d27d4b359b8bb71d33
>>
>> I'll take a closer look.

My bad, I was testing with 2.46.0. When I changed to 2.47.0, the
failures in 9/10 went away.

Now with 2.47.0, I see one failure when testing in "stress" mode
on 10/10:

Test Summary Report
-------------------
./t4255-am-submodule.sh                            (Wstat: 256 (exited 
1) Tests: 33 Failed: 1)
   Failed test:  19
   Non-zero exit status: 1
Files=1007, Tests=30810, 1330 wallclock secs (11.27 usr  9.81 sys + 
1098.89 cusr 6274.49 csys = 7394.46 CPU)
Result: FAIL

It doesn't seem to reproduce in "fast" mode.


-- 
Chuck Lever

  reply	other threads:[~2024-12-15 18:53 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
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 [this message]
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=7cbff5aa-71da-448a-bd6c-3a37d9bf10db@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox