Skip to content

Commit bf4b490

Browse files
NeilBrowntrondmypd
authored andcommitted
NFS: various changes relating to reporting IO errors.
1/ remove 'start' and 'end' args from nfs_file_fsync_commit(). They aren't used. 2/ Make nfs_context_set_write_error() a "static inline" in internal.h so we can... 3/ Use nfs_context_set_write_error() instead of mapping_set_error() if nfs_pageio_add_request() fails before sending any request. NFS generally keeps errors in the open_context, not the mapping, so this is more consistent. 4/ If filemap_write_and_write_range() reports any error, still check ctx->error. The value in ctx->error is likely to be more useful. As part of this, NFS_CONTEXT_ERROR_WRITE is cleared slightly earlier, before nfs_file_fsync_commit() is called, rather than at the start of that function. Signed-off-by: NeilBrown <[email protected]> Signed-off-by: Trond Myklebust <[email protected]>
1 parent 8224b27 commit bf4b490

File tree

4 files changed

+19
-15
lines changed

4 files changed

+19
-15
lines changed

fs/nfs/file.c

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -208,21 +208,19 @@ EXPORT_SYMBOL_GPL(nfs_file_mmap);
208208
* fall back to doing a synchronous write.
209209
*/
210210
static int
211-
nfs_file_fsync_commit(struct file *file, loff_t start, loff_t end, int datasync)
211+
nfs_file_fsync_commit(struct file *file, int datasync)
212212
{
213213
struct nfs_open_context *ctx = nfs_file_open_context(file);
214214
struct inode *inode = file_inode(file);
215-
int have_error, do_resend, status;
215+
int do_resend, status;
216216
int ret = 0;
217217

218218
dprintk("NFS: fsync file(%pD2) datasync %d\n", file, datasync);
219219

220220
nfs_inc_stats(inode, NFSIOS_VFSFSYNC);
221221
do_resend = test_and_clear_bit(NFS_CONTEXT_RESEND_WRITES, &ctx->flags);
222-
have_error = test_and_clear_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags);
223222
status = nfs_commit_inode(inode, FLUSH_SYNC);
224-
have_error |= test_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags);
225-
if (have_error) {
223+
if (test_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags)) {
226224
ret = xchg(&ctx->error, 0);
227225
if (ret)
228226
goto out;
@@ -247,10 +245,16 @@ nfs_file_fsync(struct file *file, loff_t start, loff_t end, int datasync)
247245
trace_nfs_fsync_enter(inode);
248246

249247
do {
248+
struct nfs_open_context *ctx = nfs_file_open_context(file);
250249
ret = filemap_write_and_wait_range(inode->i_mapping, start, end);
250+
if (test_and_clear_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags)) {
251+
int ret2 = xchg(&ctx->error, 0);
252+
if (ret2)
253+
ret = ret2;
254+
}
251255
if (ret != 0)
252256
break;
253-
ret = nfs_file_fsync_commit(file, start, end, datasync);
257+
ret = nfs_file_fsync_commit(file, datasync);
254258
if (!ret)
255259
ret = pnfs_sync_inode(inode, !!datasync);
256260
/*

fs/nfs/internal.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -768,3 +768,10 @@ static inline bool nfs_error_is_fatal(int err)
768768
return false;
769769
}
770770
}
771+
772+
static inline void nfs_context_set_write_error(struct nfs_open_context *ctx, int error)
773+
{
774+
ctx->error = error;
775+
smp_wmb();
776+
set_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags);
777+
}

fs/nfs/pagelist.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1170,8 +1170,8 @@ int nfs_pageio_add_request(struct nfs_pageio_descriptor *desc,
11701170

11711171
/* remember fatal errors */
11721172
if (nfs_error_is_fatal(desc->pg_error))
1173-
mapping_set_error(desc->pg_inode->i_mapping,
1174-
desc->pg_error);
1173+
nfs_context_set_write_error(req->wb_context,
1174+
desc->pg_error);
11751175

11761176
func = desc->pg_completion_ops->error_cleanup;
11771177
for (midx = 0; midx < desc->pg_mirror_count; midx++) {

fs/nfs/write.c

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -145,13 +145,6 @@ static void nfs_io_completion_put(struct nfs_io_completion *ioc)
145145
kref_put(&ioc->refcount, nfs_io_completion_release);
146146
}
147147

148-
static void nfs_context_set_write_error(struct nfs_open_context *ctx, int error)
149-
{
150-
ctx->error = error;
151-
smp_wmb();
152-
set_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags);
153-
}
154-
155148
static struct nfs_page *
156149
nfs_page_private_request(struct page *page)
157150
{

0 commit comments

Comments
 (0)