From 6f2800f48c69be8a657e0ecd1df2d25816c12522 Mon Sep 17 00:00:00 2001 From: Ilya Dryomov Date: Mon, 16 Jan 2012 22:04:48 +0200 Subject: [PATCH] --- yaml --- r: 285967 b: refs/heads/master c: cfa4c961cc69ffb7bda450972320a25cbd413e19 h: refs/heads/master i: 285965: b093bae696f6ee2a6cc0484b58aec525d02412b7 285963: bd3edcf7c97307f395cfaa84611c4f03933a3c75 285959: 5e983997ac45a0ca8c1267cbeeb57a59ba2dce00 285951: 010a20829a6859ecc11c33b688d0d0a9ecadf557 v: v3 --- [refs] | 2 +- trunk/fs/btrfs/volumes.c | 23 +++++++++++++++++++++++ trunk/fs/btrfs/volumes.h | 6 ++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index f417bdca2d34..38e65ca353c7 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: e4d8ec0f65b91bfb4984a4927632ded95f9825ad +refs/heads/master: cfa4c961cc69ffb7bda450972320a25cbd413e19 diff --git a/trunk/fs/btrfs/volumes.c b/trunk/fs/btrfs/volumes.c index f08210e83339..98b4067017ff 100644 --- a/trunk/fs/btrfs/volumes.c +++ b/trunk/fs/btrfs/volumes.c @@ -2221,6 +2221,23 @@ static int chunk_vrange_filter(struct extent_buffer *leaf, return 1; } +static int chunk_soft_convert_filter(u64 chunk_profile, + struct btrfs_balance_args *bargs) +{ + if (!(bargs->flags & BTRFS_BALANCE_ARGS_CONVERT)) + return 0; + + chunk_profile &= BTRFS_BLOCK_GROUP_PROFILE_MASK; + + if (chunk_profile == 0) + chunk_profile = BTRFS_AVAIL_ALLOC_BIT_SINGLE; + + if (bargs->target & chunk_profile) + return 1; + + return 0; +} + static int should_balance_chunk(struct btrfs_root *root, struct extent_buffer *leaf, struct btrfs_chunk *chunk, u64 chunk_offset) @@ -2272,6 +2289,12 @@ static int should_balance_chunk(struct btrfs_root *root, return 0; } + /* soft profile changing mode */ + if ((bargs->flags & BTRFS_BALANCE_ARGS_SOFT) && + chunk_soft_convert_filter(chunk_type, bargs)) { + return 0; + } + return 1; } diff --git a/trunk/fs/btrfs/volumes.h b/trunk/fs/btrfs/volumes.h index 79ee9c324562..6c143c98017a 100644 --- a/trunk/fs/btrfs/volumes.h +++ b/trunk/fs/btrfs/volumes.h @@ -208,7 +208,13 @@ struct map_lookup { #define BTRFS_BALANCE_ARGS_DRANGE (1ULL << 3) #define BTRFS_BALANCE_ARGS_VRANGE (1ULL << 4) +/* + * Profile changing flags. When SOFT is set we won't relocate chunk if + * it already has the target profile (even though it may be + * half-filled). + */ #define BTRFS_BALANCE_ARGS_CONVERT (1ULL << 8) +#define BTRFS_BALANCE_ARGS_SOFT (1ULL << 9) struct btrfs_balance_args; struct btrfs_balance_control {