Skip to content

Commit 1e9f119

Browse files
committed
NFS: Return the file btime in the statx results when appropriate
JIRA: https://issues.redhat.com/browse/RHEL-90990 commit 4b54274 Author: Trond Myklebust <[email protected]> Date: Thu May 29 06:45:47 2025 -0400 NFS: Return the file btime in the statx results when appropriate If the server supports the NFSv4.x "create_time" attribute, then return it as part of the statx results. Signed-off-by: Benjamin Coddington <[email protected]> Reviewed-by: Jeff Layton <[email protected]> Link: https://lore.kernel.org/r/eae27d6467e08aaa67e0ac6ae7119263a0f83349.1748515333.git.bcodding@redhat.com Signed-off-by: Trond Myklebust <[email protected]> Signed-off-by: Benjamin Coddington <[email protected]>
1 parent 11c5ddf commit 1e9f119

File tree

2 files changed

+15
-3
lines changed

2 files changed

+15
-3
lines changed

fs/nfs/inode.c

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -891,6 +891,7 @@ static void nfs_readdirplus_parent_cache_hit(struct dentry *dentry)
891891

892892
static u32 nfs_get_valid_attrmask(struct inode *inode)
893893
{
894+
u64 fattr_valid = NFS_SERVER(inode)->fattr_valid;
894895
unsigned long cache_validity = READ_ONCE(NFS_I(inode)->cache_validity);
895896
u32 reply_mask = STATX_INO | STATX_TYPE;
896897

@@ -910,6 +911,9 @@ static u32 nfs_get_valid_attrmask(struct inode *inode)
910911
reply_mask |= STATX_UID | STATX_GID;
911912
if (!(cache_validity & NFS_INO_INVALID_BLOCKS))
912913
reply_mask |= STATX_BLOCKS;
914+
if (!(cache_validity & NFS_INO_INVALID_BTIME) &&
915+
(fattr_valid & NFS_ATTR_FATTR_BTIME))
916+
reply_mask |= STATX_BTIME;
913917
if (!(cache_validity & NFS_INO_INVALID_CHANGE))
914918
reply_mask |= STATX_CHANGE_COOKIE;
915919
return reply_mask;
@@ -920,6 +924,7 @@ int nfs_getattr(struct mnt_idmap *idmap, const struct path *path,
920924
{
921925
struct inode *inode = d_inode(path->dentry);
922926
struct nfs_server *server = NFS_SERVER(inode);
927+
u64 fattr_valid = server->fattr_valid;
923928
unsigned long cache_validity;
924929
int err = 0;
925930
bool force_sync = query_flags & AT_STATX_FORCE_SYNC;
@@ -930,9 +935,12 @@ int nfs_getattr(struct mnt_idmap *idmap, const struct path *path,
930935

931936
request_mask &= STATX_TYPE | STATX_MODE | STATX_NLINK | STATX_UID |
932937
STATX_GID | STATX_ATIME | STATX_MTIME | STATX_CTIME |
933-
STATX_INO | STATX_SIZE | STATX_BLOCKS |
938+
STATX_INO | STATX_SIZE | STATX_BLOCKS | STATX_BTIME |
934939
STATX_CHANGE_COOKIE;
935940

941+
if (!(fattr_valid & NFS_ATTR_FATTR_BTIME))
942+
request_mask &= ~STATX_BTIME;
943+
936944
if ((query_flags & AT_STATX_DONT_SYNC) && !force_sync) {
937945
if (readdirplus_enabled)
938946
nfs_readdirplus_parent_cache_hit(path->dentry);
@@ -964,7 +972,7 @@ int nfs_getattr(struct mnt_idmap *idmap, const struct path *path,
964972
/* Is the user requesting attributes that might need revalidation? */
965973
if (!(request_mask & (STATX_MODE|STATX_NLINK|STATX_ATIME|STATX_CTIME|
966974
STATX_MTIME|STATX_UID|STATX_GID|
967-
STATX_SIZE|STATX_BLOCKS|
975+
STATX_SIZE|STATX_BLOCKS|STATX_BTIME|
968976
STATX_CHANGE_COOKIE)))
969977
goto out_no_revalidate;
970978

@@ -988,6 +996,8 @@ int nfs_getattr(struct mnt_idmap *idmap, const struct path *path,
988996
do_update |= cache_validity & NFS_INO_INVALID_OTHER;
989997
if (request_mask & STATX_BLOCKS)
990998
do_update |= cache_validity & NFS_INO_INVALID_BLOCKS;
999+
if (request_mask & STATX_BTIME)
1000+
do_update |= cache_validity & NFS_INO_INVALID_BTIME;
9911001

9921002
if (do_update) {
9931003
if (readdirplus_enabled)
@@ -1009,6 +1019,7 @@ int nfs_getattr(struct mnt_idmap *idmap, const struct path *path,
10091019
stat->attributes |= STATX_ATTR_CHANGE_MONOTONIC;
10101020
if (S_ISDIR(inode->i_mode))
10111021
stat->blksize = NFS_SERVER(inode)->dtsize;
1022+
stat->btime = NFS_I(inode)->btime;
10121023
out:
10131024
trace_nfs_getattr_exit(inode, err);
10141025
return err;

fs/nfs/nfs4trace.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@
3030
{ NFS_ATTR_FATTR_CTIME, "CTIME" }, \
3131
{ NFS_ATTR_FATTR_CHANGE, "CHANGE" }, \
3232
{ NFS_ATTR_FATTR_OWNER_NAME, "OWNER_NAME" }, \
33-
{ NFS_ATTR_FATTR_GROUP_NAME, "GROUP_NAME" })
33+
{ NFS_ATTR_FATTR_GROUP_NAME, "GROUP_NAME" }, \
34+
{ NFS_ATTR_FATTR_BTIME, "BTIME" })
3435

3536
DECLARE_EVENT_CLASS(nfs4_clientid_event,
3637
TP_PROTO(

0 commit comments

Comments
 (0)