On Tue 09-05-17 11:49:24, Jeff Layton wrote: > Don't try to check PageError since that's potentially racy and not > necessarily going to be set after writepage errors out. > > Instead, sample the mapping error early on, and use that value to tell > us whether we got a writeback error since then. > > Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx> Looks good to me. You can add: Reviewed-by: Jan Kara <jack@xxxxxxx> Honza > --- > mm/page-writeback.c | 11 +++++------ > 1 file changed, 5 insertions(+), 6 deletions(-) > > diff --git a/mm/page-writeback.c b/mm/page-writeback.c > index de0dbf12e2c1..1643456881b4 100644 > --- a/mm/page-writeback.c > +++ b/mm/page-writeback.c > @@ -2373,11 +2373,12 @@ int do_writepages(struct address_space *mapping, struct writeback_control *wbc) > int write_one_page(struct page *page) > { > struct address_space *mapping = page->mapping; > - int ret = 0; > + int ret = 0, ret2; > struct writeback_control wbc = { > .sync_mode = WB_SYNC_ALL, > .nr_to_write = 1, > }; > + errseq_t since = filemap_sample_wb_error(mapping); > > BUG_ON(!PageLocked(page)); > > @@ -2386,16 +2387,14 @@ 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); > } > - return ret; > + ret2 = filemap_check_wb_error(mapping, since); > + return ret ? : ret2; > } > EXPORT_SYMBOL(write_one_page); > > -- > 2.9.3 > > -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR