Btrfs: fix missing release of the space/qgroup reservation in start_transaction()
PATCH 2/3 Btrfs: fix missing release of the space/qgroup reservation in start_transaction()
When we fail to start a transaction, we need to release the reserved free space and qgroup space, fix it.
Signed-off-by Miao Xie <[email protected]>
--- fs/btrfs/transaction.c | 27 +++++++++++++++++++-------- 1 files changed, 19 insertions(+), 8 deletions(-)
fs/btrfs/transaction.c +19 -8
@@ -333,12 +333,14 @@ start_transaction(struct btrfs_root *root, u64 num_items, int type, &root->fs_info->trans_block_rsv, num_bytes, flush);if (ret) -return ERR_PTR (ret); + goto reserve_fail; } again: h =kmem_cache_alloc (btrfs_trans_handle_cachep,GFP_NOFS ); -if (!h) -return ERR_PTR (-ENOMEM ); +if (!h) { + ret = -ENOMEM ; + goto alloc_fail; + }/* * If we are JOIN_NOLOCK we're already committing a transaction and
@@ -365,11 +367,7 @@ again:if (ret <0 ) {/* We must get the transaction if we are JOIN_NOLOCK. */ BUG_ON (type ==TRANS_JOIN_NOLOCK ); - -if (type <TRANS_JOIN_NOLOCK ) -sb_end_intwrite (root->fs_info->sb); -kmem_cache_free (btrfs_trans_handle_cachep, h); -return ERR_PTR (ret); + goto join_fail; } cur_trans = root->fs_info->running_transaction;
@@ -410,6 +408,19 @@ got_it:if (!current->journal_info && type !=TRANS_USERSPACE ) current->journal_info = h;return h; + +join_fail: +if (type <TRANS_JOIN_NOLOCK ) +sb_end_intwrite (root->fs_info->sb); +kmem_cache_free (btrfs_trans_handle_cachep, h); +alloc_fail: +if (num_bytes) +btrfs_block_rsv_release (root, &root->fs_info->trans_block_rsv, + num_bytes); +reserve_fail: +if (qgroup_reserved) +btrfs_qgroup_free (root, qgroup_reserved); +return ERR_PTR (ret); } struct btrfs_trans_handle *btrfs_start_transaction(struct btrfs_root *root,
Signature · 1 line
1.6.5.2
Quoted 54 lines · Miao Xie
When we fail to start a transaction, we need to release the reserved free space and qgroup space, fix it.
Signed-off-by Miao Xie <[email protected]>--- fs/btrfs/transaction.c | 27 +++++++++++++++++++-------- 1 files changed, 19 insertions(+), 8 deletions(-)fs/btrfs/transaction.c +12
-8@@ -333,12 +333,14 @@ start_transaction(struct btrfs_root *root, u64 num_items, int type, &root->fs_info->trans_block_rsv, num_bytes, flush);if (ret) -return ERR_PTR (ret); + goto reserve_fail; } again: h =kmem_cache_alloc (btrfs_trans_handle_cachep,GFP_NOFS ); -if (!h) -return ERR_PTR (-ENOMEM ); +if (!h) { + ret = -ENOMEM ; + goto alloc_fail; + }/* * If we are JOIN_NOLOCK we're already committing a transaction and @@ -365,11 +367,7 @@ again:if (ret <0 ) {/* We must get the transaction if we are JOIN_NOLOCK. */ BUG_ON (type ==TRANS_JOIN_NOLOCK ); - -if (type <TRANS_JOIN_NOLOCK ) -sb_end_intwrite (root->fs_info->sb); -kmem_cache_free (btrfs_trans_handle_cachep, h); -return ERR_PTR (ret); + goto join_fail; } cur_trans = root->fs_info->running_transaction;@@ -410,6 +408,19 @@ got_it:if (!current->journal_info && type !=TRANS_USERSPACE ) current->journal_info = h;return h; + +join_fail: +if (type <TRANS_JOIN_NOLOCK ) +sb_end_intwrite (root->fs_info->sb); +kmem_cache_free (btrfs_trans_handle_cachep, h); +alloc_fail:
fs/btrfs/transaction.c got_it: · line 426
Quoted 10 lines
fs/btrfs/transaction.c +7
-0+if (num_bytes) +btrfs_block_rsv_release (root, &root->fs_info->trans_block_rsv, + num_bytes); +reserve_fail: +if (qgroup_reserved) +btrfs_qgroup_free (root, qgroup_reserved); +return ERR_PTR (ret); } struct btrfs_trans_handle *btrfs_start_transaction(struct btrfs_root *root,
Reviewed-by Jan Schmidt <[email protected]>
-Jan