NFS: Optimise away the close-to-open getattr if there is no cached data
authorTrond Myklebust <trond.myklebust@primarydata.com>
Fri, 4 Sep 2015 19:07:37 +0000 (15:07 -0400)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Fri, 4 Sep 2015 20:54:28 +0000 (16:54 -0400)
If there is no cached data, then there is no need to track the file
change attribute on close.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
fs/nfs/inode.c

index 99a68bd9c17828bd6f9f55575738486d37b69430..6307d8de103d037568dbfa488239aa8b34f96f7f 100644 (file)
@@ -761,11 +761,13 @@ EXPORT_SYMBOL_GPL(nfs_put_lock_context);
  * @ctx: pointer to context
  * @is_sync: is this a synchronous close
  *
- * always ensure that the attributes are up to date if we're mounted
- * with close-to-open semantics
+ * Ensure that the attributes are up to date if we're mounted
+ * with close-to-open semantics and we have cached data that will
+ * need to be revalidated on open.
  */
 void nfs_close_context(struct nfs_open_context *ctx, int is_sync)
 {
+       struct nfs_inode *nfsi;
        struct inode *inode;
        struct nfs_server *server;
 
@@ -774,7 +776,12 @@ void nfs_close_context(struct nfs_open_context *ctx, int is_sync)
        if (!is_sync)
                return;
        inode = d_inode(ctx->dentry);
-       if (!list_empty(&NFS_I(inode)->open_files))
+       nfsi = NFS_I(inode);
+       if (inode->i_mapping->nrpages == 0)
+               return;
+       if (nfsi->cache_validity & NFS_INO_INVALID_DATA)
+               return;
+       if (!list_empty(&nfsi->open_files))
                return;
        server = NFS_SERVER(inode);
        if (server->flags & NFS_MOUNT_NOCTO)