aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Layton <jlayton@redhat.com>2017-07-05 15:17:19 -0400
committerJeff Layton <jlayton@redhat.com>2017-07-05 18:44:22 -0400
commit37e51a7640c275999ea0c35410c42e6d896ff7fa (patch)
tree15188bac299755b313c6881d6d6793d0fdaab611
parent11ab83190828cb7b2cbb26467f2eecf74f0214c3 (diff)
mm: clean up error handling in write_one_page
Don't try to check PageError since that's potentially racy and not necessarily going to be set after writepage errors out. Instead, check the mapping for an error after writepage returns. That should also help us detect errors that occurred if the VM tried to clean the page earlier due to memory pressure. Signed-off-by: Jeff Layton <jlayton@redhat.com> Reviewed-by: Jan Kara <jack@suse.cz>
-rw-r--r--mm/page-writeback.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/mm/page-writeback.c b/mm/page-writeback.c
index b901fe52b153..db30ce0b7d80 100644
--- a/mm/page-writeback.c
+++ b/mm/page-writeback.c
@@ -2371,9 +2371,8 @@ int do_writepages(struct address_space *mapping, struct writeback_control *wbc)
2371 * 2371 *
2372 * The page must be locked by the caller and will be unlocked upon return. 2372 * The page must be locked by the caller and will be unlocked upon return.
2373 * 2373 *
2374 * write_one_page() returns a negative error code if I/O failed. Note that 2374 * Note that the mapping's AS_EIO/AS_ENOSPC flags will be cleared when this
2375 * the address_space is not marked for error. The caller must do this if 2375 * function returns.
2376 * needed.
2377 */ 2376 */
2378int write_one_page(struct page *page) 2377int write_one_page(struct page *page)
2379{ 2378{
@@ -2391,15 +2390,15 @@ int write_one_page(struct page *page)
2391 if (clear_page_dirty_for_io(page)) { 2390 if (clear_page_dirty_for_io(page)) {
2392 get_page(page); 2391 get_page(page);
2393 ret = mapping->a_ops->writepage(page, &wbc); 2392 ret = mapping->a_ops->writepage(page, &wbc);
2394 if (ret == 0) { 2393 if (ret == 0)
2395 wait_on_page_writeback(page); 2394 wait_on_page_writeback(page);
2396 if (PageError(page))
2397 ret = -EIO;
2398 }
2399 put_page(page); 2395 put_page(page);
2400 } else { 2396 } else {
2401 unlock_page(page); 2397 unlock_page(page);
2402 } 2398 }
2399
2400 if (!ret)
2401 ret = filemap_check_errors(mapping);
2403 return ret; 2402 return ret;
2404} 2403}
2405EXPORT_SYMBOL(write_one_page); 2404EXPORT_SYMBOL(write_one_page);