[PATCH 31/45] writeback: sync old inodes first in background writeback

From: Wu Fengguang
Date: Wed Oct 07 2009 - 04:05:58 EST


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-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/