NFS: More fine grained attribute tracking
Currently, if the NFS_INO_INVALID_ATTR flag is set, for instance by a call to nfs_post_op_update_inode_locked(), then it will not be cleared until all the attributes have been revalidated. This means, for instance, that NFSv4 writes will always force a full attribute revalidation. Track the ctime, mtime, size and change attribute separately from the other attributes so that we can have nfs_post_op_update_inode_locked() set them correctly, and later have the cache consistency bitmask be able to clear them. Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
committed by
Anna Schumaker
parent
cac88f942d
commit
16e1437517
@@ -198,7 +198,6 @@ struct nfs_inode {
|
||||
/*
|
||||
* Cache validity bit flags
|
||||
*/
|
||||
#define NFS_INO_INVALID_ATTR BIT(0) /* cached attrs are invalid */
|
||||
#define NFS_INO_INVALID_DATA BIT(1) /* cached data is invalid */
|
||||
#define NFS_INO_INVALID_ATIME BIT(2) /* cached atime is invalid */
|
||||
#define NFS_INO_INVALID_ACCESS BIT(3) /* cached access cred invalid */
|
||||
@@ -206,6 +205,17 @@ struct nfs_inode {
|
||||
#define NFS_INO_REVAL_PAGECACHE BIT(5) /* must revalidate pagecache */
|
||||
#define NFS_INO_REVAL_FORCED BIT(6) /* force revalidation ignoring a delegation */
|
||||
#define NFS_INO_INVALID_LABEL BIT(7) /* cached label is invalid */
|
||||
#define NFS_INO_INVALID_CHANGE BIT(8) /* cached change is invalid */
|
||||
#define NFS_INO_INVALID_CTIME BIT(9) /* cached ctime is invalid */
|
||||
#define NFS_INO_INVALID_MTIME BIT(10) /* cached mtime is invalid */
|
||||
#define NFS_INO_INVALID_SIZE BIT(11) /* cached size is invalid */
|
||||
#define NFS_INO_INVALID_OTHER BIT(12) /* other attrs are invalid */
|
||||
|
||||
#define NFS_INO_INVALID_ATTR (NFS_INO_INVALID_CHANGE \
|
||||
| NFS_INO_INVALID_CTIME \
|
||||
| NFS_INO_INVALID_MTIME \
|
||||
| NFS_INO_INVALID_SIZE \
|
||||
| NFS_INO_INVALID_OTHER) /* inode metadata is invalid */
|
||||
|
||||
/*
|
||||
* Bit offsets in flags field
|
||||
@@ -292,10 +302,11 @@ static inline void nfs_mark_for_revalidate(struct inode *inode)
|
||||
struct nfs_inode *nfsi = NFS_I(inode);
|
||||
|
||||
spin_lock(&inode->i_lock);
|
||||
nfsi->cache_validity |= NFS_INO_INVALID_ATTR |
|
||||
NFS_INO_REVAL_PAGECACHE |
|
||||
NFS_INO_INVALID_ACCESS |
|
||||
NFS_INO_INVALID_ACL;
|
||||
nfsi->cache_validity |= NFS_INO_REVAL_PAGECACHE
|
||||
| NFS_INO_INVALID_ACCESS
|
||||
| NFS_INO_INVALID_ACL
|
||||
| NFS_INO_INVALID_CHANGE
|
||||
| NFS_INO_INVALID_CTIME;
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
nfsi->cache_validity |= NFS_INO_INVALID_DATA;
|
||||
spin_unlock(&inode->i_lock);
|
||||
|
||||
Reference in New Issue
Block a user