NFS: Add a cache validity flag argument to nfs_revalidate_inode()
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Thu, 25 Mar 2021 15:04:34 +0000 (11:04 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Tue, 13 Apr 2021 00:11:44 +0000 (20:11 -0400)
Add an argument to nfs_revalidate_inode() to allow callers to specify
which attributes they need to check for validity.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/dir.c
fs/nfs/export.c
fs/nfs/inode.c
fs/nfs/nfs3acl.c
fs/nfs/nfs4proc.c
include/linux/nfs_fs.h

index 0cd7c59..e924d65 100644 (file)
@@ -3006,7 +3006,7 @@ out_notsup:
        if (mask & MAY_NOT_BLOCK)
                return -ECHILD;
 
-       res = nfs_revalidate_inode(NFS_SERVER(inode), inode);
+       res = nfs_revalidate_inode(inode, NFS_INO_INVALID_OTHER);
        if (res == 0)
                res = generic_permission(&init_user_ns, inode, mask);
        goto out;
index b347e3c..37a1a88 100644 (file)
@@ -169,11 +169,7 @@ out:
 
 static u64 nfs_fetch_iversion(struct inode *inode)
 {
-       struct nfs_server *server = NFS_SERVER(inode);
-
-       if (nfs_check_cache_invalid(inode, NFS_INO_INVALID_CHANGE |
-                                                  NFS_INO_REVAL_PAGECACHE))
-               __nfs_revalidate_inode(server, inode);
+       nfs_revalidate_inode(inode, NFS_INO_INVALID_CHANGE);
        return inode_peek_iversion_raw(inode);
 }
 
index d34da63..b9aac40 100644 (file)
@@ -802,16 +802,6 @@ static void nfs_readdirplus_parent_cache_hit(struct dentry *dentry)
        dput(parent);
 }
 
-static bool nfs_need_revalidate_inode(struct inode *inode)
-{
-       if (NFS_I(inode)->cache_validity &
-                       (NFS_INO_INVALID_ATTR|NFS_INO_INVALID_LABEL))
-               return true;
-       if (nfs_attribute_cache_expired(inode))
-               return true;
-       return false;
-}
-
 static u32 nfs_get_valid_attrmask(struct inode *inode)
 {
        unsigned long cache_validity = READ_ONCE(NFS_I(inode)->cache_validity);
@@ -1004,7 +994,6 @@ void nfs_close_context(struct nfs_open_context *ctx, int is_sync)
 {
        struct nfs_inode *nfsi;
        struct inode *inode;
-       struct nfs_server *server;
 
        if (!(ctx->mode & FMODE_WRITE))
                return;
@@ -1020,10 +1009,10 @@ void nfs_close_context(struct nfs_open_context *ctx, int is_sync)
                return;
        if (!list_empty(&nfsi->open_files))
                return;
-       server = NFS_SERVER(inode);
-       if (server->flags & NFS_MOUNT_NOCTO)
+       if (NFS_SERVER(inode)->flags & NFS_MOUNT_NOCTO)
                return;
-       nfs_revalidate_inode(server, inode);
+       nfs_revalidate_inode(inode,
+                            NFS_INO_INVALID_CHANGE | NFS_INO_INVALID_SIZE);
 }
 EXPORT_SYMBOL_GPL(nfs_close_context);
 
@@ -1278,16 +1267,16 @@ int nfs_attribute_cache_expired(struct inode *inode)
 
 /**
  * nfs_revalidate_inode - Revalidate the inode attributes
- * @server: pointer to nfs_server struct
  * @inode: pointer to inode struct
+ * @flags: cache flags to check
  *
  * Updates inode attribute information by retrieving the data from the server.
  */
-int nfs_revalidate_inode(struct nfs_server *server, struct inode *inode)
+int nfs_revalidate_inode(struct inode *inode, unsigned long flags)
 {
-       if (!nfs_need_revalidate_inode(inode))
+       if (!nfs_check_cache_invalid(inode, flags))
                return NFS_STALE(inode) ? -ESTALE : 0;
-       return __nfs_revalidate_inode(server, inode);
+       return __nfs_revalidate_inode(NFS_SERVER(inode), inode);
 }
 EXPORT_SYMBOL_GPL(nfs_revalidate_inode);
 
index bb386a6..9ec560a 100644 (file)
@@ -65,7 +65,7 @@ struct posix_acl *nfs3_get_acl(struct inode *inode, int type)
        if (!nfs_server_capable(inode, NFS_CAP_ACLS))
                return ERR_PTR(-EOPNOTSUPP);
 
-       status = nfs_revalidate_inode(server, inode);
+       status = nfs_revalidate_inode(inode, NFS_INO_INVALID_CHANGE);
        if (status < 0)
                return ERR_PTR(status);
 
index 1cf98c4..6b990fe 100644 (file)
@@ -5868,7 +5868,7 @@ static ssize_t nfs4_proc_get_acl(struct inode *inode, void *buf, size_t buflen)
 
        if (!nfs4_server_supports_acls(server))
                return -EOPNOTSUPP;
-       ret = nfs_revalidate_inode(server, inode);
+       ret = nfs_revalidate_inode(inode, NFS_INO_INVALID_CHANGE);
        if (ret < 0)
                return ret;
        if (NFS_I(inode)->cache_validity & NFS_INO_INVALID_ACL)
@@ -7619,7 +7619,7 @@ static int nfs4_xattr_get_nfs4_user(const struct xattr_handler *handler,
                        return -EACCES;
        }
 
-       ret = nfs_revalidate_inode(NFS_SERVER(inode), inode);
+       ret = nfs_revalidate_inode(inode, NFS_INO_INVALID_CHANGE);
        if (ret)
                return ret;
 
@@ -7650,7 +7650,7 @@ nfs4_listxattr_nfs4_user(struct inode *inode, char *list, size_t list_len)
                        return 0;
        }
 
-       ret = nfs_revalidate_inode(NFS_SERVER(inode), inode);
+       ret = nfs_revalidate_inode(inode, NFS_INO_INVALID_CHANGE);
        if (ret)
                return ret;
 
index eadaabd..624ffd4 100644 (file)
@@ -386,7 +386,7 @@ extern void nfs_access_set_mask(struct nfs_access_entry *, u32);
 extern int nfs_permission(struct user_namespace *, struct inode *, int);
 extern int nfs_open(struct inode *, struct file *);
 extern int nfs_attribute_cache_expired(struct inode *inode);
-extern int nfs_revalidate_inode(struct nfs_server *server, struct inode *inode);
+extern int nfs_revalidate_inode(struct inode *inode, unsigned long flags);
 extern int __nfs_revalidate_inode(struct nfs_server *, struct inode *);
 extern int nfs_clear_invalid_mapping(struct address_space *mapping);
 extern bool nfs_mapping_need_revalidate_inode(struct inode *inode);