diff options
Diffstat (limited to 'fs/nfs/write.c')
| -rw-r--r-- | fs/nfs/write.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/fs/nfs/write.c b/fs/nfs/write.c index 5a0bbf917a32..d09c9f878141 100644 --- a/fs/nfs/write.c +++ b/fs/nfs/write.c | |||
| @@ -238,9 +238,9 @@ out: | |||
| 238 | } | 238 | } |
| 239 | 239 | ||
| 240 | /* A writeback failed: mark the page as bad, and invalidate the page cache */ | 240 | /* A writeback failed: mark the page as bad, and invalidate the page cache */ |
| 241 | static void nfs_set_pageerror(struct page *page) | 241 | static void nfs_set_pageerror(struct address_space *mapping) |
| 242 | { | 242 | { |
| 243 | nfs_zap_mapping(page_file_mapping(page)->host, page_file_mapping(page)); | 243 | nfs_zap_mapping(mapping->host, mapping); |
| 244 | } | 244 | } |
| 245 | 245 | ||
| 246 | /* | 246 | /* |
| @@ -621,11 +621,12 @@ static int nfs_page_async_flush(struct nfs_pageio_descriptor *pgio, | |||
| 621 | nfs_set_page_writeback(page); | 621 | nfs_set_page_writeback(page); |
| 622 | WARN_ON_ONCE(test_bit(PG_CLEAN, &req->wb_flags)); | 622 | WARN_ON_ONCE(test_bit(PG_CLEAN, &req->wb_flags)); |
| 623 | 623 | ||
| 624 | ret = 0; | 624 | ret = req->wb_context->error; |
| 625 | /* If there is a fatal error that covers this write, just exit */ | 625 | /* If there is a fatal error that covers this write, just exit */ |
| 626 | if (nfs_error_is_fatal_on_server(req->wb_context->error)) | 626 | if (nfs_error_is_fatal_on_server(ret)) |
| 627 | goto out_launder; | 627 | goto out_launder; |
| 628 | 628 | ||
| 629 | ret = 0; | ||
| 629 | if (!nfs_pageio_add_request(pgio, req)) { | 630 | if (!nfs_pageio_add_request(pgio, req)) { |
| 630 | ret = pgio->pg_error; | 631 | ret = pgio->pg_error; |
| 631 | /* | 632 | /* |
| @@ -635,9 +636,9 @@ static int nfs_page_async_flush(struct nfs_pageio_descriptor *pgio, | |||
| 635 | nfs_context_set_write_error(req->wb_context, ret); | 636 | nfs_context_set_write_error(req->wb_context, ret); |
| 636 | if (nfs_error_is_fatal_on_server(ret)) | 637 | if (nfs_error_is_fatal_on_server(ret)) |
| 637 | goto out_launder; | 638 | goto out_launder; |
| 638 | } | 639 | } else |
| 640 | ret = -EAGAIN; | ||
| 639 | nfs_redirty_request(req); | 641 | nfs_redirty_request(req); |
| 640 | ret = -EAGAIN; | ||
| 641 | } else | 642 | } else |
| 642 | nfs_add_stats(page_file_mapping(page)->host, | 643 | nfs_add_stats(page_file_mapping(page)->host, |
| 643 | NFSIOS_WRITEPAGES, 1); | 644 | NFSIOS_WRITEPAGES, 1); |
| @@ -993,7 +994,7 @@ static void nfs_write_completion(struct nfs_pgio_header *hdr) | |||
| 993 | nfs_list_remove_request(req); | 994 | nfs_list_remove_request(req); |
| 994 | if (test_bit(NFS_IOHDR_ERROR, &hdr->flags) && | 995 | if (test_bit(NFS_IOHDR_ERROR, &hdr->flags) && |
| 995 | (hdr->good_bytes < bytes)) { | 996 | (hdr->good_bytes < bytes)) { |
| 996 | nfs_set_pageerror(req->wb_page); | 997 | nfs_set_pageerror(page_file_mapping(req->wb_page)); |
| 997 | nfs_context_set_write_error(req->wb_context, hdr->error); | 998 | nfs_context_set_write_error(req->wb_context, hdr->error); |
| 998 | goto remove_req; | 999 | goto remove_req; |
| 999 | } | 1000 | } |
| @@ -1347,7 +1348,8 @@ int nfs_updatepage(struct file *file, struct page *page, | |||
| 1347 | unsigned int offset, unsigned int count) | 1348 | unsigned int offset, unsigned int count) |
| 1348 | { | 1349 | { |
| 1349 | struct nfs_open_context *ctx = nfs_file_open_context(file); | 1350 | struct nfs_open_context *ctx = nfs_file_open_context(file); |
| 1350 | struct inode *inode = page_file_mapping(page)->host; | 1351 | struct address_space *mapping = page_file_mapping(page); |
| 1352 | struct inode *inode = mapping->host; | ||
| 1351 | int status = 0; | 1353 | int status = 0; |
| 1352 | 1354 | ||
| 1353 | nfs_inc_stats(inode, NFSIOS_VFSUPDATEPAGE); | 1355 | nfs_inc_stats(inode, NFSIOS_VFSUPDATEPAGE); |
| @@ -1365,7 +1367,7 @@ int nfs_updatepage(struct file *file, struct page *page, | |||
| 1365 | 1367 | ||
| 1366 | status = nfs_writepage_setup(ctx, page, offset, count); | 1368 | status = nfs_writepage_setup(ctx, page, offset, count); |
| 1367 | if (status < 0) | 1369 | if (status < 0) |
| 1368 | nfs_set_pageerror(page); | 1370 | nfs_set_pageerror(mapping); |
| 1369 | else | 1371 | else |
| 1370 | __set_page_dirty_nobuffers(page); | 1372 | __set_page_dirty_nobuffers(page); |
| 1371 | out: | 1373 | out: |
