nfs: define and use the NFS_INO_INVALID_XATTR flag
authorFrank van der Linden <fllinden@amazon.com>
Tue, 23 Jun 2020 22:39:00 +0000 (22:39 +0000)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Mon, 13 Jul 2020 21:52:45 +0000 (17:52 -0400)
Define the NFS_INO_INVALID_XATTR flag, to be used for the NFSv4.2 xattr
cache, and use it where appropriate.

No functional change as yet.

Signed-off-by: Frank van der Linden <fllinden@amazon.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/inode.c
fs/nfs/nfs4proc.c
fs/nfs/nfstrace.h
include/linux/nfs_fs.h

index 0bf1f83..629af79 100644 (file)
@@ -204,7 +204,8 @@ static void nfs_set_cache_invalid(struct inode *inode, unsigned long flags)
                        flags &= ~NFS_INO_INVALID_OTHER;
                flags &= ~(NFS_INO_INVALID_CHANGE
                                | NFS_INO_INVALID_SIZE
-                               | NFS_INO_REVAL_PAGECACHE);
+                               | NFS_INO_REVAL_PAGECACHE
+                               | NFS_INO_INVALID_XATTR);
        }
 
        if (inode->i_mapping->nrpages == 0)
@@ -542,6 +543,8 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr, st
                        inode->i_gid = fattr->gid;
                else if (nfs_server_capable(inode, NFS_CAP_OWNER_GROUP))
                        nfs_set_cache_invalid(inode, NFS_INO_INVALID_OTHER);
+               if (nfs_server_capable(inode, NFS_CAP_XATTR))
+                       nfs_set_cache_invalid(inode, NFS_INO_INVALID_XATTR);
                if (fattr->valid & NFS_ATTR_FATTR_BLOCKS_USED)
                        inode->i_blocks = fattr->du.nfs2.blocks;
                if (fattr->valid & NFS_ATTR_FATTR_SPACE_USED) {
@@ -1375,6 +1378,8 @@ static void nfs_wcc_update_inode(struct inode *inode, struct nfs_fattr *fattr)
                inode_set_iversion_raw(inode, fattr->change_attr);
                if (S_ISDIR(inode->i_mode))
                        nfs_set_cache_invalid(inode, NFS_INO_INVALID_DATA);
+               else if (nfs_server_capable(inode, NFS_CAP_XATTR))
+                       nfs_set_cache_invalid(inode, NFS_INO_INVALID_XATTR);
        }
        /* If we have atomic WCC data, we may update some attributes */
        ts = inode->i_ctime;
index 6540071..0d123fe 100644 (file)
@@ -1183,7 +1183,8 @@ nfs4_update_changeattr_locked(struct inode *inode,
 
                if (cinfo->before != inode_peek_iversion_raw(inode))
                        nfsi->cache_validity |= NFS_INO_INVALID_ACCESS |
-                                               NFS_INO_INVALID_ACL;
+                                               NFS_INO_INVALID_ACL |
+                                               NFS_INO_INVALID_XATTR;
        }
        inode_set_iversion_raw(inode, cinfo->after);
        nfsi->read_cache_jiffies = timestamp;
index 547cec7..5a59dcd 100644 (file)
@@ -59,7 +59,8 @@ TRACE_DEFINE_ENUM(NFS_INO_INVALID_OTHER);
                        { NFS_INO_INVALID_CTIME, "INVALID_CTIME" }, \
                        { NFS_INO_INVALID_MTIME, "INVALID_MTIME" }, \
                        { NFS_INO_INVALID_SIZE, "INVALID_SIZE" }, \
-                       { NFS_INO_INVALID_OTHER, "INVALID_OTHER" })
+                       { NFS_INO_INVALID_OTHER, "INVALID_OTHER" }, \
+                       { NFS_INO_INVALID_XATTR, "INVALID_XATTR" })
 
 TRACE_DEFINE_ENUM(NFS_INO_ADVISE_RDPLUS);
 TRACE_DEFINE_ENUM(NFS_INO_STALE);
index 714b577..943ee75 100644 (file)
@@ -234,6 +234,7 @@ struct nfs4_copy_state {
 #define NFS_INO_DATA_INVAL_DEFER       \
                                BIT(13)         /* Deferred cache invalidation */
 #define NFS_INO_INVALID_BLOCKS BIT(14)         /* cached blocks are invalid */
+#define NFS_INO_INVALID_XATTR  BIT(15)         /* xattrs are invalid */
 
 #define NFS_INO_INVALID_ATTR   (NFS_INO_INVALID_CHANGE \
                | NFS_INO_INVALID_CTIME \