|
@@ -944,12 +944,26 @@ retry:
|
|
|
}
|
|
|
|
|
|
ret = (*writepage)(page, wbc, data);
|
|
|
-
|
|
|
- if (unlikely(ret == AOP_WRITEPAGE_ACTIVATE)) {
|
|
|
- unlock_page(page);
|
|
|
- ret = 0;
|
|
|
- }
|
|
|
- if (ret || (--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 (--nr_to_write <= 0)
|
|
|
done = 1;
|
|
|
if (wbc->nonblocking && bdi_write_congested(bdi)) {
|
|
|
wbc->encountered_congestion = 1;
|