diff options
author | Ilya Dryomov <idryomov@gmail.com> | 2012-01-16 15:04:48 -0500 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2012-01-16 15:04:48 -0500 |
commit | ea67176ae8c024f64d85ec33873e5eadf1af7247 (patch) | |
tree | d3674d6a4807074dbaadfdd260e2aaa3011eab5e | |
parent | 94e60d5a5c4b98a32b1077dec88df09ada712376 (diff) |
Btrfs: virtual address space subset filter
Select chunks which have at least one byte located inside a given
[vstart, vend) virtual address space range.
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
-rw-r--r-- | fs/btrfs/volumes.c | 20 | ||||
-rw-r--r-- | fs/btrfs/volumes.h | 1 |
2 files changed, 21 insertions, 0 deletions
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index c60071a448a5..e86c9e4fe51e 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c | |||
@@ -2207,6 +2207,20 @@ static int chunk_drange_filter(struct extent_buffer *leaf, | |||
2207 | return 1; | 2207 | return 1; |
2208 | } | 2208 | } |
2209 | 2209 | ||
2210 | /* [vstart, vend) */ | ||
2211 | static int chunk_vrange_filter(struct extent_buffer *leaf, | ||
2212 | struct btrfs_chunk *chunk, | ||
2213 | u64 chunk_offset, | ||
2214 | struct btrfs_balance_args *bargs) | ||
2215 | { | ||
2216 | if (chunk_offset < bargs->vend && | ||
2217 | chunk_offset + btrfs_chunk_length(leaf, chunk) > bargs->vstart) | ||
2218 | /* at least part of the chunk is inside this vrange */ | ||
2219 | return 0; | ||
2220 | |||
2221 | return 1; | ||
2222 | } | ||
2223 | |||
2210 | static int should_balance_chunk(struct btrfs_root *root, | 2224 | static int should_balance_chunk(struct btrfs_root *root, |
2211 | struct extent_buffer *leaf, | 2225 | struct extent_buffer *leaf, |
2212 | struct btrfs_chunk *chunk, u64 chunk_offset) | 2226 | struct btrfs_chunk *chunk, u64 chunk_offset) |
@@ -2252,6 +2266,12 @@ static int should_balance_chunk(struct btrfs_root *root, | |||
2252 | return 0; | 2266 | return 0; |
2253 | } | 2267 | } |
2254 | 2268 | ||
2269 | /* vrange filter */ | ||
2270 | if ((bargs->flags & BTRFS_BALANCE_ARGS_VRANGE) && | ||
2271 | chunk_vrange_filter(leaf, chunk, chunk_offset, bargs)) { | ||
2272 | return 0; | ||
2273 | } | ||
2274 | |||
2255 | return 1; | 2275 | return 1; |
2256 | } | 2276 | } |
2257 | 2277 | ||
diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h index 844b08e388f2..eac26c359312 100644 --- a/fs/btrfs/volumes.h +++ b/fs/btrfs/volumes.h | |||
@@ -203,6 +203,7 @@ struct map_lookup { | |||
203 | #define BTRFS_BALANCE_ARGS_USAGE (1ULL << 1) | 203 | #define BTRFS_BALANCE_ARGS_USAGE (1ULL << 1) |
204 | #define BTRFS_BALANCE_ARGS_DEVID (1ULL << 2) | 204 | #define BTRFS_BALANCE_ARGS_DEVID (1ULL << 2) |
205 | #define BTRFS_BALANCE_ARGS_DRANGE (1ULL << 3) | 205 | #define BTRFS_BALANCE_ARGS_DRANGE (1ULL << 3) |
206 | #define BTRFS_BALANCE_ARGS_VRANGE (1ULL << 4) | ||
206 | 207 | ||
207 | struct btrfs_balance_args; | 208 | struct btrfs_balance_args; |
208 | struct btrfs_balance_control { | 209 | struct btrfs_balance_control { |