diff options
author | Tsutomu Itoh <t-itoh@jp.fujitsu.com> | 2012-10-16 01:44:21 -0400 |
---|---|---|
committer | Chris Mason <chris.mason@fusionio.com> | 2012-10-25 15:45:43 -0400 |
commit | 5b7ff5b3c4468780b15c6b20cd0567cd9f2aa626 (patch) | |
tree | 2c2be551f07d275a1a41fb881fe6acbd65fdaa30 /fs | |
parent | d79e50433b2bea09eb680ed5fae15e8a12356353 (diff) |
Btrfs: fix memory leak in btrfs_quota_enable()
We should free quota_root before returning from the error
handling code.
Signed-off-by: Tsutomu Itoh <t-itoh@jp.fujitsu.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/btrfs/qgroup.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c index 5039686df6ae..fe9d02c45f8e 100644 --- a/fs/btrfs/qgroup.c +++ b/fs/btrfs/qgroup.c | |||
@@ -790,8 +790,10 @@ int btrfs_quota_enable(struct btrfs_trans_handle *trans, | |||
790 | } | 790 | } |
791 | 791 | ||
792 | path = btrfs_alloc_path(); | 792 | path = btrfs_alloc_path(); |
793 | if (!path) | 793 | if (!path) { |
794 | return -ENOMEM; | 794 | ret = -ENOMEM; |
795 | goto out_free_root; | ||
796 | } | ||
795 | 797 | ||
796 | key.objectid = 0; | 798 | key.objectid = 0; |
797 | key.type = BTRFS_QGROUP_STATUS_KEY; | 799 | key.type = BTRFS_QGROUP_STATUS_KEY; |
@@ -800,7 +802,7 @@ int btrfs_quota_enable(struct btrfs_trans_handle *trans, | |||
800 | ret = btrfs_insert_empty_item(trans, quota_root, path, &key, | 802 | ret = btrfs_insert_empty_item(trans, quota_root, path, &key, |
801 | sizeof(*ptr)); | 803 | sizeof(*ptr)); |
802 | if (ret) | 804 | if (ret) |
803 | goto out; | 805 | goto out_free_path; |
804 | 806 | ||
805 | leaf = path->nodes[0]; | 807 | leaf = path->nodes[0]; |
806 | ptr = btrfs_item_ptr(leaf, path->slots[0], | 808 | ptr = btrfs_item_ptr(leaf, path->slots[0], |
@@ -818,8 +820,15 @@ int btrfs_quota_enable(struct btrfs_trans_handle *trans, | |||
818 | fs_info->quota_root = quota_root; | 820 | fs_info->quota_root = quota_root; |
819 | fs_info->pending_quota_state = 1; | 821 | fs_info->pending_quota_state = 1; |
820 | spin_unlock(&fs_info->qgroup_lock); | 822 | spin_unlock(&fs_info->qgroup_lock); |
821 | out: | 823 | out_free_path: |
822 | btrfs_free_path(path); | 824 | btrfs_free_path(path); |
825 | out_free_root: | ||
826 | if (ret) { | ||
827 | free_extent_buffer(quota_root->node); | ||
828 | free_extent_buffer(quota_root->commit_root); | ||
829 | kfree(quota_root); | ||
830 | } | ||
831 | out: | ||
823 | return ret; | 832 | return ret; |
824 | } | 833 | } |
825 | 834 | ||