diff options
author | Wu Fengguang <fengguang.wu@intel.com> | 2010-07-22 00:50:57 -0400 |
---|---|---|
committer | Wu Fengguang <fengguang.wu@intel.com> | 2011-06-07 20:25:20 -0400 |
commit | cb9bd1159c5fe8995e151fa7df10fa19f8c119cc (patch) | |
tree | 3f2dd37182180cf85cd9e23d989b7fd7eceb1d63 /fs | |
parent | 94c3dcbb0b0cdfd82cedd21705424d8044edc42c (diff) |
writeback: introduce writeback_control.inodes_written
The flusher works on dirty inodes in batches, and may quit prematurely
if the batch of inodes happen to be metadata-only dirtied: in this case
wbc->nr_to_write won't be decreased at all, which stands for "no pages
written" but also mis-interpreted as "no progress".
So introduce writeback_control.inodes_written to count the inodes get
cleaned from VFS POV. A non-zero value means there are some progress on
writeback, in which case more writeback can be tried.
Acked-by: Jan Kara <jack@suse.cz>
Acked-by: Mel Gorman <mel@csn.ul.ie>
Signed-off-by: Wu Fengguang <fengguang.wu@intel.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/fs-writeback.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index fe190a8b0bc8..e4504299f4a5 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c | |||
@@ -464,6 +464,7 @@ writeback_single_inode(struct inode *inode, struct writeback_control *wbc) | |||
464 | * No need to add it back to the LRU. | 464 | * No need to add it back to the LRU. |
465 | */ | 465 | */ |
466 | list_del_init(&inode->i_wb_list); | 466 | list_del_init(&inode->i_wb_list); |
467 | wbc->inodes_written++; | ||
467 | } | 468 | } |
468 | } | 469 | } |
469 | inode_sync_complete(inode); | 470 | inode_sync_complete(inode); |
@@ -725,6 +726,7 @@ static long wb_writeback(struct bdi_writeback *wb, | |||
725 | wbc.more_io = 0; | 726 | wbc.more_io = 0; |
726 | wbc.nr_to_write = write_chunk; | 727 | wbc.nr_to_write = write_chunk; |
727 | wbc.pages_skipped = 0; | 728 | wbc.pages_skipped = 0; |
729 | wbc.inodes_written = 0; | ||
728 | 730 | ||
729 | trace_wbc_writeback_start(&wbc, wb->bdi); | 731 | trace_wbc_writeback_start(&wbc, wb->bdi); |
730 | if (work->sb) | 732 | if (work->sb) |
@@ -741,6 +743,8 @@ static long wb_writeback(struct bdi_writeback *wb, | |||
741 | */ | 743 | */ |
742 | if (wbc.nr_to_write <= 0) | 744 | if (wbc.nr_to_write <= 0) |
743 | continue; | 745 | continue; |
746 | if (wbc.inodes_written) | ||
747 | continue; | ||
744 | /* | 748 | /* |
745 | * Didn't write everything and we don't have more IO, bail | 749 | * Didn't write everything and we don't have more IO, bail |
746 | */ | 750 | */ |