diff options
-rw-r--r-- | mm/page-writeback.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 3ca18f0bdce6..ac3db798d6ab 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -948,11 +948,26 @@ retry: ret = (*writepage)(page, wbc, data); - if (unlikely(ret == AOP_WRITEPAGE_ACTIVATE)) { - unlock_page(page); - ret = 0; - } - if (ret || (--(wbc->nr_to_write) <= 0)) + if (unlikely(ret)) { + if (ret == AOP_WRITEPAGE_ACTIVATE) { + unlock_page(page); + ret = 0; + } else { + /* + * done_index is set past this page, + * so media errors will not choke + * background writeout for the entire + * file. This has consequences for + * range_cyclic semantics (ie. it may + * not be suitable for data integrity + * writeout). + */ + done = 1; + break; + } + } + + if (--(wbc->nr_to_write) <= 0) done = 1; if (wbc->nonblocking && bdi_write_congested(bdi)) { wbc->encountered_congestion = 1; |