Btrfs: usage filter
authorIlya Dryomov <idryomov@gmail.com>
Mon, 16 Jan 2012 20:04:47 +0000 (22:04 +0200)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 16 Jan 2012 20:04:47 +0000 (22:04 +0200)
Select chunks that are less than X percent full.

Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
fs/btrfs/volumes.c
fs/btrfs/volumes.h

index 447bd422d86731ccf4c2ecbdfacd1c56fdcd449e..b858242374db204362070f0873cdf080dfa40497 100644 (file)
@@ -2120,6 +2120,36 @@ static int chunk_profiles_filter(u64 chunk_profile,
        return 1;
 }
 
+static u64 div_factor_fine(u64 num, int factor)
+{
+       if (factor <= 0)
+               return 0;
+       if (factor >= 100)
+               return num;
+
+       num *= factor;
+       do_div(num, 100);
+       return num;
+}
+
+static int chunk_usage_filter(struct btrfs_fs_info *fs_info, u64 chunk_offset,
+                             struct btrfs_balance_args *bargs)
+{
+       struct btrfs_block_group_cache *cache;
+       u64 chunk_used, user_thresh;
+       int ret = 1;
+
+       cache = btrfs_lookup_block_group(fs_info, chunk_offset);
+       chunk_used = btrfs_block_group_used(&cache->item);
+
+       user_thresh = div_factor_fine(cache->key.offset, bargs->usage);
+       if (chunk_used < user_thresh)
+               ret = 0;
+
+       btrfs_put_block_group(cache);
+       return ret;
+}
+
 static int should_balance_chunk(struct btrfs_root *root,
                                struct extent_buffer *leaf,
                                struct btrfs_chunk *chunk, u64 chunk_offset)
@@ -2147,6 +2177,12 @@ static int should_balance_chunk(struct btrfs_root *root,
                return 0;
        }
 
+       /* usage filter */
+       if ((bargs->flags & BTRFS_BALANCE_ARGS_USAGE) &&
+           chunk_usage_filter(bctl->fs_info, chunk_offset, bargs)) {
+               return 0;
+       }
+
        return 1;
 }
 
index fb20d77404404ede20d3b4df5aa1badb5435b9f1..eee77fcf812a423df8595c40ec85901366173cf0 100644 (file)
@@ -200,6 +200,7 @@ struct map_lookup {
  * Balance filters
  */
 #define BTRFS_BALANCE_ARGS_PROFILES    (1ULL << 0)
+#define BTRFS_BALANCE_ARGS_USAGE       (1ULL << 1)
 
 struct btrfs_balance_args;
 struct btrfs_balance_control {