Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3b7885bf authored by Chris Mason's avatar Chris Mason
Browse files

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: default avatarChris Mason <chris.mason@oracle.com>
parent 771ed689
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -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)) {
+0 −7
Original line number Diff line number Diff line
@@ -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);