 page-writeback.c |   10 +++++++++-
 1 files changed, 9 insertions(+), 1 deletion(-)

diff -puN mm/page-writeback.c~limit-write-latency mm/page-writeback.c
--- 25/mm/page-writeback.c~limit-write-latency	2003-02-24 22:03:55.000000000 -0800
+++ 25-akpm/mm/page-writeback.c	2003-02-24 22:04:55.000000000 -0800
@@ -140,6 +140,9 @@ void balance_dirty_pages(struct address_
 	long nr_reclaimable;
 	long background_thresh;
 	long dirty_thresh;
+	unsigned long pages_written = 0;
+	unsigned long write_chunk = sync_writeback_pages();
+
 	struct backing_dev_info *bdi = mapping->backing_dev_info;
 
 	for ( ; ; ) {
@@ -147,7 +150,7 @@ void balance_dirty_pages(struct address_
 			.bdi		= bdi,
 			.sync_mode	= WB_SYNC_NONE,
 			.older_than_this = NULL,
-			.nr_to_write	= sync_writeback_pages(),
+			.nr_to_write	= write_chunk,
 		};
 
 		get_dirty_limits(&ps, &background_thresh, &dirty_thresh);
@@ -159,10 +162,15 @@ void balance_dirty_pages(struct address_
 
 		if (nr_reclaimable) {
 			writeback_inodes(&wbc);
+
 			get_dirty_limits(&ps,&background_thresh,&dirty_thresh);
 			nr_reclaimable = ps.nr_dirty + ps.nr_unstable;
 			if (nr_reclaimable + ps.nr_writeback <= dirty_thresh)
 				break;
+
+			pages_written += write_chunk - wbc.nr_to_write;
+			if (pages_written >= write_chunk)
+				break;		/* We've done our duty */
 		}
 		blk_congestion_wait(WRITE, HZ/10);
 	}

_
