Commit cca1c81f authored by Josef Bacik's avatar Josef Bacik

Btrfs: don't try to allocate from a block group that doesn't have enough space

If we have a very large filesystem, we can spend a lot of time in
find_free_extent just trying to allocate from empty block groups.  So instead
check to see if the block group even has enough space for the allocation, and if
not go on to the next block group.
Signed-off-by: default avatarJosef Bacik <josef@redhat.com>
parent 026fd317
...@@ -5159,6 +5159,14 @@ static noinline int find_free_extent(struct btrfs_trans_handle *trans, ...@@ -5159,6 +5159,14 @@ static noinline int find_free_extent(struct btrfs_trans_handle *trans,
if (unlikely(block_group->ro)) if (unlikely(block_group->ro))
goto loop; goto loop;
spin_lock(&block_group->tree_lock);
if (cached &&
block_group->free_space < num_bytes + empty_size) {
spin_unlock(&block_group->tree_lock);
goto loop;
}
spin_unlock(&block_group->tree_lock);
/* /*
* Ok we want to try and use the cluster allocator, so lets look * Ok we want to try and use the cluster allocator, so lets look
* there, unless we are on LOOP_NO_EMPTY_SIZE, since we will * there, unless we are on LOOP_NO_EMPTY_SIZE, since we will
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment