diff options
Diffstat (limited to 'fs/btrfs/extent-tree.c')
| -rw-r--r-- | fs/btrfs/extent-tree.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index f79e477a378e..1aee51a9f3bf 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
| @@ -757,12 +757,14 @@ static struct btrfs_space_info *__find_space_info(struct btrfs_fs_info *info, | |||
| 757 | } | 757 | } |
| 758 | 758 | ||
| 759 | static void add_pinned_bytes(struct btrfs_fs_info *fs_info, | 759 | static void add_pinned_bytes(struct btrfs_fs_info *fs_info, |
| 760 | struct btrfs_ref *ref) | 760 | struct btrfs_ref *ref, int sign) |
| 761 | { | 761 | { |
| 762 | struct btrfs_space_info *space_info; | 762 | struct btrfs_space_info *space_info; |
| 763 | s64 num_bytes = -ref->len; | 763 | s64 num_bytes; |
| 764 | u64 flags; | 764 | u64 flags; |
| 765 | 765 | ||
| 766 | ASSERT(sign == 1 || sign == -1); | ||
| 767 | num_bytes = sign * ref->len; | ||
| 766 | if (ref->type == BTRFS_REF_METADATA) { | 768 | if (ref->type == BTRFS_REF_METADATA) { |
| 767 | if (ref->tree_ref.root == BTRFS_CHUNK_TREE_OBJECTID) | 769 | if (ref->tree_ref.root == BTRFS_CHUNK_TREE_OBJECTID) |
| 768 | flags = BTRFS_BLOCK_GROUP_SYSTEM; | 770 | flags = BTRFS_BLOCK_GROUP_SYSTEM; |
| @@ -2063,7 +2065,7 @@ int btrfs_inc_extent_ref(struct btrfs_trans_handle *trans, | |||
| 2063 | btrfs_ref_tree_mod(fs_info, generic_ref); | 2065 | btrfs_ref_tree_mod(fs_info, generic_ref); |
| 2064 | 2066 | ||
| 2065 | if (ret == 0 && old_ref_mod < 0 && new_ref_mod >= 0) | 2067 | if (ret == 0 && old_ref_mod < 0 && new_ref_mod >= 0) |
| 2066 | add_pinned_bytes(fs_info, generic_ref); | 2068 | add_pinned_bytes(fs_info, generic_ref, -1); |
| 2067 | 2069 | ||
| 2068 | return ret; | 2070 | return ret; |
| 2069 | } | 2071 | } |
| @@ -3882,8 +3884,7 @@ static int create_space_info(struct btrfs_fs_info *info, u64 flags) | |||
| 3882 | info->space_info_kobj, "%s", | 3884 | info->space_info_kobj, "%s", |
| 3883 | alloc_name(space_info->flags)); | 3885 | alloc_name(space_info->flags)); |
| 3884 | if (ret) { | 3886 | if (ret) { |
| 3885 | percpu_counter_destroy(&space_info->total_bytes_pinned); | 3887 | kobject_put(&space_info->kobj); |
| 3886 | kfree(space_info); | ||
| 3887 | return ret; | 3888 | return ret; |
| 3888 | } | 3889 | } |
| 3889 | 3890 | ||
| @@ -7190,7 +7191,7 @@ void btrfs_free_tree_block(struct btrfs_trans_handle *trans, | |||
| 7190 | } | 7191 | } |
| 7191 | out: | 7192 | out: |
| 7192 | if (pin) | 7193 | if (pin) |
| 7193 | add_pinned_bytes(fs_info, &generic_ref); | 7194 | add_pinned_bytes(fs_info, &generic_ref, 1); |
| 7194 | 7195 | ||
| 7195 | if (last_ref) { | 7196 | if (last_ref) { |
| 7196 | /* | 7197 | /* |
| @@ -7238,7 +7239,7 @@ int btrfs_free_extent(struct btrfs_trans_handle *trans, struct btrfs_ref *ref) | |||
| 7238 | btrfs_ref_tree_mod(fs_info, ref); | 7239 | btrfs_ref_tree_mod(fs_info, ref); |
| 7239 | 7240 | ||
| 7240 | if (ret == 0 && old_ref_mod >= 0 && new_ref_mod < 0) | 7241 | if (ret == 0 && old_ref_mod >= 0 && new_ref_mod < 0) |
| 7241 | add_pinned_bytes(fs_info, ref); | 7242 | add_pinned_bytes(fs_info, ref, 1); |
| 7242 | 7243 | ||
| 7243 | return ret; | 7244 | return ret; |
| 7244 | } | 7245 | } |
