Jelajahi Sumber

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>
Chris Mason 16 tahun lalu
induk
melakukan
3b7885bf96
2 mengubah file dengan 17 tambahan dan 7 penghapusan
  1. 17 0
      fs/btrfs/extent-tree.c
  2. 0 7
      fs/btrfs/extent_io.c

+ 17 - 0
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)) {

+ 0 - 7
fs/btrfs/extent_io.c

@@ -2494,13 +2494,6 @@ retry:
 		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);