diff options
author | Chris Mason <chris.mason@oracle.com> | 2011-02-16 13:57:04 -0500 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2011-02-16 15:28:47 -0500 |
commit | c87f08ca44e83b2c8d28f63f9c33f3a270a04bbe (patch) | |
tree | 05cebe37380861a89faaea50c1ccb360ffb0f975 /fs/btrfs/extent-tree.c | |
parent | 91435650c233b93e0da389db74f4b2c11c5ad2d4 (diff) |
Btrfs: allow balance to explicitly allocate chunks as it relocates
Btrfs device shrinking and balancing ends up reallocating all the blocks
in order to allow COW to move them to new destinations. It is somewhat
awkward in terms of ENOSPC because most of the enospc code is built
around the idea that some operation on a reference counted tree triggers
allocations in the non-reference counted trees.
This commit changes the balancing code to deal with enospc by trying to
allocate a new chunk. If that allocation succeeds, we go ahead and
retry whatever failed due to enospc.
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/extent-tree.c')
-rw-r--r-- | fs/btrfs/extent-tree.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index d375fc04a065..100e409e9053 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -8066,6 +8066,13 @@ out: | |||
8066 | return ret; | 8066 | return ret; |
8067 | } | 8067 | } |
8068 | 8068 | ||
8069 | int btrfs_force_chunk_alloc(struct btrfs_trans_handle *trans, | ||
8070 | struct btrfs_root *root, u64 type) | ||
8071 | { | ||
8072 | u64 alloc_flags = get_alloc_profile(root, type); | ||
8073 | return do_chunk_alloc(trans, root, 2 * 1024 * 1024, alloc_flags, 1); | ||
8074 | } | ||
8075 | |||
8069 | /* | 8076 | /* |
8070 | * helper to account the unused space of all the readonly block group in the | 8077 | * helper to account the unused space of all the readonly block group in the |
8071 | * list. takes mirrors into account. | 8078 | * list. takes mirrors into account. |