NFS: Replace use of NFS_INO_REVAL_PAGECACHE when checking cache validity
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Fri, 26 Mar 2021 01:07:21 +0000 (21:07 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Tue, 13 Apr 2021 00:11:44 +0000 (20:11 -0400)
When checking cache validity, be more specific than just 'we want to
check the page cache validity'. In almost all cases, we want to check
that change attribute, and possibly also the size.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/file.c
fs/nfs/inode.c
fs/nfs/nfs4proc.c
fs/nfs/write.c

index 16ad5050e0468124761768817df2436aa63970e3..1fef107961bc4a4ca624796de35d33c400179a2f 100644 (file)
@@ -105,7 +105,7 @@ static int nfs_revalidate_file_size(struct inode *inode, struct file *filp)
 
        if (filp->f_flags & O_DIRECT)
                goto force_reval;
-       if (nfs_check_cache_invalid(inode, NFS_INO_REVAL_PAGECACHE))
+       if (nfs_check_cache_invalid(inode, NFS_INO_INVALID_SIZE))
                goto force_reval;
        return 0;
 force_reval:
index b9aac408f03aaf055fc33ffd97c325edab160eac..aec402d048eb436e6cb10f22ed509dbe689fe46c 100644 (file)
@@ -164,34 +164,19 @@ static int nfs_attribute_timeout(struct inode *inode)
        return !time_in_range_open(jiffies, nfsi->read_cache_jiffies, nfsi->read_cache_jiffies + nfsi->attrtimeo);
 }
 
-static bool nfs_check_cache_invalid_delegated(struct inode *inode, unsigned long flags)
+static bool nfs_check_cache_flags_invalid(struct inode *inode,
+                                         unsigned long flags)
 {
        unsigned long cache_validity = READ_ONCE(NFS_I(inode)->cache_validity);
 
-       /* Special case for the pagecache or access cache */
-       if (flags == NFS_INO_REVAL_PAGECACHE &&
-           !(cache_validity & NFS_INO_REVAL_FORCED))
-               return false;
        return (cache_validity & flags) != 0;
 }
 
-static bool nfs_check_cache_invalid_not_delegated(struct inode *inode, unsigned long flags)
-{
-       unsigned long cache_validity = READ_ONCE(NFS_I(inode)->cache_validity);
-
-       if ((cache_validity & flags) != 0)
-               return true;
-       if (nfs_attribute_timeout(inode))
-               return true;
-       return false;
-}
-
 bool nfs_check_cache_invalid(struct inode *inode, unsigned long flags)
 {
-       if (NFS_PROTO(inode)->have_delegation(inode, FMODE_READ))
-               return nfs_check_cache_invalid_delegated(inode, flags);
-
-       return nfs_check_cache_invalid_not_delegated(inode, flags);
+       if (nfs_check_cache_flags_invalid(inode, flags))
+               return true;
+       return nfs_attribute_cache_expired(inode);
 }
 EXPORT_SYMBOL_GPL(nfs_check_cache_invalid);
 
@@ -809,14 +794,12 @@ static u32 nfs_get_valid_attrmask(struct inode *inode)
 
        if (!(cache_validity & NFS_INO_INVALID_ATIME))
                reply_mask |= STATX_ATIME;
-       if (!(cache_validity & NFS_INO_REVAL_PAGECACHE)) {
-               if (!(cache_validity & NFS_INO_INVALID_CTIME))
-                       reply_mask |= STATX_CTIME;
-               if (!(cache_validity & NFS_INO_INVALID_MTIME))
-                       reply_mask |= STATX_MTIME;
-               if (!(cache_validity & NFS_INO_INVALID_SIZE))
-                       reply_mask |= STATX_SIZE;
-       }
+       if (!(cache_validity & NFS_INO_INVALID_CTIME))
+               reply_mask |= STATX_CTIME;
+       if (!(cache_validity & NFS_INO_INVALID_MTIME))
+               reply_mask |= STATX_MTIME;
+       if (!(cache_validity & NFS_INO_INVALID_SIZE))
+               reply_mask |= STATX_SIZE;
        if (!(cache_validity & NFS_INO_INVALID_OTHER))
                reply_mask |= STATX_UID | STATX_GID | STATX_MODE | STATX_NLINK;
        if (!(cache_validity & NFS_INO_INVALID_BLOCKS))
@@ -1362,7 +1345,7 @@ out:
 
 bool nfs_mapping_need_revalidate_inode(struct inode *inode)
 {
-       return nfs_check_cache_invalid(inode, NFS_INO_REVAL_PAGECACHE) ||
+       return nfs_check_cache_invalid(inode, NFS_INO_INVALID_CHANGE) ||
                NFS_STALE(inode);
 }
 
index 6b990fe5bc1f8b81292c75aa042c5556df52860a..a213115204043bac4b8dda893f1056635461cf0d 100644 (file)
@@ -5429,7 +5429,7 @@ static void nfs4_bitmask_set(__u32 bitmask[NFS4_BITMASK_SZ], const __u32 *src,
 
        memcpy(bitmask, src, sizeof(*bitmask) * NFS4_BITMASK_SZ);
 
-       if (cache_validity & (NFS_INO_INVALID_CHANGE | NFS_INO_REVAL_PAGECACHE))
+       if (cache_validity & NFS_INO_INVALID_CHANGE)
                bitmask[0] |= FATTR4_WORD0_CHANGE;
        if (cache_validity & NFS_INO_INVALID_ATIME)
                bitmask[1] |= FATTR4_WORD1_TIME_ACCESS;
@@ -5449,8 +5449,7 @@ static void nfs4_bitmask_set(__u32 bitmask[NFS4_BITMASK_SZ], const __u32 *src,
        if (nfs4_have_delegation(inode, FMODE_READ) &&
            !(cache_validity & NFS_INO_REVAL_FORCED))
                bitmask[0] &= ~FATTR4_WORD0_SIZE;
-       else if (cache_validity &
-                (NFS_INO_INVALID_SIZE | NFS_INO_REVAL_PAGECACHE))
+       else if (cache_validity & NFS_INO_INVALID_SIZE)
                bitmask[0] |= FATTR4_WORD0_SIZE;
 
        for (i = 0; i < NFS4_BITMASK_SZ; i++)
index f05a90338a76fe2d86d37d10b47b127c703a8c93..7a39b3d424da6e666eab958710f510f798da1bfe 100644 (file)
@@ -1293,7 +1293,7 @@ static bool nfs_write_pageuptodate(struct page *page, struct inode *inode,
        if (nfs_have_delegated_attributes(inode))
                goto out;
        if (nfsi->cache_validity &
-           (NFS_INO_REVAL_PAGECACHE | NFS_INO_INVALID_SIZE))
+           (NFS_INO_INVALID_CHANGE | NFS_INO_INVALID_SIZE))
                return false;
        smp_rmb();
        if (test_bit(NFS_INO_INVALIDATING, &nfsi->flags) && pagelen != 0)