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); } _