diff options
Diffstat (limited to 'fs/btrfs/volumes.c')
-rw-r--r-- | fs/btrfs/volumes.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index f08210e83339..98b4067017ff 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c | |||
@@ -2221,6 +2221,23 @@ static int chunk_vrange_filter(struct extent_buffer *leaf, | |||
2221 | return 1; | 2221 | return 1; |
2222 | } | 2222 | } |
2223 | 2223 | ||
2224 | static int chunk_soft_convert_filter(u64 chunk_profile, | ||
2225 | struct btrfs_balance_args *bargs) | ||
2226 | { | ||
2227 | if (!(bargs->flags & BTRFS_BALANCE_ARGS_CONVERT)) | ||
2228 | return 0; | ||
2229 | |||
2230 | chunk_profile &= BTRFS_BLOCK_GROUP_PROFILE_MASK; | ||
2231 | |||
2232 | if (chunk_profile == 0) | ||
2233 | chunk_profile = BTRFS_AVAIL_ALLOC_BIT_SINGLE; | ||
2234 | |||
2235 | if (bargs->target & chunk_profile) | ||
2236 | return 1; | ||
2237 | |||
2238 | return 0; | ||
2239 | } | ||
2240 | |||
2224 | static int should_balance_chunk(struct btrfs_root *root, | 2241 | static int should_balance_chunk(struct btrfs_root *root, |
2225 | struct extent_buffer *leaf, | 2242 | struct extent_buffer *leaf, |
2226 | struct btrfs_chunk *chunk, u64 chunk_offset) | 2243 | struct btrfs_chunk *chunk, u64 chunk_offset) |
@@ -2272,6 +2289,12 @@ static int should_balance_chunk(struct btrfs_root *root, | |||
2272 | return 0; | 2289 | return 0; |
2273 | } | 2290 | } |
2274 | 2291 | ||
2292 | /* soft profile changing mode */ | ||
2293 | if ((bargs->flags & BTRFS_BALANCE_ARGS_SOFT) && | ||
2294 | chunk_soft_convert_filter(chunk_type, bargs)) { | ||
2295 | return 0; | ||
2296 | } | ||
2297 | |||
2275 | return 1; | 2298 | return 1; |
2276 | } | 2299 | } |
2277 | 2300 | ||