The patch titled writeback: introduce writeback_control.inodes_cleaned has been added to the -mm tree. Its filename is writeback-introduce-writeback_controlinodes_cleaned.patch Before you just go and hit "reply", please: a) Consider who else should be cc'ed b) Prefer to cc a suitable mailing list as well c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's *** Remember to use Documentation/SubmitChecklist when testing your code *** See http://userweb.kernel.org/~akpm/stuff/added-to-mm.txt to find out what to do about this The current -mm tree may be found at http://userweb.kernel.org/~akpm/mmotm/ ------------------------------------------------------ Subject: writeback: introduce writeback_control.inodes_cleaned From: Wu Fengguang <fengguang.wu@xxxxxxxxx> 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_cleaned to count the number of inodes which get cleaned. A non-zero value means there was some progress on writeback, in which case more writeback can be tried. about v1: The initial version was to count successful ->write_inode() calls. However it leads to busy loops for sync() over NFS, because NFS ridiculously returns 0 (success) while at the same time redirties the inode. The NFS case can be trivially fixed, however there may be more hidden bugs in other filesystems.. Signed-off-by: Wu Fengguang <fengguang.wu@xxxxxxxxx> Acked-by: Jan Kara <jack@xxxxxxx> Acked-by: Mel Gorman <mel@xxxxxxxxx> Cc: Itaru Kitayama <kitayama@xxxxxxxxxxxxx> Cc: Dave Chinner <david@xxxxxxxxxxxxx> Cc: Rik van Riel <riel@xxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- fs/fs-writeback.c | 4 ++++ include/linux/writeback.h | 1 + 2 files changed, 5 insertions(+) diff -puN fs/fs-writeback.c~writeback-introduce-writeback_controlinodes_cleaned fs/fs-writeback.c --- a/fs/fs-writeback.c~writeback-introduce-writeback_controlinodes_cleaned +++ a/fs/fs-writeback.c @@ -454,6 +454,7 @@ writeback_single_inode(struct inode *ino * No need to add it back to the LRU. */ list_del_init(&inode->i_wb_list); + wbc->inodes_cleaned++; } } inode_sync_complete(inode); @@ -716,6 +717,7 @@ static long wb_writeback(struct bdi_writ wbc.more_io = 0; wbc.nr_to_write = write_chunk; wbc.pages_skipped = 0; + wbc.inodes_cleaned = 0; trace_wbc_writeback_start(&wbc, wb->bdi); if (work->sb) @@ -732,6 +734,8 @@ static long wb_writeback(struct bdi_writ */ if (wbc.nr_to_write <= 0) continue; + if (wbc.inodes_cleaned) + continue; /* * Didn't write everything and we don't have more IO, bail */ diff -puN include/linux/writeback.h~writeback-introduce-writeback_controlinodes_cleaned include/linux/writeback.h --- a/include/linux/writeback.h~writeback-introduce-writeback_controlinodes_cleaned +++ a/include/linux/writeback.h @@ -34,6 +34,7 @@ struct writeback_control { long nr_to_write; /* Write this many pages, and decrement this for each page written */ long pages_skipped; /* Pages which were not written */ + long inodes_cleaned; /* # of inodes cleaned */ /* * For a_ops->writepages(): is start or end are non-zero then this is _ Patches currently in -mm which might be from fengguang.wu@xxxxxxxxx are mm-per-node-vmstat-show-proper-vmstats.patch mm-per-node-vmstat-show-proper-vmstats-fix.patch writeback-pass-writeback_control-down-to-move_expired_inodes.patch writeback-introduce-writeback_controlinodes_cleaned.patch writeback-try-more-writeback-as-long-as-something-was-written.patch writeback-the-kupdate-expire-timestamp-should-be-a-moving-target.patch writeback-sync-expired-inodes-first-in-background-writeback.patch writeback-sync-expired-inodes-first-in-background-writeback-fix.patch writeback-refill-b_io-iff-empty.patch -- To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html