summaryrefslogtreecommitdiffstats
path: root/fs/btrfs
diff options
context:
space:
mode:
authorLiu Bo <bo.li.liu@oracle.com>2012-10-25 07:30:19 -0600
committerChris Mason <chris.mason@fusionio.com>2012-10-25 15:55:21 -0400
commit7bfdcf7fbad56c0f1fc3e2d26431bed72bdcce2d (patch)
tree7f424418288996ca3f8eae052d703e9699b1e23a /fs/btrfs
parentc657c3ef1adb2585ed7d2a6db73d0002926a6726 (diff)
Btrfs: fix memory leak when cloning root's node
After cloning root's node, we forgot to dec the src's ref which can lead to a memory leak. Signed-off-by: Liu Bo <bo.li.liu@oracle.com> Signed-off-by: Chris Mason <chris.mason@fusionio.com>
Diffstat (limited to 'fs/btrfs')
-rw-r--r--fs/btrfs/ctree.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c
index eba44b07682..cdfb4c49a80 100644
--- a/fs/btrfs/ctree.c
+++ b/fs/btrfs/ctree.c
@@ -1241,6 +1241,7 @@ get_old_root(struct btrfs_root *root, u64 time_seq)
{
struct tree_mod_elem *tm;
struct extent_buffer *eb;
+ struct extent_buffer *old;
struct tree_mod_root *old_root = NULL;
u64 old_generation = 0;
u64 logical;
@@ -1264,13 +1265,14 @@ get_old_root(struct btrfs_root *root, u64 time_seq)
btrfs_tree_read_unlock(root->node);
free_extent_buffer(root->node);
blocksize = btrfs_level_size(root, old_root->level);
- eb = read_tree_block(root, logical, blocksize, 0);
- if (!eb) {
+ old = read_tree_block(root, logical, blocksize, 0);
+ if (!old) {
pr_warn("btrfs: failed to read tree block %llu from get_old_root\n",
logical);
WARN_ON(1);
} else {
- eb = btrfs_clone_extent_buffer(eb);
+ eb = btrfs_clone_extent_buffer(old);
+ free_extent_buffer(old);
}
} else if (old_root) {
btrfs_tree_read_unlock(root->node);