diff options
author | NeilBrown <neilb@suse.de> | 2011-11-15 19:46:31 -0500 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2012-01-05 10:42:39 -0500 |
commit | 2edb6bc3852c681c0d948245bd55108dc6407604 (patch) | |
tree | 3a84180074a9b84eed53beec526e20ea6f4109b0 /fs/nfs/file.c | |
parent | 43717c7daebf10b43f12e68512484b3095bb1ba5 (diff) |
NFS - fix recent breakage to NFS error handling.
From c6d615d2b97fe305cbf123a8751ced859dca1d5e Mon Sep 17 00:00:00 2001
From: NeilBrown <neilb@suse.de>
Date: Wed, 16 Nov 2011 09:39:05 +1100
Subject: [PATCH] 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: stable@kernel.org
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>
Diffstat (limited to 'fs/nfs/file.c')
-rw-r--r-- | fs/nfs/file.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/fs/nfs/file.c b/fs/nfs/file.c index 606ef0f20aed..c43a452f7da2 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c | |||
@@ -272,13 +272,13 @@ nfs_file_fsync(struct file *file, loff_t start, loff_t end, int datasync) | |||
272 | datasync); | 272 | datasync); |
273 | 273 | ||
274 | ret = filemap_write_and_wait_range(inode->i_mapping, start, end); | 274 | ret = filemap_write_and_wait_range(inode->i_mapping, start, end); |
275 | if (ret) | ||
276 | return ret; | ||
277 | mutex_lock(&inode->i_mutex); | 275 | mutex_lock(&inode->i_mutex); |
278 | 276 | ||
279 | nfs_inc_stats(inode, NFSIOS_VFSFSYNC); | 277 | nfs_inc_stats(inode, NFSIOS_VFSFSYNC); |
280 | have_error = test_and_clear_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags); | 278 | have_error = test_and_clear_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags); |
281 | status = nfs_commit_inode(inode, FLUSH_SYNC); | 279 | status = nfs_commit_inode(inode, FLUSH_SYNC); |
280 | if (status >= 0 && ret < 0) | ||
281 | status = ret; | ||
282 | have_error |= test_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags); | 282 | have_error |= test_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags); |
283 | if (have_error) | 283 | if (have_error) |
284 | ret = xchg(&ctx->error, 0); | 284 | ret = xchg(&ctx->error, 0); |