diff options
author | Tsutomu Itoh <t-itoh@jp.fujitsu.com> | 2013-03-21 04:32:32 +0000 |
---|---|---|
committer | Chris Mason <chris.mason@fusionio.com> | 2013-03-21 19:31:52 -0400 |
commit | 1dd05682b3ef6e70409e130bfd83e91770801589 (patch) | |
tree | 778cbfa572ad33981b6ba077b99861675e476fc9 /fs | |
parent | d9abbf1c3131b679379762700201ae69367f3f62 (diff) | |
download | lwn-1dd05682b3ef6e70409e130bfd83e91770801589.tar.gz lwn-1dd05682b3ef6e70409e130bfd83e91770801589.zip |
Btrfs: fix memory leak in btrfs_create_tree()
We should free leaf and root before returning from the error
handling code.
Signed-off-by: Tsutomu Itoh <t-itoh@jp.fujitsu.com>
Signed-off-by: Josef Bacik <jbacik@fusionio.com>
Signed-off-by: Chris Mason <chris.mason@fusionio.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/btrfs/disk-io.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 127b23e8323b..6d19a0a554aa 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -1291,6 +1291,7 @@ struct btrfs_root *btrfs_create_tree(struct btrfs_trans_handle *trans, 0, objectid, NULL, 0, 0, 0); if (IS_ERR(leaf)) { ret = PTR_ERR(leaf); + leaf = NULL; goto fail; } @@ -1334,11 +1335,16 @@ struct btrfs_root *btrfs_create_tree(struct btrfs_trans_handle *trans, btrfs_tree_unlock(leaf); + return root; + fail: - if (ret) - return ERR_PTR(ret); + if (leaf) { + btrfs_tree_unlock(leaf); + free_extent_buffer(leaf); + } + kfree(root); - return root; + return ERR_PTR(ret); } static struct btrfs_root *alloc_log_tree(struct btrfs_trans_handle *trans, |