aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/volumes.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/volumes.c')
-rw-r--r--fs/btrfs/volumes.c23
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
2224static 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
2224static int should_balance_chunk(struct btrfs_root *root, 2241static 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