diff options
author | Chris Mason <chris.mason@oracle.com> | 2008-11-07 03:48:27 +0100 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2008-11-07 03:48:27 +0100 |
commit | 3b7885bf96e03271a9fff41124c38ed7176616e2 (patch) | |
tree | 6dcadb0d9548f990fd2b67367cbf8bfde40992d5 /fs/btrfs/extent-tree.c | |
parent | Btrfs: Optimize compressed writeback and reads (diff) | |
download | linux-3b7885bf96e03271a9fff41124c38ed7176616e2.tar.xz linux-3b7885bf96e03271a9fff41124c38ed7176616e2.zip |
Btrfs: enforce metadata allocation clustering
The allocator uses the last allocation as a starting point for metadata
allocations, and tries to allocate in clusters of at least 256k.
If the search for a free block fails to find the expected block, this patch
forces a new cluster to be found in the free list.
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/extent-tree.c')
-rw-r--r-- | fs/btrfs/extent-tree.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index ebd8275a1934..b8c6541c33fe 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -2195,6 +2195,23 @@ static int noinline find_free_extent(struct btrfs_trans_handle *trans, if (search_start + num_bytes > end) goto new_group; + if (last_ptr && *last_ptr && search_start != *last_ptr) { + total_needed += empty_cluster; + *last_ptr = 0; + /* + * if search_start is still in this block group + * then we just re-search this block group + */ + if (search_start >= start && + search_start < end) { + mutex_unlock(&block_group->alloc_mutex); + continue; + } + + /* else we go to the next block group */ + goto new_group; + } + if (exclude_nr > 0 && (search_start + num_bytes > exclude_start && search_start < exclude_start + exclude_nr)) { |