diff options
author | Ilya Dryomov <idryomov@gmail.com> | 2012-01-16 15:04:47 -0500 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2012-01-16 15:04:47 -0500 |
commit | ed25e9b26f898d8d63ae4a836489f1923534143b (patch) | |
tree | 89ee253d15ef46b430de0435c068b66267ce829b /fs/btrfs/volumes.c | |
parent | f43ffb60fd94e98be02780944e182ade6653b916 (diff) |
Btrfs: profiles filter
Select chunks based on a given profile mask.
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Diffstat (limited to 'fs/btrfs/volumes.c')
-rw-r--r-- | fs/btrfs/volumes.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 91bbf6e774c0..447bd422d867 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c | |||
@@ -2102,6 +2102,24 @@ static void unset_balance_control(struct btrfs_fs_info *fs_info) | |||
2102 | kfree(bctl); | 2102 | kfree(bctl); |
2103 | } | 2103 | } |
2104 | 2104 | ||
2105 | /* | ||
2106 | * Balance filters. Return 1 if chunk should be filtered out | ||
2107 | * (should not be balanced). | ||
2108 | */ | ||
2109 | static int chunk_profiles_filter(u64 chunk_profile, | ||
2110 | struct btrfs_balance_args *bargs) | ||
2111 | { | ||
2112 | chunk_profile &= BTRFS_BLOCK_GROUP_PROFILE_MASK; | ||
2113 | |||
2114 | if (chunk_profile == 0) | ||
2115 | chunk_profile = BTRFS_AVAIL_ALLOC_BIT_SINGLE; | ||
2116 | |||
2117 | if (bargs->profiles & chunk_profile) | ||
2118 | return 0; | ||
2119 | |||
2120 | return 1; | ||
2121 | } | ||
2122 | |||
2105 | static int should_balance_chunk(struct btrfs_root *root, | 2123 | static int should_balance_chunk(struct btrfs_root *root, |
2106 | struct extent_buffer *leaf, | 2124 | struct extent_buffer *leaf, |
2107 | struct btrfs_chunk *chunk, u64 chunk_offset) | 2125 | struct btrfs_chunk *chunk, u64 chunk_offset) |
@@ -2123,6 +2141,12 @@ static int should_balance_chunk(struct btrfs_root *root, | |||
2123 | else if (chunk_type & BTRFS_BLOCK_GROUP_METADATA) | 2141 | else if (chunk_type & BTRFS_BLOCK_GROUP_METADATA) |
2124 | bargs = &bctl->meta; | 2142 | bargs = &bctl->meta; |
2125 | 2143 | ||
2144 | /* profiles filter */ | ||
2145 | if ((bargs->flags & BTRFS_BALANCE_ARGS_PROFILES) && | ||
2146 | chunk_profiles_filter(chunk_type, bargs)) { | ||
2147 | return 0; | ||
2148 | } | ||
2149 | |||
2126 | return 1; | 2150 | return 1; |
2127 | } | 2151 | } |
2128 | 2152 | ||