Loading fs/btrfs/volumes.c +36 −0 Original line number Original line Diff line number Diff line Loading @@ -2120,6 +2120,36 @@ static int chunk_profiles_filter(u64 chunk_profile, return 1; 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, static int should_balance_chunk(struct btrfs_root *root, struct extent_buffer *leaf, struct extent_buffer *leaf, struct btrfs_chunk *chunk, u64 chunk_offset) struct btrfs_chunk *chunk, u64 chunk_offset) Loading Loading @@ -2147,6 +2177,12 @@ static int should_balance_chunk(struct btrfs_root *root, return 0; return 0; } } /* usage filter */ if ((bargs->flags & BTRFS_BALANCE_ARGS_USAGE) && chunk_usage_filter(bctl->fs_info, chunk_offset, bargs)) { return 0; } return 1; return 1; } } Loading fs/btrfs/volumes.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -200,6 +200,7 @@ struct map_lookup { * Balance filters * Balance filters */ */ #define BTRFS_BALANCE_ARGS_PROFILES (1ULL << 0) #define BTRFS_BALANCE_ARGS_PROFILES (1ULL << 0) #define BTRFS_BALANCE_ARGS_USAGE (1ULL << 1) struct btrfs_balance_args; struct btrfs_balance_args; struct btrfs_balance_control { struct btrfs_balance_control { Loading Loading
fs/btrfs/volumes.c +36 −0 Original line number Original line Diff line number Diff line Loading @@ -2120,6 +2120,36 @@ static int chunk_profiles_filter(u64 chunk_profile, return 1; 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, static int should_balance_chunk(struct btrfs_root *root, struct extent_buffer *leaf, struct extent_buffer *leaf, struct btrfs_chunk *chunk, u64 chunk_offset) struct btrfs_chunk *chunk, u64 chunk_offset) Loading Loading @@ -2147,6 +2177,12 @@ static int should_balance_chunk(struct btrfs_root *root, return 0; return 0; } } /* usage filter */ if ((bargs->flags & BTRFS_BALANCE_ARGS_USAGE) && chunk_usage_filter(bctl->fs_info, chunk_offset, bargs)) { return 0; } return 1; return 1; } } Loading
fs/btrfs/volumes.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -200,6 +200,7 @@ struct map_lookup { * Balance filters * Balance filters */ */ #define BTRFS_BALANCE_ARGS_PROFILES (1ULL << 0) #define BTRFS_BALANCE_ARGS_PROFILES (1ULL << 0) #define BTRFS_BALANCE_ARGS_USAGE (1ULL << 1) struct btrfs_balance_args; struct btrfs_balance_args; struct btrfs_balance_control { struct btrfs_balance_control { Loading