Skip to content

Commit

Permalink
Btrfs: enforce metadata allocation clustering
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Chris Mason committed Nov 7, 2008
1 parent 771ed68 commit 3b7885b
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 7 deletions.
17 changes: 17 additions & 0 deletions fs/btrfs/extent-tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)) {
Expand Down
7 changes: 0 additions & 7 deletions fs/btrfs/extent_io.c
Original file line number Diff line number Diff line change
Expand Up @@ -2494,13 +2494,6 @@ int extent_write_cache_pages(struct extent_io_tree *tree,
index = 0;
goto retry;
}
if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0))
mapping->writeback_index = index;
if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX)
range_whole = 1;

if (wbc->range_cont)
wbc->range_start = index << PAGE_CACHE_SHIFT;
return ret;
}
EXPORT_SYMBOL(extent_write_cache_pages);
Expand Down

0 comments on commit 3b7885b

Please sign in to comment.