|
@@ -160,6 +160,36 @@ int nfs_sync_mapping(struct address_space *mapping)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+static bool nfs_check_cache_invalid_delegated(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);
|
|
|
+}
|
|
|
+
|
|
|
static void nfs_set_cache_invalid(struct inode *inode, unsigned long flags)
|
|
|
{
|
|
|
struct nfs_inode *nfsi = NFS_I(inode);
|
|
@@ -1116,17 +1146,8 @@ static int nfs_invalidate_mapping(struct inode *inode, struct address_space *map
|
|
|
|
|
|
bool nfs_mapping_need_revalidate_inode(struct inode *inode)
|
|
|
{
|
|
|
- unsigned long cache_validity = NFS_I(inode)->cache_validity;
|
|
|
-
|
|
|
- if (NFS_PROTO(inode)->have_delegation(inode, FMODE_READ)) {
|
|
|
- const unsigned long force_reval =
|
|
|
- NFS_INO_REVAL_PAGECACHE|NFS_INO_REVAL_FORCED;
|
|
|
- return (cache_validity & force_reval) == force_reval;
|
|
|
- }
|
|
|
-
|
|
|
- return (cache_validity & NFS_INO_REVAL_PAGECACHE)
|
|
|
- || nfs_attribute_timeout(inode)
|
|
|
- || NFS_STALE(inode);
|
|
|
+ return nfs_check_cache_invalid(inode, NFS_INO_REVAL_PAGECACHE) ||
|
|
|
+ NFS_STALE(inode);
|
|
|
}
|
|
|
|
|
|
int nfs_revalidate_mapping_rcu(struct inode *inode)
|