aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/btrfs/volumes.c23
-rw-r--r--fs/btrfs/volumes.h6
2 files changed, 29 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
diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h
index 79ee9c324562..6c143c98017a 100644
--- a/fs/btrfs/volumes.h
+++ b/fs/btrfs/volumes.h
@@ -208,7 +208,13 @@ struct map_lookup {
208#define BTRFS_BALANCE_ARGS_DRANGE (1ULL << 3) 208#define BTRFS_BALANCE_ARGS_DRANGE (1ULL << 3)
209#define BTRFS_BALANCE_ARGS_VRANGE (1ULL << 4) 209#define BTRFS_BALANCE_ARGS_VRANGE (1ULL << 4)
210 210
211/*
212 * Profile changing flags. When SOFT is set we won't relocate chunk if
213 * it already has the target profile (even though it may be
214 * half-filled).
215 */
211#define BTRFS_BALANCE_ARGS_CONVERT (1ULL << 8) 216#define BTRFS_BALANCE_ARGS_CONVERT (1ULL << 8)
217#define BTRFS_BALANCE_ARGS_SOFT (1ULL << 9)
212 218
213struct btrfs_balance_args; 219struct btrfs_balance_args;
214struct btrfs_balance_control { 220struct btrfs_balance_control {