aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/ctree.h
diff options
context:
space:
mode:
authorJosef Bacik <josef@redhat.com>2009-09-11 16:11:19 -0400
committerChris Mason <chris.mason@oracle.com>2009-09-21 19:23:48 -0400
commitba1bf4818baf68d914ef9e3b06fbea6acb674fe4 (patch)
tree1068d6ce508333a75668181bfe0e42956d4d8780 /fs/btrfs/ctree.h
parent1fb58a6051cd904a9f8e0344b22e31921d6b5a4d (diff)
Btrfs: make balance code choose more wisely when relocating
Currently, we can panic the box if the first block group we go to move is of a type where there is no space left to move those extents. For example, if we fill the disk up with data, and then we try to balance and we have no room to move the data nor room to allocate new chunks, we will panic. Change this by checking to see if we have room to move this chunk around, and if not, return -ENOSPC and move on to the next chunk. This will make sure we remove block groups that are moveable, like if we have alot of empty metadata block groups, and then that way we make room to be able to balance our data chunks as well. Tested this with an fs that would panic on btrfs-vol -b normally, but no longer panics with this patch. V1->V2: -actually search for a free extent on the device to make sure we can allocate a chunk if need be. -fix btrfs_shrink_device to make sure we actually try to relocate all the chunks, and then if we can't return -ENOSPC so if we are doing a btrfs-vol -r we don't remove the device with data still on it. -check to make sure the block group we are going to relocate isn't the last one in that particular space -fix a bug in btrfs_shrink_device where we would change the device's size and not fix it if we fail to do our relocate Signed-off-by: Josef Bacik <jbacik@redhat.com> Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/ctree.h')
-rw-r--r--fs/btrfs/ctree.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
index bc57e236ac64..2b15fb97d23f 100644
--- a/fs/btrfs/ctree.h
+++ b/fs/btrfs/ctree.h
@@ -2006,6 +2006,7 @@ int btrfs_write_dirty_block_groups(struct btrfs_trans_handle *trans,
2006int btrfs_extent_readonly(struct btrfs_root *root, u64 bytenr); 2006int btrfs_extent_readonly(struct btrfs_root *root, u64 bytenr);
2007int btrfs_free_block_groups(struct btrfs_fs_info *info); 2007int btrfs_free_block_groups(struct btrfs_fs_info *info);
2008int btrfs_read_block_groups(struct btrfs_root *root); 2008int btrfs_read_block_groups(struct btrfs_root *root);
2009int btrfs_can_relocate(struct btrfs_root *root, u64 bytenr);
2009int btrfs_make_block_group(struct btrfs_trans_handle *trans, 2010int btrfs_make_block_group(struct btrfs_trans_handle *trans,
2010 struct btrfs_root *root, u64 bytes_used, 2011 struct btrfs_root *root, u64 bytes_used,
2011 u64 type, u64 chunk_objectid, u64 chunk_offset, 2012 u64 type, u64 chunk_objectid, u64 chunk_offset,