lkml.org 
[lkml]   [2022]   [Jul]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.18 093/231] NFSD: Decode NFSv4 birth time attribute
    Date
    From: Chuck Lever <chuck.lever@oracle.com>

    [ Upstream commit 5b2f3e0777da2a5dd62824bbe2fdab1d12caaf8f ]

    NFSD has advertised support for the NFSv4 time_create attribute
    since commit e377a3e698fb ("nfsd: Add support for the birth time
    attribute").

    Igor Mammedov reports that Mac OS clients attempt to set the NFSv4
    birth time attribute via OPEN(CREATE) and SETATTR if the server
    indicates that it supports it, but since the above commit was
    merged, those attempts now fail.

    Table 5 in RFC 8881 lists the time_create attribute as one that can
    be both set and retrieved, but the above commit did not add server
    support for clients to provide a time_create attribute. IMO that's
    a bug in our implementation of the NFSv4 protocol, which this commit
    addresses.

    Whether NFSD silently ignores the new birth time or actually sets it
    is another matter. I haven't found another filesystem service in the
    Linux kernel that enables users or clients to modify a file's birth
    time attribute.

    This commit reflects my (perhaps incorrect) understanding of whether
    Linux users can set a file's birth time. NFSD will now recognize a
    time_create attribute but it ignores its value. It clears the
    time_create bit in the returned attribute bitmask to indicate that
    the value was not used.

    Reported-by: Igor Mammedov <imammedo@redhat.com>
    Fixes: e377a3e698fb ("nfsd: Add support for the birth time attribute")
    Tested-by: Igor Mammedov <imammedo@redhat.com>
    Reviewed-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/nfsd/nfs4xdr.c | 9 +++++++++
    fs/nfsd/nfsd.h | 3 ++-
    2 files changed, 11 insertions(+), 1 deletion(-)

    diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
    index da92e7d2ab6a..264c3a4629c9 100644
    --- a/fs/nfsd/nfs4xdr.c
    +++ b/fs/nfsd/nfs4xdr.c
    @@ -470,6 +470,15 @@ nfsd4_decode_fattr4(struct nfsd4_compoundargs *argp, u32 *bmval, u32 bmlen,
    return nfserr_bad_xdr;
    }
    }
    + if (bmval[1] & FATTR4_WORD1_TIME_CREATE) {
    + struct timespec64 ts;
    +
    + /* No Linux filesystem supports setting this attribute. */
    + bmval[1] &= ~FATTR4_WORD1_TIME_CREATE;
    + status = nfsd4_decode_nfstime4(argp, &ts);
    + if (status)
    + return status;
    + }
    if (bmval[1] & FATTR4_WORD1_TIME_MODIFY_SET) {
    u32 set_it;

    diff --git a/fs/nfsd/nfsd.h b/fs/nfsd/nfsd.h
    index 4fc1fd639527..727754d56243 100644
    --- a/fs/nfsd/nfsd.h
    +++ b/fs/nfsd/nfsd.h
    @@ -460,7 +460,8 @@ static inline bool nfsd_attrs_supported(u32 minorversion, const u32 *bmval)
    (FATTR4_WORD0_SIZE | FATTR4_WORD0_ACL)
    #define NFSD_WRITEABLE_ATTRS_WORD1 \
    (FATTR4_WORD1_MODE | FATTR4_WORD1_OWNER | FATTR4_WORD1_OWNER_GROUP \
    - | FATTR4_WORD1_TIME_ACCESS_SET | FATTR4_WORD1_TIME_MODIFY_SET)
    + | FATTR4_WORD1_TIME_ACCESS_SET | FATTR4_WORD1_TIME_CREATE \
    + | FATTR4_WORD1_TIME_MODIFY_SET)
    #ifdef CONFIG_NFSD_V4_SECURITY_LABEL
    #define MAYBE_FATTR4_WORD2_SECURITY_LABEL \
    FATTR4_WORD2_SECURITY_LABEL
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-07-19 15:04    [W:4.055 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site