NFS: Don't revalidate attributes that are not being asked for
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Wed, 24 Mar 2021 17:55:09 +0000 (13:55 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Mon, 12 Apr 2021 21:14:17 +0000 (17:14 -0400)
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@hammerspace.com>
fs/nfs/inode.c

index 8b2f4a5..4982bc1 100644 (file)
@@ -857,12 +857,17 @@ 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;
+       if (request_mask & STATX_MTIME)
+               do_update |= cache_validity & NFS_INO_INVALID_MTIME;
+       if (request_mask & STATX_SIZE)
+               do_update |= cache_validity & NFS_INO_INVALID_SIZE;
+       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) {