NFS: Judge the file access cache's timestamp in rcu path
authorChengen Du <chengen.du@canonical.com>
Fri, 30 Dec 2022 03:04:32 +0000 (11:04 +0800)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Mon, 2 Jan 2023 01:12:47 +0000 (20:12 -0500)
If the user's login time is newer than the cache's timestamp,
we expect the cache may be stale and need to clear.
The stale cache will remain in the list's tail if no other
users operate on that inode.
Once the user accesses the inode, the stale cache will be
returned in rcu path.

Signed-off-by: Chengen Du <chengen.du@canonical.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/dir.c

index ea1ceffa1d3aa78ee4ccaeb385df5d6c910c6921..d490d64a9ebd05c40e3c4ca613cdd7d577c6f758 100644 (file)
@@ -3023,6 +3023,7 @@ static int nfs_access_get_cached_rcu(struct inode *inode, const struct cred *cre
         * but do it without locking.
         */
        struct nfs_inode *nfsi = NFS_I(inode);
+       u64 login_time = nfs_access_login_time(current, cred);
        struct nfs_access_entry *cache;
        int err = -ECHILD;
        struct list_head *lh;
@@ -3037,6 +3038,8 @@ static int nfs_access_get_cached_rcu(struct inode *inode, const struct cred *cre
                cache = NULL;
        if (cache == NULL)
                goto out;
+       if ((s64)(login_time - cache->timestamp) > 0)
+               goto out;
        if (nfs_check_cache_invalid(inode, NFS_INO_INVALID_ACCESS))
                goto out;
        *mask = cache->mask;