| From 2edb6bc3852c681c0d948245bd55108dc6407604 Mon Sep 17 00:00:00 2001 |
| From: NeilBrown <neilb@suse.de> |
| Date: Wed, 16 Nov 2011 11:46:31 +1100 |
| Subject: NFS - fix recent breakage to NFS error handling. |
| |
| From: NeilBrown <neilb@suse.de> |
| |
| commit 2edb6bc3852c681c0d948245bd55108dc6407604 upstream. |
| |
| From c6d615d2b97fe305cbf123a8751ced859dca1d5e Mon Sep 17 00:00:00 2001 |
| From: NeilBrown <neilb@suse.de> |
| 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 <josef@redhat.com> |
| Cc: Jan Kara <jack@suse.cz> |
| Cc: Al Viro <viro@zeniv.linux.org.uk> |
| Signed-off-by: NeilBrown <neilb@suse.de> |
| Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| fs/nfs/file.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/fs/nfs/file.c |
| +++ b/fs/nfs/file.c |
| @@ -272,13 +272,13 @@ nfs_file_fsync(struct file *file, loff_t |
| datasync); |
| |
| ret = filemap_write_and_wait_range(inode->i_mapping, start, end); |
| - if (ret) |
| - return ret; |
| mutex_lock(&inode->i_mutex); |
| |
| 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); |