summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorJosef Bacik <josef@redhat.com>2011-05-13 11:07:12 -0400
committerJosef Bacik <josef@redhat.com>2011-05-23 13:03:15 -0400
commitcca1c81f43e26ab60c0d1090fb90992358d69bdf (patch)
tree8c445c012b9b0184eed9b7f52b35c0d0b85b0e0b /fs
parent026fd317828500524cdc7e5ff9e8e7923abb2868 (diff)
downloadop-kernel-dev-cca1c81f43e26ab60c0d1090fb90992358d69bdf.zip
op-kernel-dev-cca1c81f43e26ab60c0d1090fb90992358d69bdf.tar.gz
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: Josef Bacik <josef@redhat.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/btrfs/extent-tree.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index 1ba2cc5..c8c3184 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -5159,6 +5159,14 @@ have_block_group:
if (unlikely(block_group->ro))
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
* there, unless we are on LOOP_NO_EMPTY_SIZE, since we will
OpenPOWER on IntegriCloud