Miao Xie
2013-Jan-28 12:36 UTC
[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 <miaox@cn.fujitsu.com> --- fs/btrfs/transaction.c | 27 +++++++++++++++++++-------- 1 files changed, 19 insertions(+), 8 deletions(-) diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 87fac9a..194d0b5 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -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, -- 1.6.5.2 -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Jan Schmidt
2013-Jan-28 12:51 UTC
Re: [PATCH 2/3] Btrfs: fix missing release of the space/qgroup reservation in start_transaction()
On 28.01.2013 13:36, Miao Xie wrote:> 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 <miaox@cn.fujitsu.com> > --- > fs/btrfs/transaction.c | 27 +++++++++++++++++++-------- > 1 files changed, 19 insertions(+), 8 deletions(-) > > diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c > index 87fac9a..194d0b5 100644 > --- a/fs/btrfs/transaction.c > +++ b/fs/btrfs/transaction.c > @@ -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, >Reviewed-by: Jan Schmidt <list.btrfs@jan-o-sch.net> -Jan -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html