From 1ecfc74d25e60116af4c605fa7f04ff3b9d69d8b Mon Sep 17 00:00:00 2001 From: Josef Bacik Date: Tue, 2 Apr 2013 12:40:42 -0400 Subject: [PATCH] --- yaml --- r: 374847 b: refs/heads/master c: 8c579fe745d96d0841c28295c10ac3e427cef9f2 h: refs/heads/master i: 374845: 68e4eab191b7778a410c5ade2319ca9f4ee7442d 374843: fdbd66f4dfda2af3739b85185faee8974814b4a9 374839: 50e9c89c81ad60ad5a7ab887178cef50cef2afe3 374831: 8f999d9b0d6d0c71bd08cfcce2082471c70e63f1 374815: 48f155bd6f3327173f9f68effc1f68b8a52b44ea 374783: 3c01f5abe4f43d6e08ea356d3cabbaa7a394ed73 v: v3 --- [refs] | 2 +- trunk/fs/btrfs/extent-tree.c | 41 +++++++++++++++++++++++++++++------- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/[refs] b/[refs] index a0f2d4ba683d..f59e254b4139 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 5c2d867fdcbc11a6862379ebd60b2c1a66e13671 +refs/heads/master: 8c579fe745d96d0841c28295c10ac3e427cef9f2 diff --git a/trunk/fs/btrfs/extent-tree.c b/trunk/fs/btrfs/extent-tree.c index 171f8d676d9c..cba98c1bcc0c 100644 --- a/trunk/fs/btrfs/extent-tree.c +++ b/trunk/fs/btrfs/extent-tree.c @@ -8175,10 +8175,26 @@ int btrfs_read_block_groups(struct btrfs_root *root) free_excluded_extents(root, cache); } + ret = btrfs_add_block_group_cache(root->fs_info, cache); + if (ret) { + btrfs_remove_free_space_cache(cache); + btrfs_put_block_group(cache); + goto error; + } + ret = update_space_info(info, cache->flags, found_key.offset, btrfs_block_group_used(&cache->item), &space_info); - BUG_ON(ret); /* -ENOMEM */ + if (ret) { + btrfs_remove_free_space_cache(cache); + spin_lock(&info->block_group_cache_lock); + rb_erase(&cache->cache_node, + &info->block_group_cache_tree); + spin_unlock(&info->block_group_cache_lock); + btrfs_put_block_group(cache); + goto error; + } + cache->space_info = space_info; spin_lock(&cache->space_info->lock); cache->space_info->bytes_readonly += cache->bytes_super; @@ -8186,9 +8202,6 @@ int btrfs_read_block_groups(struct btrfs_root *root) __link_block_group(space_info, cache); - ret = btrfs_add_block_group_cache(root->fs_info, cache); - BUG_ON(ret); /* Logic error */ - set_avail_alloc_bits(root->fs_info, cache->flags); if (btrfs_chunk_readonly(root, cache->key.objectid)) set_block_group_ro(cache, 1); @@ -8311,9 +8324,24 @@ int btrfs_make_block_group(struct btrfs_trans_handle *trans, free_excluded_extents(root, cache); + ret = btrfs_add_block_group_cache(root->fs_info, cache); + if (ret) { + btrfs_remove_free_space_cache(cache); + btrfs_put_block_group(cache); + return ret; + } + ret = update_space_info(root->fs_info, cache->flags, size, bytes_used, &cache->space_info); - BUG_ON(ret); /* -ENOMEM */ + if (ret) { + btrfs_remove_free_space_cache(cache); + spin_lock(&root->fs_info->block_group_cache_lock); + rb_erase(&cache->cache_node, + &root->fs_info->block_group_cache_tree); + spin_unlock(&root->fs_info->block_group_cache_lock); + btrfs_put_block_group(cache); + return ret; + } update_global_block_rsv(root->fs_info); spin_lock(&cache->space_info->lock); @@ -8322,9 +8350,6 @@ int btrfs_make_block_group(struct btrfs_trans_handle *trans, __link_block_group(cache->space_info, cache); - ret = btrfs_add_block_group_cache(root->fs_info, cache); - BUG_ON(ret); /* Logic error */ - list_add_tail(&cache->new_bg_list, &trans->new_bgs); set_avail_alloc_bits(extent_root->fs_info, type);