btrfs-progs: fix a memory leak when starting a transaction on fs with error
Function btrfs_start_transaction() will allocate the memory unconditionally, but if the fs has an aborted transaction we don't free the allocated memory but return error directly. Fix it by only allocate the new memory after all the checks. Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Signed-off-by: Qu Wenruo <wqu@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
bfe6402026
commit
4a940ab2c0
|
@ -25,23 +25,24 @@ struct btrfs_trans_handle* btrfs_start_transaction(struct btrfs_root *root,
|
|||
int num_blocks)
|
||||
{
|
||||
struct btrfs_fs_info *fs_info = root->fs_info;
|
||||
struct btrfs_trans_handle *h = kzalloc(sizeof(*h), GFP_NOFS);
|
||||
struct btrfs_trans_handle *h;
|
||||
|
||||
if (fs_info->transaction_aborted)
|
||||
return ERR_PTR(-EROFS);
|
||||
|
||||
if (!h)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
if (root->commit_root) {
|
||||
error("commit_root already set when starting transaction");
|
||||
kfree(h);
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
if (fs_info->running_transaction) {
|
||||
error("attempt to start transaction over already running one");
|
||||
kfree(h);
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
h = kzalloc(sizeof(*h), GFP_NOFS);
|
||||
if (!h)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
h->fs_info = fs_info;
|
||||
fs_info->running_transaction = h;
|
||||
fs_info->generation++;
|
||||
|
|
Loading…
Reference in New Issue