NFS: Don't fsync twice for O_SYNC/IS_SYNC files

generic_file_write_iter() will already do an fsync on our behalf
if the file descriptor is O_SYNC or the file is marked as IS_SYNC.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
This commit is contained in:
Trond Myklebust 2015-08-17 16:55:18 -05:00
parent 9fba8e30f7
commit 7e94d6c4ab

View File

@ -645,12 +645,10 @@ static const struct vm_operations_struct nfs_file_vm_ops = {
.page_mkwrite = nfs_vm_page_mkwrite, .page_mkwrite = nfs_vm_page_mkwrite,
}; };
static int nfs_need_sync_write(struct file *filp, struct inode *inode) static int nfs_need_check_write(struct file *filp, struct inode *inode)
{ {
struct nfs_open_context *ctx; struct nfs_open_context *ctx;
if (IS_SYNC(inode) || (filp->f_flags & O_DSYNC))
return 1;
ctx = nfs_file_open_context(filp); ctx = nfs_file_open_context(filp);
if (test_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags) || if (test_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags) ||
nfs_ctx_key_to_expire(ctx)) nfs_ctx_key_to_expire(ctx))
@ -700,8 +698,8 @@ ssize_t nfs_file_write(struct kiocb *iocb, struct iov_iter *from)
if (result > 0) if (result > 0)
written = result; written = result;
/* Return error values for O_DSYNC and IS_SYNC() */ /* Return error values */
if (result >= 0 && nfs_need_sync_write(file, inode)) { if (result >= 0 && nfs_need_check_write(file, inode)) {
int err = vfs_fsync(file, 0); int err = vfs_fsync(file, 0);
if (err < 0) if (err < 0)
result = err; result = err;