aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs
diff options
context:
space:
mode:
authorChuck Lever <chuck.lever@oracle.com>2010-02-01 14:17:50 -0500
committerTrond Myklebust <Trond.Myklebust@netapp.com>2010-02-10 08:31:05 -0500
commitf895c53f8ace3c3e49ebf9def90e63fc6d46d2bf (patch)
tree93a6c17949a0e0bf194127be7cd0fa2a3bdd300f /fs/nfs
parent7e381172cf6e0282a56374e50667515aed55166a (diff)
NFS: Make close(2) asynchronous when closing NFS O_DIRECT files
For NFSv2 and v3: O_DIRECT writes are always synchronous, and aren't cached, so nothing should be flushed when closing an NFS O_DIRECT file descriptor. Thus there are no write errors to report on close(2). In addition, there's no cached data to verify on the next open(2), so we don't need clean GETATTR results at close time to compare with. Thus, there's no need for the nfs_revalidate_inode() call when closing an NFS O_DIRECT file. This reduces the number of synchronous on-the-wire requests for a simple open-write-close of an NFS O_DIRECT file by roughly 20%. For NFSv4: Call nfs4_do_close() with wait set to zero when closing an NFS O_DIRECT file. The CLOSE will go on the wire, but the application won't wait for it to complete. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs')
-rw-r--r--fs/nfs/inode.c7
1 files changed, 1 insertions, 6 deletions
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
index f141bde7756a..87cca56846d6 100644
--- a/fs/nfs/inode.c
+++ b/fs/nfs/inode.c
@@ -620,11 +620,6 @@ void put_nfs_open_context(struct nfs_open_context *ctx)
620 __put_nfs_open_context(ctx, 0); 620 __put_nfs_open_context(ctx, 0);
621} 621}
622 622
623static void put_nfs_open_context_sync(struct nfs_open_context *ctx)
624{
625 __put_nfs_open_context(ctx, 1);
626}
627
628/* 623/*
629 * Ensure that mmap has a recent RPC credential for use when writing out 624 * Ensure that mmap has a recent RPC credential for use when writing out
630 * shared pages 625 * shared pages
@@ -671,7 +666,7 @@ static void nfs_file_clear_open_context(struct file *filp)
671 spin_lock(&inode->i_lock); 666 spin_lock(&inode->i_lock);
672 list_move_tail(&ctx->list, &NFS_I(inode)->open_files); 667 list_move_tail(&ctx->list, &NFS_I(inode)->open_files);
673 spin_unlock(&inode->i_lock); 668 spin_unlock(&inode->i_lock);
674 put_nfs_open_context_sync(ctx); 669 __put_nfs_open_context(ctx, filp->f_flags & O_DIRECT ? 0 : 1);
675 } 670 }
676} 671}
677 672