* [PATCH 2/3] Btrfs: fix missing release of the space/qgroup reservation in start_transaction()
@ 2013-01-28 12:36 Miao Xie
2013-01-28 12:51 ` Jan Schmidt
0 siblings, 1 reply; 2+ messages in thread
From: Miao Xie @ 2013-01-28 12:36 UTC (permalink / raw)
To: Linux Btrfs
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
^ permalink raw reply related [flat|nested] 2+ messages in thread* Re: [PATCH 2/3] Btrfs: fix missing release of the space/qgroup reservation in start_transaction()
2013-01-28 12:36 [PATCH 2/3] Btrfs: fix missing release of the space/qgroup reservation in start_transaction() Miao Xie
@ 2013-01-28 12:51 ` Jan Schmidt
0 siblings, 0 replies; 2+ messages in thread
From: Jan Schmidt @ 2013-01-28 12:51 UTC (permalink / raw)
To: miaox; +Cc: Linux Btrfs
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
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2013-01-28 12:51 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-01-28 12:36 [PATCH 2/3] Btrfs: fix missing release of the space/qgroup reservation in start_transaction() Miao Xie
2013-01-28 12:51 ` Jan Schmidt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox