path: root/fs
diff options
authorNeilBrown <>2011-11-16 11:46:31 +1100
committerGreg Kroah-Hartman <>2012-01-18 07:31:55 -0800
commit6ab1a5d77456d333674ed3b9a2bd3c29715965b6 (patch)
tree8cae026a65dd542371638822b03776d9f5979849 /fs
parent6f02bf1cbb5031ad69e5b34a5912e179c6fa78c3 (diff)
NFS - fix recent breakage to NFS error handling.
commit 2edb6bc3852c681c0d948245bd55108dc6407604 upstream. From c6d615d2b97fe305cbf123a8751ced859dca1d5e Mon Sep 17 00:00:00 2001 From: NeilBrown <> Date: Wed, 16 Nov 2011 09:39:05 +1100 Subject: NFS - fix recent breakage to NFS error handling. commit 02c24a82187d5a628c68edfe71ae60dc135cd178 made a small and presumably unintended change to write error handling in NFS. Previously an error from filemap_write_and_wait_range would only be of interest if nfs_file_fsync did not return an error. After this commit, an error from filemap_write_and_wait_range would mean that (the rest of) nfs_file_fsync would not even be called. This means that: 1/ you are more likely to see EIO than e.g. EDQUOT or ENOSPC. 2/ NFS_CONTEXT_ERROR_WRITE remains set for longer so more writes are synchronous. This patch restores previous behaviour. Cc: Josef Bacik <> Cc: Jan Kara <> Cc: Al Viro <> Signed-off-by: NeilBrown <> Signed-off-by: Trond Myklebust <> Signed-off-by: Greg Kroah-Hartman <>
Diffstat (limited to 'fs')
1 files changed, 2 insertions, 2 deletions
diff --git a/fs/nfs/file.c b/fs/nfs/file.c
index babaf3a4d99c..b76be2fb5730 100644
--- a/fs/nfs/file.c
+++ b/fs/nfs/file.c
@@ -321,13 +321,13 @@ nfs_file_fsync(struct file *file, loff_t start, loff_t end, int datasync)
ret = filemap_write_and_wait_range(inode->i_mapping, start, end);
- if (ret)
- return ret;
nfs_inc_stats(inode, NFSIOS_VFSFSYNC);
have_error = test_and_clear_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags);
status = nfs_commit_inode(inode, FLUSH_SYNC);
+ if (status >= 0 && ret < 0)
+ status = ret;
have_error |= test_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags);
if (have_error)
ret = xchg(&ctx->error, 0);