A background flush work may run for ever. So it's reasonable for it to mimic the kupdate behavior of syncing old/expired inodes first. CC: Jan Kara <jack@xxxxxxx> Signed-off-by: Wu Fengguang <fengguang.wu@xxxxxxxxx> --- fs/fs-writeback.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) --- linux.orig/fs/fs-writeback.c 2009-10-06 23:39:28.000000000 +0800 +++ linux/fs/fs-writeback.c 2009-10-06 23:39:31.000000000 +0800 @@ -680,7 +680,7 @@ static long writeback_inodes_wb(struct b spin_lock(&inode_lock); - if (!wbc->for_kupdate || list_empty(&wb->b_io)) + if (list_empty(&wb->b_io)) queue_io(wb, wbc->older_than_this); while (!list_empty(&wb->b_io)) { @@ -793,14 +793,15 @@ static long wb_writeback(struct bdi_writ .range_cyclic = args->range_cyclic, }; unsigned long oldest_jif; + int expire_interval = msecs_to_jiffies(dirty_expire_interval * 10); + int fg_rounds = 0; long wrote = 0; long nr; struct inode *inode; - if (wbc.for_kupdate) { + if (wbc.for_kupdate || wbc.for_background) { wbc.older_than_this = &oldest_jif; - oldest_jif = jiffies - - msecs_to_jiffies(dirty_expire_interval * 10); + oldest_jif = jiffies - expire_interval; } if (!wbc.range_cyclic) { wbc.range_start = 0; @@ -828,6 +829,18 @@ static long wb_writeback(struct bdi_writ args->nr_pages -= nr; wrote += nr; + if (args->for_background && expire_interval && + ++fg_rounds && list_empty(&wb->b_io)) { + if (fg_rounds < 10) + expire_interval >>= 1; + if (expire_interval) + oldest_jif = jiffies - expire_interval; + else + wbc.older_than_this = 0; + fg_rounds = 0; + continue; + } + /* * Bail if no more IO */ -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html