From 7b2d688faee4565692c28cb6e5a476665a231aa4 Mon Sep 17 00:00:00 2001 From: Chris Mason Date: Mon, 26 Nov 2007 16:34:41 -0800 Subject: [PATCH] --- yaml --- r: 128551 b: refs/heads/master c: 793955bca66c99defdffc857ae6eb7e8431d6bbe h: refs/heads/master i: 128549: 67b8ff0d4b143768179ede3cb6575a74faf010e2 128547: 73bd26a1c414552cc890ba8a6bd9d846655df74d 128543: 8673ca68daf64fab2af5477a5d7a3225edfeeeaf v: v3 --- [refs] | 2 +- trunk/fs/btrfs/disk-io.c | 9 +++++++++ trunk/fs/btrfs/extent_map.c | 39 +++++++++++++++++++++++++++++++++++++ trunk/fs/btrfs/extent_map.h | 3 +++ 4 files changed, 52 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index dcf55a57eb69..7fb5e93252bd 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 015a739c7c238768fbfa4eea8ea2ebc1a35e7bb1 +refs/heads/master: 793955bca66c99defdffc857ae6eb7e8431d6bbe diff --git a/trunk/fs/btrfs/disk-io.c b/trunk/fs/btrfs/disk-io.c index 3e16cca72b49..28e9ef8a3253 100644 --- a/trunk/fs/btrfs/disk-io.c +++ b/trunk/fs/btrfs/disk-io.c @@ -210,6 +210,15 @@ static int btree_writepages(struct address_space *mapping, { struct extent_map_tree *tree; tree = &BTRFS_I(mapping->host)->extent_tree; + if (wbc->sync_mode == WB_SYNC_NONE) { + u64 num_dirty; + u64 start = 0; + unsigned long thresh = 96 * 1024 * 1024; + num_dirty = count_range_bits(tree, &start, thresh, EXTENT_DIRTY); + if (num_dirty < thresh) { + return 0; + } + } return extent_writepages(tree, mapping, btree_get_extent, wbc); } diff --git a/trunk/fs/btrfs/extent_map.c b/trunk/fs/btrfs/extent_map.c index 55f272c335c6..b6a4974ecc23 100644 --- a/trunk/fs/btrfs/extent_map.c +++ b/trunk/fs/btrfs/extent_map.c @@ -1106,6 +1106,45 @@ u64 find_lock_delalloc_range(struct extent_map_tree *tree, return found; } +u64 count_range_bits(struct extent_map_tree *tree, + u64 *start, u64 max_bytes, unsigned long bits) +{ + struct rb_node *node; + struct extent_state *state; + u64 cur_start = *start; + u64 total_bytes = 0; + int found = 0; + + write_lock_irq(&tree->lock); + /* + * this search will find all the extents that end after + * our range starts. + */ + node = tree_search(&tree->state, cur_start); + if (!node || IS_ERR(node)) { + goto out; + } + + while(1) { + state = rb_entry(node, struct extent_state, rb_node); + if ((state->state & bits)) { + total_bytes += state->end - state->start + 1; + if (total_bytes >= max_bytes) + break; + if (!found) { + *start = state->start; + found = 1; + } + } + node = rb_next(node); + if (!node) + break; + } +out: + write_unlock_irq(&tree->lock); + return total_bytes; +} + /* * helper function to lock both pages and extents in the tree. * pages must be locked first. diff --git a/trunk/fs/btrfs/extent_map.h b/trunk/fs/btrfs/extent_map.h index 24ddc8c93461..13c562f7cb6f 100644 --- a/trunk/fs/btrfs/extent_map.h +++ b/trunk/fs/btrfs/extent_map.h @@ -113,6 +113,9 @@ int extent_read_full_page(struct extent_map_tree *tree, struct page *page, int __init extent_map_init(void); void __exit extent_map_exit(void); +u64 count_range_bits(struct extent_map_tree *tree, + u64 *start, u64 max_bytes, unsigned long bits); + int test_range_bit(struct extent_map_tree *tree, u64 start, u64 end, int bits, int filled); int clear_extent_bits(struct extent_map_tree *tree, u64 start, u64 end,