@@ -195,6 +195,7 @@ void nfs_set_cache_invalid(struct inode *inode, unsigned long flags)
195
195
if (!(flags & NFS_INO_REVAL_FORCED ))
196
196
flags &= ~(NFS_INO_INVALID_MODE |
197
197
NFS_INO_INVALID_OTHER |
198
+ NFS_INO_INVALID_BTIME |
198
199
NFS_INO_INVALID_XATTR );
199
200
flags &= ~(NFS_INO_INVALID_CHANGE | NFS_INO_INVALID_SIZE );
200
201
}
@@ -519,6 +520,7 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr)
519
520
memset (& inode -> i_atime , 0 , sizeof (inode -> i_atime ));
520
521
memset (& inode -> i_mtime , 0 , sizeof (inode -> i_mtime ));
521
522
inode_set_ctime (inode , 0 , 0 );
523
+ memset (& nfsi -> btime , 0 , sizeof (nfsi -> btime ));
522
524
inode_set_iversion_raw (inode , 0 );
523
525
inode -> i_size = 0 ;
524
526
clear_nlink (inode );
@@ -542,6 +544,10 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr)
542
544
inode_set_ctime_to_ts (inode , fattr -> ctime );
543
545
else if (fattr_supported & NFS_ATTR_FATTR_CTIME )
544
546
nfs_set_cache_invalid (inode , NFS_INO_INVALID_CTIME );
547
+ if (fattr -> valid & NFS_ATTR_FATTR_BTIME )
548
+ nfsi -> btime = fattr -> btime ;
549
+ else if (fattr_supported & NFS_ATTR_FATTR_BTIME )
550
+ nfs_set_cache_invalid (inode , NFS_INO_INVALID_BTIME );
545
551
if (fattr -> valid & NFS_ATTR_FATTR_CHANGE )
546
552
inode_set_iversion_raw (inode , fattr -> change_attr );
547
553
else
@@ -885,6 +891,7 @@ static void nfs_readdirplus_parent_cache_hit(struct dentry *dentry)
885
891
886
892
static u32 nfs_get_valid_attrmask (struct inode * inode )
887
893
{
894
+ u64 fattr_valid = NFS_SERVER (inode )-> fattr_valid ;
888
895
unsigned long cache_validity = READ_ONCE (NFS_I (inode )-> cache_validity );
889
896
u32 reply_mask = STATX_INO | STATX_TYPE ;
890
897
@@ -904,6 +911,9 @@ static u32 nfs_get_valid_attrmask(struct inode *inode)
904
911
reply_mask |= STATX_UID | STATX_GID ;
905
912
if (!(cache_validity & NFS_INO_INVALID_BLOCKS ))
906
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 ;
907
917
if (!(cache_validity & NFS_INO_INVALID_CHANGE ))
908
918
reply_mask |= STATX_CHANGE_COOKIE ;
909
919
return reply_mask ;
@@ -914,6 +924,7 @@ int nfs_getattr(struct mnt_idmap *idmap, const struct path *path,
914
924
{
915
925
struct inode * inode = d_inode (path -> dentry );
916
926
struct nfs_server * server = NFS_SERVER (inode );
927
+ u64 fattr_valid = server -> fattr_valid ;
917
928
unsigned long cache_validity ;
918
929
int err = 0 ;
919
930
bool force_sync = query_flags & AT_STATX_FORCE_SYNC ;
@@ -924,9 +935,12 @@ int nfs_getattr(struct mnt_idmap *idmap, const struct path *path,
924
935
925
936
request_mask &= STATX_TYPE | STATX_MODE | STATX_NLINK | STATX_UID |
926
937
STATX_GID | STATX_ATIME | STATX_MTIME | STATX_CTIME |
927
- STATX_INO | STATX_SIZE | STATX_BLOCKS |
938
+ STATX_INO | STATX_SIZE | STATX_BLOCKS | STATX_BTIME |
928
939
STATX_CHANGE_COOKIE ;
929
940
941
+ if (!(fattr_valid & NFS_ATTR_FATTR_BTIME ))
942
+ request_mask &= ~STATX_BTIME ;
943
+
930
944
if ((query_flags & AT_STATX_DONT_SYNC ) && !force_sync ) {
931
945
if (readdirplus_enabled )
932
946
nfs_readdirplus_parent_cache_hit (path -> dentry );
@@ -958,7 +972,7 @@ int nfs_getattr(struct mnt_idmap *idmap, const struct path *path,
958
972
/* Is the user requesting attributes that might need revalidation? */
959
973
if (!(request_mask & (STATX_MODE |STATX_NLINK |STATX_ATIME |STATX_CTIME |
960
974
STATX_MTIME |STATX_UID |STATX_GID |
961
- STATX_SIZE |STATX_BLOCKS |
975
+ STATX_SIZE |STATX_BLOCKS |STATX_BTIME |
962
976
STATX_CHANGE_COOKIE )))
963
977
goto out_no_revalidate ;
964
978
@@ -982,6 +996,8 @@ int nfs_getattr(struct mnt_idmap *idmap, const struct path *path,
982
996
do_update |= cache_validity & NFS_INO_INVALID_OTHER ;
983
997
if (request_mask & STATX_BLOCKS )
984
998
do_update |= cache_validity & NFS_INO_INVALID_BLOCKS ;
999
+ if (request_mask & STATX_BTIME )
1000
+ do_update |= cache_validity & NFS_INO_INVALID_BTIME ;
985
1001
986
1002
if (do_update ) {
987
1003
if (readdirplus_enabled )
@@ -1003,6 +1019,7 @@ int nfs_getattr(struct mnt_idmap *idmap, const struct path *path,
1003
1019
stat -> attributes |= STATX_ATTR_CHANGE_MONOTONIC ;
1004
1020
if (S_ISDIR (inode -> i_mode ))
1005
1021
stat -> blksize = NFS_SERVER (inode )-> dtsize ;
1022
+ stat -> btime = NFS_I (inode )-> btime ;
1006
1023
out :
1007
1024
trace_nfs_getattr_exit (inode , err );
1008
1025
return err ;
@@ -1894,7 +1911,7 @@ static int nfs_inode_finish_partial_attr_update(const struct nfs_fattr *fattr,
1894
1911
NFS_INO_INVALID_ATIME | NFS_INO_INVALID_CTIME |
1895
1912
NFS_INO_INVALID_MTIME | NFS_INO_INVALID_SIZE |
1896
1913
NFS_INO_INVALID_BLOCKS | NFS_INO_INVALID_OTHER |
1897
- NFS_INO_INVALID_NLINK ;
1914
+ NFS_INO_INVALID_NLINK | NFS_INO_INVALID_BTIME ;
1898
1915
unsigned long cache_validity = NFS_I (inode )-> cache_validity ;
1899
1916
enum nfs4_change_attr_type ctype = NFS_SERVER (inode )-> change_attr_type ;
1900
1917
@@ -2160,7 +2177,7 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
2160
2177
bool attr_changed = false;
2161
2178
bool have_delegation ;
2162
2179
2163
- dfprintk (VFS , "NFS: %s(%s/%lu fh_crc=0x%08x ct=%d info=0x%x )\n" ,
2180
+ dfprintk (VFS , "NFS: %s(%s/%lu fh_crc=0x%08x ct=%d info=0x%llx )\n" ,
2164
2181
__func__ , inode -> i_sb -> s_id , inode -> i_ino ,
2165
2182
nfs_display_fhandle_hash (NFS_FH (inode )),
2166
2183
atomic_read (& inode -> i_count ), fattr -> valid );
@@ -2255,7 +2272,8 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
2255
2272
| NFS_INO_INVALID_BLOCKS
2256
2273
| NFS_INO_INVALID_NLINK
2257
2274
| NFS_INO_INVALID_MODE
2258
- | NFS_INO_INVALID_OTHER ;
2275
+ | NFS_INO_INVALID_OTHER
2276
+ | NFS_INO_INVALID_BTIME ;
2259
2277
if (S_ISDIR (inode -> i_mode ))
2260
2278
nfs_force_lookup_revalidate (inode );
2261
2279
attr_changed = true;
@@ -2289,6 +2307,12 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
2289
2307
nfsi -> cache_validity |=
2290
2308
save_cache_validity & NFS_INO_INVALID_CTIME ;
2291
2309
2310
+ if (fattr -> valid & NFS_ATTR_FATTR_BTIME )
2311
+ nfsi -> btime = fattr -> btime ;
2312
+ else if (fattr_supported & NFS_ATTR_FATTR_BTIME )
2313
+ nfsi -> cache_validity |=
2314
+ save_cache_validity & NFS_INO_INVALID_BTIME ;
2315
+
2292
2316
/* Check if our cached file size is stale */
2293
2317
if (fattr -> valid & NFS_ATTR_FATTR_SIZE ) {
2294
2318
new_isize = nfs_size_to_loff_t (fattr -> size );
0 commit comments