diff options
Diffstat (limited to 'fs/btrfs/extent-tree.c')
-rw-r--r-- | fs/btrfs/extent-tree.c | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index fcdccfa46004..44d7a322ec28 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -3454,14 +3454,6 @@ static int update_block_group(struct btrfs_trans_handle *trans, | |||
3454 | else | 3454 | else |
3455 | old_val -= num_bytes; | 3455 | old_val -= num_bytes; |
3456 | btrfs_set_super_bytes_used(&info->super_copy, old_val); | 3456 | btrfs_set_super_bytes_used(&info->super_copy, old_val); |
3457 | |||
3458 | /* block accounting for root item */ | ||
3459 | old_val = btrfs_root_used(&root->root_item); | ||
3460 | if (alloc) | ||
3461 | old_val += num_bytes; | ||
3462 | else | ||
3463 | old_val -= num_bytes; | ||
3464 | btrfs_set_root_used(&root->root_item, old_val); | ||
3465 | spin_unlock(&info->delalloc_lock); | 3457 | spin_unlock(&info->delalloc_lock); |
3466 | 3458 | ||
3467 | while (total) { | 3459 | while (total) { |
@@ -4049,6 +4041,21 @@ int btrfs_free_extent(struct btrfs_trans_handle *trans, | |||
4049 | return ret; | 4041 | return ret; |
4050 | } | 4042 | } |
4051 | 4043 | ||
4044 | int btrfs_free_tree_block(struct btrfs_trans_handle *trans, | ||
4045 | struct btrfs_root *root, | ||
4046 | u64 bytenr, u32 blocksize, | ||
4047 | u64 parent, u64 root_objectid, int level) | ||
4048 | { | ||
4049 | u64 used; | ||
4050 | spin_lock(&root->node_lock); | ||
4051 | used = btrfs_root_used(&root->root_item) - blocksize; | ||
4052 | btrfs_set_root_used(&root->root_item, used); | ||
4053 | spin_unlock(&root->node_lock); | ||
4054 | |||
4055 | return btrfs_free_extent(trans, root, bytenr, blocksize, | ||
4056 | parent, root_objectid, level, 0); | ||
4057 | } | ||
4058 | |||
4052 | static u64 stripe_align(struct btrfs_root *root, u64 val) | 4059 | static u64 stripe_align(struct btrfs_root *root, u64 val) |
4053 | { | 4060 | { |
4054 | u64 mask = ((u64)root->stripesize - 1); | 4061 | u64 mask = ((u64)root->stripesize - 1); |
@@ -4897,6 +4904,14 @@ static int alloc_tree_block(struct btrfs_trans_handle *trans, | |||
4897 | extent_op); | 4904 | extent_op); |
4898 | BUG_ON(ret); | 4905 | BUG_ON(ret); |
4899 | } | 4906 | } |
4907 | |||
4908 | if (root_objectid == root->root_key.objectid) { | ||
4909 | u64 used; | ||
4910 | spin_lock(&root->node_lock); | ||
4911 | used = btrfs_root_used(&root->root_item) + num_bytes; | ||
4912 | btrfs_set_root_used(&root->root_item, used); | ||
4913 | spin_unlock(&root->node_lock); | ||
4914 | } | ||
4900 | return ret; | 4915 | return ret; |
4901 | } | 4916 | } |
4902 | 4917 | ||