aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIlya Dryomov <idryomov@gmail.com>2012-01-16 15:04:48 -0500
committerIlya Dryomov <idryomov@gmail.com>2012-01-16 15:04:48 -0500
commitcfa4c961cc69ffb7bda450972320a25cbd413e19 (patch)
tree68ed15b8303d8aa7385df5383aebbef47debea4f
parente4d8ec0f65b91bfb4984a4927632ded95f9825ad (diff)
Btrfs: soft profile changing mode (aka soft convert)
When doing convert from one profile to another if soft mode is on restriper won't touch chunks that already have the profile we are converting to. This is useful if e.g. half of the FS was converted earlier. The soft mode switch is (like every other filter) per-type. This means that we can convert for example meta chunks the "hard" way while converting data chunks selectively with soft switch. Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
-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 {