]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
mm: clean up error handling in write_one_page
authorJeff Layton <jlayton@redhat.com>
Wed, 5 Jul 2017 19:17:19 +0000 (15:17 -0400)
committerJeff Layton <jlayton@redhat.com>
Wed, 5 Jul 2017 22:44:22 +0000 (18:44 -0400)
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>
mm/page-writeback.c

index b901fe52b153020be937f97b4d31498c1768a4a9..db30ce0b7d80c18a06a7994a89725994485e55c3 100644 (file)
@@ -2371,9 +2371,8 @@ int do_writepages(struct address_space *mapping, struct writeback_control *wbc)
  *
  * The page must be locked by the caller and will be unlocked upon return.
  *
- * write_one_page() returns a negative error code if I/O failed. Note that
- * the address_space is not marked for error. The caller must do this if
- * needed.
+ * Note that the mapping's AS_EIO/AS_ENOSPC flags will be cleared when this
+ * function returns.
  */
 int write_one_page(struct page *page)
 {
@@ -2391,15 +2390,15 @@ int write_one_page(struct page *page)
        if (clear_page_dirty_for_io(page)) {
                get_page(page);
                ret = mapping->a_ops->writepage(page, &wbc);
-               if (ret == 0) {
+               if (ret == 0)
                        wait_on_page_writeback(page);
-                       if (PageError(page))
-                               ret = -EIO;
-               }
                put_page(page);
        } else {
                unlock_page(page);
        }
+
+       if (!ret)
+               ret = filemap_check_errors(mapping);
        return ret;
 }
 EXPORT_SYMBOL(write_one_page);