Btrfs: enforce metadata allocation clustering
authorChris Mason <chris.mason@oracle.com>
Fri, 7 Nov 2008 02:48:27 +0000 (21:48 -0500)
committerChris Mason <chris.mason@oracle.com>
Fri, 7 Nov 2008 02:48:27 +0000 (21:48 -0500)
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>
fs/btrfs/extent-tree.c
fs/btrfs/extent_io.c

index ebd8275..b8c6541 100644 (file)
@@ -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)) {
Simple merge