@@ -107,6 +107,9 @@ static int nfs41_test_stateid(struct nfs_server *, nfs4_stateid *,
107
107
static int nfs41_free_stateid (struct nfs_server * , const nfs4_stateid * ,
108
108
const struct cred * , bool );
109
109
#endif
110
+ static void nfs4_bitmask_adjust (__u32 * bitmask , struct inode * inode ,
111
+ struct nfs_server * server ,
112
+ struct nfs4_label * label );
110
113
111
114
#ifdef CONFIG_NFS_V4_SECURITY_LABEL
112
115
static inline struct nfs4_label *
@@ -3632,9 +3635,10 @@ static void nfs4_close_prepare(struct rpc_task *task, void *data)
3632
3635
3633
3636
if (calldata -> arg .fmode == 0 || calldata -> arg .fmode == FMODE_READ ) {
3634
3637
/* Close-to-open cache consistency revalidation */
3635
- if (!nfs4_have_delegation (inode , FMODE_READ ))
3638
+ if (!nfs4_have_delegation (inode , FMODE_READ )) {
3636
3639
calldata -> arg .bitmask = NFS_SERVER (inode )-> cache_consistency_bitmask ;
3637
- else
3640
+ nfs4_bitmask_adjust (calldata -> arg .bitmask , inode , NFS_SERVER (inode ), NULL );
3641
+ } else
3638
3642
calldata -> arg .bitmask = NULL ;
3639
3643
}
3640
3644
@@ -5360,6 +5364,38 @@ bool nfs4_write_need_cache_consistency_data(struct nfs_pgio_header *hdr)
5360
5364
return nfs4_have_delegation (hdr -> inode , FMODE_READ ) == 0 ;
5361
5365
}
5362
5366
5367
+ static void nfs4_bitmask_adjust (__u32 * bitmask , struct inode * inode ,
5368
+ struct nfs_server * server ,
5369
+ struct nfs4_label * label )
5370
+ {
5371
+
5372
+ unsigned long cache_validity = READ_ONCE (NFS_I (inode )-> cache_validity );
5373
+
5374
+ if ((cache_validity & NFS_INO_INVALID_DATA ) ||
5375
+ (cache_validity & NFS_INO_REVAL_PAGECACHE ) ||
5376
+ (cache_validity & NFS_INO_REVAL_FORCED ) ||
5377
+ (cache_validity & NFS_INO_INVALID_OTHER ))
5378
+ nfs4_bitmap_copy_adjust (bitmask , nfs4_bitmask (server , label ), inode );
5379
+
5380
+ if (cache_validity & NFS_INO_INVALID_ATIME )
5381
+ bitmask [1 ] |= FATTR4_WORD1_TIME_ACCESS ;
5382
+ if (cache_validity & NFS_INO_INVALID_ACCESS )
5383
+ bitmask [0 ] |= FATTR4_WORD1_MODE | FATTR4_WORD1_OWNER |
5384
+ FATTR4_WORD1_OWNER_GROUP ;
5385
+ if (cache_validity & NFS_INO_INVALID_ACL )
5386
+ bitmask [0 ] |= FATTR4_WORD0_ACL ;
5387
+ if (cache_validity & NFS_INO_INVALID_LABEL )
5388
+ bitmask [2 ] |= FATTR4_WORD2_SECURITY_LABEL ;
5389
+ if (cache_validity & NFS_INO_INVALID_CTIME )
5390
+ bitmask [0 ] |= FATTR4_WORD0_CHANGE ;
5391
+ if (cache_validity & NFS_INO_INVALID_MTIME )
5392
+ bitmask [1 ] |= FATTR4_WORD1_TIME_MODIFY ;
5393
+ if (cache_validity & NFS_INO_INVALID_SIZE )
5394
+ bitmask [0 ] |= FATTR4_WORD0_SIZE ;
5395
+ if (cache_validity & NFS_INO_INVALID_BLOCKS )
5396
+ bitmask [1 ] |= FATTR4_WORD1_SPACE_USED ;
5397
+ }
5398
+
5363
5399
static void nfs4_proc_write_setup (struct nfs_pgio_header * hdr ,
5364
5400
struct rpc_message * msg ,
5365
5401
struct rpc_clnt * * clnt )
@@ -5369,8 +5405,10 @@ static void nfs4_proc_write_setup(struct nfs_pgio_header *hdr,
5369
5405
if (!nfs4_write_need_cache_consistency_data (hdr )) {
5370
5406
hdr -> args .bitmask = NULL ;
5371
5407
hdr -> res .fattr = NULL ;
5372
- } else
5408
+ } else {
5373
5409
hdr -> args .bitmask = server -> cache_consistency_bitmask ;
5410
+ nfs4_bitmask_adjust (hdr -> args .bitmask , hdr -> inode , server , NULL );
5411
+ }
5374
5412
5375
5413
if (!hdr -> pgio_done_cb )
5376
5414
hdr -> pgio_done_cb = nfs4_write_done_cb ;
@@ -6406,6 +6444,7 @@ static int _nfs4_proc_delegreturn(struct inode *inode, const struct cred *cred,
6406
6444
data -> args .fhandle = & data -> fh ;
6407
6445
data -> args .stateid = & data -> stateid ;
6408
6446
data -> args .bitmask = server -> cache_consistency_bitmask ;
6447
+ nfs4_bitmask_adjust (data -> args .bitmask , inode , server , NULL );
6409
6448
nfs_copy_fh (& data -> fh , NFS_FH (inode ));
6410
6449
nfs4_stateid_copy (& data -> stateid , stateid );
6411
6450
data -> res .fattr = & data -> fattr ;
0 commit comments