|
@@ -2451,7 +2451,6 @@ setup_cluster_bitmap(struct btrfs_block_group_cache *block_group,
|
|
|
{
|
|
|
struct btrfs_free_space_ctl *ctl = block_group->free_space_ctl;
|
|
|
struct btrfs_free_space *entry;
|
|
|
- struct rb_node *node;
|
|
|
int ret = -ENOSPC;
|
|
|
u64 bitmap_offset = offset_to_bitmap(ctl, offset);
|
|
|
|
|
@@ -2469,10 +2468,6 @@ setup_cluster_bitmap(struct btrfs_block_group_cache *block_group,
|
|
|
list_add(&entry->list, bitmaps);
|
|
|
}
|
|
|
|
|
|
- /*
|
|
|
- * First check our cached list of bitmaps and see if there is an entry
|
|
|
- * here that will work.
|
|
|
- */
|
|
|
list_for_each_entry(entry, bitmaps, list) {
|
|
|
if (entry->bytes < min_bytes)
|
|
|
continue;
|
|
@@ -2483,38 +2478,10 @@ setup_cluster_bitmap(struct btrfs_block_group_cache *block_group,
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * If we do have entries on our list and we are here then we didn't find
|
|
|
- * anything, so go ahead and get the next entry after the last entry in
|
|
|
- * this list and start the search from there.
|
|
|
+ * The bitmaps list has all the bitmaps that record free space
|
|
|
+ * starting after offset, so no more search is required.
|
|
|
*/
|
|
|
- if (!list_empty(bitmaps)) {
|
|
|
- entry = list_entry(bitmaps->prev, struct btrfs_free_space,
|
|
|
- list);
|
|
|
- node = rb_next(&entry->offset_index);
|
|
|
- if (!node)
|
|
|
- return -ENOSPC;
|
|
|
- entry = rb_entry(node, struct btrfs_free_space, offset_index);
|
|
|
- goto search;
|
|
|
- }
|
|
|
-
|
|
|
- entry = tree_search_offset(ctl, offset_to_bitmap(ctl, offset), 0, 1);
|
|
|
- if (!entry)
|
|
|
- return -ENOSPC;
|
|
|
-
|
|
|
-search:
|
|
|
- node = &entry->offset_index;
|
|
|
- do {
|
|
|
- entry = rb_entry(node, struct btrfs_free_space, offset_index);
|
|
|
- node = rb_next(&entry->offset_index);
|
|
|
- if (!entry->bitmap)
|
|
|
- continue;
|
|
|
- if (entry->bytes < min_bytes)
|
|
|
- continue;
|
|
|
- ret = btrfs_bitmap_cluster(block_group, entry, cluster, offset,
|
|
|
- bytes, min_bytes);
|
|
|
- } while (ret && node);
|
|
|
-
|
|
|
- return ret;
|
|
|
+ return -ENOSPC;
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -2532,8 +2499,8 @@ int btrfs_find_space_cluster(struct btrfs_trans_handle *trans,
|
|
|
u64 offset, u64 bytes, u64 empty_size)
|
|
|
{
|
|
|
struct btrfs_free_space_ctl *ctl = block_group->free_space_ctl;
|
|
|
- struct list_head bitmaps;
|
|
|
struct btrfs_free_space *entry, *tmp;
|
|
|
+ LIST_HEAD(bitmaps);
|
|
|
u64 min_bytes;
|
|
|
int ret;
|
|
|
|
|
@@ -2572,7 +2539,6 @@ int btrfs_find_space_cluster(struct btrfs_trans_handle *trans,
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- INIT_LIST_HEAD(&bitmaps);
|
|
|
ret = setup_cluster_no_bitmap(block_group, cluster, &bitmaps, offset,
|
|
|
bytes, min_bytes);
|
|
|
if (ret)
|