aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosef Bacik <jbacik@fusionio.com>2013-04-23 12:55:21 -0400
committerJosef Bacik <jbacik@fusionio.com>2013-05-06 15:55:06 -0400
commit51bf5f0bc4d132a3646ce36061e83fdc8b77f302 (patch)
tree6353715b1cb9e6581dc57d0d23c8097881b5ba33
parent1c24c3ce6a8022ab225f44160bfddc92a5a6e435 (diff)
Btrfs: only exclude supers in the range of our block group
If we fail to load block groups halfway through we can leave extent_state's on the excluded tree. This is because we just lookup the supers and add them to the excluded tree regardless of which block group we are looking at currently. This is a problem because we remove the excluded extents for the range of the block group only, so if we don't ever load a block group for one of the excluded extents we won't ever free it. This fixes the problem by only adding excluded extents if it falls in the block group range we care about. With this patch we're no longer leaking space when we fail to read all of the block groups. Thanks, Signed-off-by: Josef Bacik <jbacik@fusionio.com>
-rw-r--r--fs/btrfs/extent-tree.c24
1 files changed, 21 insertions, 3 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index fa57965f60a3..94bed61b799f 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -270,9 +270,27 @@ static int exclude_super_stripes(struct btrfs_root *root,
270 return ret; 270 return ret;
271 271
272 while (nr--) { 272 while (nr--) {
273 cache->bytes_super += stripe_len; 273 u64 start, len;
274 ret = add_excluded_extent(root, logical[nr], 274
275 stripe_len); 275 if (logical[nr] > cache->key.objectid +
276 cache->key.offset)
277 continue;
278
279 if (logical[nr] + stripe_len <= cache->key.objectid)
280 continue;
281
282 start = logical[nr];
283 if (start < cache->key.objectid) {
284 start = cache->key.objectid;
285 len = (logical[nr] + stripe_len) - start;
286 } else {
287 len = min_t(u64, stripe_len,
288 cache->key.objectid +
289 cache->key.offset - start);
290 }
291
292 cache->bytes_super += len;
293 ret = add_excluded_extent(root, start, len);
276 if (ret) { 294 if (ret) {
277 kfree(logical); 295 kfree(logical);
278 return ret; 296 return ret;