aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorJosef Bacik <josef@redhat.com>2011-07-15 17:26:38 -0400
committerChris Mason <chris.mason@oracle.com>2011-07-27 12:46:44 -0400
commitf7aaa06bff6f5fe049ce9723267e1639c2c3d8b5 (patch)
treed3b5e20709a91f4bc473a898e37531f322a1bc6c /fs
parent9e0baf60dea69f31ac3b1adeb35b03b02a53e8e1 (diff)
Btrfs: tag pages for writeback in sync
Everybody else does this, we need to do it too. If we're syncing, we need to tag the pages we're going to write for writeback so we don't end up writing the same stuff over and over again if somebody is constantly redirtying our file. This will keep us from having latencies with heavy sync workloads. Thanks, Signed-off-by: Josef Bacik <josef@redhat.com> Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/btrfs/extent_io.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index abb922daf1b6..89bbde46bd83 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -2421,6 +2421,7 @@ static int extent_write_cache_pages(struct extent_io_tree *tree,
2421 pgoff_t index; 2421 pgoff_t index;
2422 pgoff_t end; /* Inclusive */ 2422 pgoff_t end; /* Inclusive */
2423 int scanned = 0; 2423 int scanned = 0;
2424 int tag;
2424 2425
2425 pagevec_init(&pvec, 0); 2426 pagevec_init(&pvec, 0);
2426 if (wbc->range_cyclic) { 2427 if (wbc->range_cyclic) {
@@ -2431,11 +2432,16 @@ static int extent_write_cache_pages(struct extent_io_tree *tree,
2431 end = wbc->range_end >> PAGE_CACHE_SHIFT; 2432 end = wbc->range_end >> PAGE_CACHE_SHIFT;
2432 scanned = 1; 2433 scanned = 1;
2433 } 2434 }
2435 if (wbc->sync_mode == WB_SYNC_ALL)
2436 tag = PAGECACHE_TAG_TOWRITE;
2437 else
2438 tag = PAGECACHE_TAG_DIRTY;
2434retry: 2439retry:
2440 if (wbc->sync_mode == WB_SYNC_ALL)
2441 tag_pages_for_writeback(mapping, index, end);
2435 while (!done && !nr_to_write_done && (index <= end) && 2442 while (!done && !nr_to_write_done && (index <= end) &&
2436 (nr_pages = pagevec_lookup_tag(&pvec, mapping, &index, 2443 (nr_pages = pagevec_lookup_tag(&pvec, mapping, &index, tag,
2437 PAGECACHE_TAG_DIRTY, min(end - index, 2444 min(end - index, (pgoff_t)PAGEVEC_SIZE-1) + 1))) {
2438 (pgoff_t)PAGEVEC_SIZE-1) + 1))) {
2439 unsigned i; 2445 unsigned i;
2440 2446
2441 scanned = 1; 2447 scanned = 1;