summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2009-09-22 20:48:44 +0200
committerChris Mason <chris.mason@oracle.com>2009-09-22 20:48:44 +0200
commit7ce618db9878689f87897b673fa3329070860fc7 (patch)
treea149e88a2f28c2fd5ad515f7351af9832540fedb
parentBtrfs: deal with NULL space info (diff)
downloadlinux-7ce618db9878689f87897b673fa3329070860fc7.tar.xz
linux-7ce618db9878689f87897b673fa3329070860fc7.zip
Btrfs: fix early enospc during balancing
We now do extra checks before a balance to make sure there is room for the balance to take place. One of the checks was testing to see if we were trying to balance away the last block group of a given type. If there is no space available for new chunks, we should not try and balance away the last block group of a give type. But, the code wasn't checking for available chunk space, and so it was exiting too soon. The fix here is to combine some of the checks and make sure we try to allocate new chunks when we're balancing the last block group. Signed-off-by: Chris Mason <chris.mason@oracle.com>
-rw-r--r--fs/btrfs/extent-tree.c20
1 files changed, 7 insertions, 13 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index 1b9b87870f51..90d314eeff6d 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -6756,22 +6756,16 @@ int btrfs_can_relocate(struct btrfs_root *root, u64 bytenr)
/*
* if this is the last block group we have in this space, we can't
- * relocate it.
+ * relocate it unless we're able to allocate a new chunk below.
+ *
+ * Otherwise, we need to make sure we have room in the space to handle
+ * all of the extents from this block group. If we can, we're good
*/
- if (space_info->total_bytes == block_group->key.offset) {
- ret = -1;
- spin_unlock(&space_info->lock);
- goto out;
- }
-
- /*
- * need to make sure we have room in the space to handle all of the
- * extents from this block group. If we can, we're good
- */
- if (space_info->bytes_used + space_info->bytes_reserved +
+ if ((space_info->total_bytes != block_group->key.offset) &&
+ (space_info->bytes_used + space_info->bytes_reserved +
space_info->bytes_pinned + space_info->bytes_readonly +
btrfs_block_group_used(&block_group->item) <
- space_info->total_bytes) {
+ space_info->total_bytes)) {
spin_unlock(&space_info->lock);
goto out;
}