NFS: Filter cache invalidation when holding a delegation
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Sun, 3 Jun 2018 17:05:21 +0000 (13:05 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Mon, 4 Jun 2018 19:03:58 +0000 (15:03 -0400)
If the client holds a delegation, then ensure we filter out attempts
to invalidate the size, owner, group owner, or mode unless we made the
change, in which case, check that NFS_INO_REVAL_FORCED is set by the
caller.
Always filter out attempts to invalidate the change attribute and
size, since we are authoritative for those.

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

index bc84ecaae8868231ced860d050aed22fe6f2432c..73473d9bdfa499945540eda1296719646acc8cae 100644 (file)
@@ -195,10 +195,16 @@ bool nfs_check_cache_invalid(struct inode *inode, unsigned long flags)
 static void nfs_set_cache_invalid(struct inode *inode, unsigned long flags)
 {
        struct nfs_inode *nfsi = NFS_I(inode);
-       bool have_delegation = nfs_have_delegated_attributes(inode);
+       bool have_delegation = NFS_PROTO(inode)->have_delegation(inode, FMODE_READ);
+
+       if (have_delegation) {
+               if (!(flags & NFS_INO_REVAL_FORCED))
+                       flags &= ~NFS_INO_INVALID_OTHER;
+               flags &= ~(NFS_INO_INVALID_CHANGE
+                               | NFS_INO_INVALID_SIZE
+                               | NFS_INO_REVAL_PAGECACHE);
+       }
 
-       if (have_delegation)
-               flags &= ~(NFS_INO_INVALID_CHANGE|NFS_INO_REVAL_PAGECACHE);
        if (inode->i_mapping->nrpages == 0)
                flags &= ~NFS_INO_INVALID_DATA;
        nfsi->cache_validity |= flags;