From: Trond Myklebust <trond.myklebust@xxxxxxxxxxxxxxx> If the user doesn't set STATX_UID/GID/MODE, then don't care if they are known to be stale. Ditto if we're not being asked for the file size. Signed-off-by: Trond Myklebust <trond.myklebust@xxxxxxxxxxxxxxx> --- fs/nfs/inode.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index 398f814ff8f8..001a6e4aabfd 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c @@ -852,12 +852,20 @@ int nfs_getattr(struct user_namespace *mnt_userns, const struct path *path, /* Check whether the cached attributes are stale */ do_update |= force_sync || nfs_attribute_cache_expired(inode); cache_validity = READ_ONCE(NFS_I(inode)->cache_validity); - do_update |= cache_validity & - (NFS_INO_INVALID_ATTR|NFS_INO_INVALID_LABEL); + do_update |= cache_validity & NFS_INO_INVALID_CHANGE; if (request_mask & STATX_ATIME) do_update |= cache_validity & NFS_INO_INVALID_ATIME; - if (request_mask & (STATX_CTIME|STATX_MTIME)) - do_update |= cache_validity & NFS_INO_REVAL_PAGECACHE; + if (request_mask & STATX_CTIME) + do_update |= cache_validity & + (NFS_INO_INVALID_CTIME | NFS_INO_REVAL_PAGECACHE); + if (request_mask & STATX_MTIME) + do_update |= cache_validity & + (NFS_INO_INVALID_MTIME | NFS_INO_REVAL_PAGECACHE); + if (request_mask & STATX_SIZE) + do_update |= cache_validity & + (NFS_INO_INVALID_SIZE | NFS_INO_REVAL_PAGECACHE); + if (request_mask & (STATX_UID | STATX_GID | STATX_MODE | STATX_NLINK)) + do_update |= cache_validity & NFS_INO_INVALID_OTHER; if (request_mask & STATX_BLOCKS) do_update |= cache_validity & NFS_INO_INVALID_BLOCKS; if (do_update) { -- 2.30.2