diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/btrfs/volumes.c | 23 | ||||
-rw-r--r-- | fs/btrfs/volumes.h | 6 |
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 | ||
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 | ||
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 | ||
213 | struct btrfs_balance_args; | 219 | struct btrfs_balance_args; |
214 | struct btrfs_balance_control { | 220 | struct btrfs_balance_control { |