Commit 00d71c9c authored by Miao Xie's avatar Miao Xie Committed by Josef Bacik

Btrfs: fix unclosed transaction handler when the async transaction commitment fails

If the async transaction commitment failed, we need close the
current transaction handler, or the current transaction will be
blocked to commit because of this orphan handler.

We fix the problem by doing sync transaction commitment, that is
to invoke btrfs_commit_transaction().
Signed-off-by: default avatarMiao Xie <miaox@cn.fujitsu.com>
Signed-off-by: default avatarJosef Bacik <jbacik@fusionio.com>
parent aec8030a
...@@ -527,6 +527,8 @@ static noinline int create_subvol(struct inode *dir, ...@@ -527,6 +527,8 @@ static noinline int create_subvol(struct inode *dir,
if (async_transid) { if (async_transid) {
*async_transid = trans->transid; *async_transid = trans->transid;
err = btrfs_commit_transaction_async(trans, root, 1); err = btrfs_commit_transaction_async(trans, root, 1);
if (err)
err = btrfs_commit_transaction(trans, root);
} else { } else {
err = btrfs_commit_transaction(trans, root); err = btrfs_commit_transaction(trans, root);
} }
...@@ -592,6 +594,8 @@ static int create_snapshot(struct btrfs_root *root, struct inode *dir, ...@@ -592,6 +594,8 @@ static int create_snapshot(struct btrfs_root *root, struct inode *dir,
*async_transid = trans->transid; *async_transid = trans->transid;
ret = btrfs_commit_transaction_async(trans, ret = btrfs_commit_transaction_async(trans,
root->fs_info->extent_root, 1); root->fs_info->extent_root, 1);
if (ret)
ret = btrfs_commit_transaction(trans, root);
} else { } else {
ret = btrfs_commit_transaction(trans, ret = btrfs_commit_transaction(trans,
root->fs_info->extent_root); root->fs_info->extent_root);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment