Convert wbc.range_cyclic to new behavior: when past EOF, abort writeback of the inode, which instructs writeback_single_inode() to delay it for a while if necessary. It removes one inefficient .range_cyclic IO pattern when writeback_index wraps: submit [10000-10100], (wrap), submit [0-100] In which the submitted pages may be consisted of two distant ranges. It also prevents submitting pointless IO for busy overwriters. CC: Evgeniy Polyakov <zbr@xxxxxxxxxxx> Signed-off-by: Wu Fengguang <fengguang.wu@xxxxxxxxx> --- drivers/staging/pohmelfs/inode.c | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) --- linux.orig/drivers/staging/pohmelfs/inode.c 2009-10-06 23:37:49.000000000 +0800 +++ linux/drivers/staging/pohmelfs/inode.c 2009-10-06 23:38:31.000000000 +0800 @@ -149,7 +149,6 @@ static int pohmelfs_writepages(struct ad int nr_pages; pgoff_t index; pgoff_t end; /* Inclusive */ - int scanned = 0; int range_whole = 0; if (wbc->range_cyclic) { @@ -160,17 +159,18 @@ static int pohmelfs_writepages(struct ad end = wbc->range_end >> PAGE_CACHE_SHIFT; if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX) range_whole = 1; - scanned = 1; } -retry: + while (!done && (index <= end)) { unsigned int i = min(end - index, (pgoff_t)psb->trans_max_pages); int path_len; struct netfs_trans *trans; err = pohmelfs_inode_has_dirty_pages(mapping, index); - if (!err) + if (!err) { + index = 0; break; + } err = pohmelfs_path_length(pi); if (err < 0) @@ -197,15 +197,16 @@ retry: dprintk("%s: t: %p, nr_pages: %u, end: %lu, index: %lu, max: %u.\n", __func__, trans, nr_pages, end, index, trans->page_num); - if (!nr_pages) + if (!nr_pages) { + index = 0; goto err_out_reset; + } err = pohmelfs_write_inode_create(inode, trans); if (err) goto err_out_reset; err = 0; - scanned = 1; for (i = 0; i < trans->page_num; i++) { struct page *page = trans->pages[i]; @@ -215,7 +216,7 @@ retry: if (unlikely(page->mapping != mapping)) goto out_continue; - if (!wbc->range_cyclic && page->index > end) { + if (page->index > end) { done = 1; goto out_continue; } @@ -263,16 +264,6 @@ err_out_reset: break; } - if (!scanned && !done) { - /* - * We hit the last page and there is more work to be done: wrap - * back to the start of the file - */ - scanned = 1; - index = 0; - goto retry; - } - if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0)) mapping->writeback_index = index; -- 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