diff --git a/mm/filemap.c b/mm/filemap.c
index f9d88183f6978da403e8b8b26471760cc884842a..9c5e6235cc743e37787c124e9f26a9e287ac8c06 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -210,7 +210,7 @@ int __filemap_fdatawrite_range(struct address_space *mapping, loff_t start,
 	int ret;
 	struct writeback_control wbc = {
 		.sync_mode = sync_mode,
-		.nr_to_write = mapping->nrpages * 2,
+		.nr_to_write = LONG_MAX,
 		.range_start = start,
 		.range_end = end,
 	};
diff --git a/mm/page-writeback.c b/mm/page-writeback.c
index 2e847cdcad0eb3ca3c2ada7be31e70bad2a1689a..5edca676e2c32bef6596b1a6e60744605f1604dc 100644
--- a/mm/page-writeback.c
+++ b/mm/page-writeback.c
@@ -963,8 +963,10 @@ int write_cache_pages(struct address_space *mapping,
 				}
  			}
 
-			if (--nr_to_write <= 0)
-				done = 1;
+			if (wbc->sync_mode == WB_SYNC_NONE) {
+				if (--wbc->nr_to_write <= 0)
+					done = 1;
+			}
 			if (wbc->nonblocking && bdi_write_congested(bdi)) {
 				wbc->encountered_congestion = 1;
 				done = 1;