@@ -891,6 +891,7 @@ static void nfs_readdirplus_parent_cache_hit(struct dentry *dentry)
891
891
892
892
static u32 nfs_get_valid_attrmask (struct inode * inode )
893
893
{
894
+ u64 fattr_valid = NFS_SERVER (inode )-> fattr_valid ;
894
895
unsigned long cache_validity = READ_ONCE (NFS_I (inode )-> cache_validity );
895
896
u32 reply_mask = STATX_INO | STATX_TYPE ;
896
897
@@ -910,6 +911,9 @@ static u32 nfs_get_valid_attrmask(struct inode *inode)
910
911
reply_mask |= STATX_UID | STATX_GID ;
911
912
if (!(cache_validity & NFS_INO_INVALID_BLOCKS ))
912
913
reply_mask |= STATX_BLOCKS ;
914
+ if (!(cache_validity & NFS_INO_INVALID_BTIME ) &&
915
+ (fattr_valid & NFS_ATTR_FATTR_BTIME ))
916
+ reply_mask |= STATX_BTIME ;
913
917
if (!(cache_validity & NFS_INO_INVALID_CHANGE ))
914
918
reply_mask |= STATX_CHANGE_COOKIE ;
915
919
return reply_mask ;
@@ -920,6 +924,7 @@ int nfs_getattr(struct mnt_idmap *idmap, const struct path *path,
920
924
{
921
925
struct inode * inode = d_inode (path -> dentry );
922
926
struct nfs_server * server = NFS_SERVER (inode );
927
+ u64 fattr_valid = server -> fattr_valid ;
923
928
unsigned long cache_validity ;
924
929
int err = 0 ;
925
930
bool force_sync = query_flags & AT_STATX_FORCE_SYNC ;
@@ -930,9 +935,12 @@ int nfs_getattr(struct mnt_idmap *idmap, const struct path *path,
930
935
931
936
request_mask &= STATX_TYPE | STATX_MODE | STATX_NLINK | STATX_UID |
932
937
STATX_GID | STATX_ATIME | STATX_MTIME | STATX_CTIME |
933
- STATX_INO | STATX_SIZE | STATX_BLOCKS |
938
+ STATX_INO | STATX_SIZE | STATX_BLOCKS | STATX_BTIME |
934
939
STATX_CHANGE_COOKIE ;
935
940
941
+ if (!(fattr_valid & NFS_ATTR_FATTR_BTIME ))
942
+ request_mask &= ~STATX_BTIME ;
943
+
936
944
if ((query_flags & AT_STATX_DONT_SYNC ) && !force_sync ) {
937
945
if (readdirplus_enabled )
938
946
nfs_readdirplus_parent_cache_hit (path -> dentry );
@@ -964,7 +972,7 @@ int nfs_getattr(struct mnt_idmap *idmap, const struct path *path,
964
972
/* Is the user requesting attributes that might need revalidation? */
965
973
if (!(request_mask & (STATX_MODE |STATX_NLINK |STATX_ATIME |STATX_CTIME |
966
974
STATX_MTIME |STATX_UID |STATX_GID |
967
- STATX_SIZE |STATX_BLOCKS |
975
+ STATX_SIZE |STATX_BLOCKS |STATX_BTIME |
968
976
STATX_CHANGE_COOKIE )))
969
977
goto out_no_revalidate ;
970
978
@@ -988,6 +996,8 @@ int nfs_getattr(struct mnt_idmap *idmap, const struct path *path,
988
996
do_update |= cache_validity & NFS_INO_INVALID_OTHER ;
989
997
if (request_mask & STATX_BLOCKS )
990
998
do_update |= cache_validity & NFS_INO_INVALID_BLOCKS ;
999
+ if (request_mask & STATX_BTIME )
1000
+ do_update |= cache_validity & NFS_INO_INVALID_BTIME ;
991
1001
992
1002
if (do_update ) {
993
1003
if (readdirplus_enabled )
@@ -1009,6 +1019,7 @@ int nfs_getattr(struct mnt_idmap *idmap, const struct path *path,
1009
1019
stat -> attributes |= STATX_ATTR_CHANGE_MONOTONIC ;
1010
1020
if (S_ISDIR (inode -> i_mode ))
1011
1021
stat -> blksize = NFS_SERVER (inode )-> dtsize ;
1022
+ stat -> btime = NFS_I (inode )-> btime ;
1012
1023
out :
1013
1024
trace_nfs_getattr_exit (inode , err );
1014
1025
return err ;
0 commit comments