diff options
author | Liu Bo <bo.li.liu@oracle.com> | 2013-03-04 11:25:41 -0500 |
---|---|---|
committer | Josef Bacik <jbacik@fusionio.com> | 2013-03-04 16:33:23 -0500 |
commit | 66b6135b7cf741f6f44ba938b27583ea3b83bd12 (patch) | |
tree | 40f18d5bed7e86d303a908fd21d3b851462c00b5 | |
parent | 0f788c58194e4ccc5b3ab23f872c5e18542335e4 (diff) |
Btrfs: avoid deadlock on transaction waiting list
Only let one trans handle to wait for other handles, otherwise we
will get ABBA issues.
Signed-off-by: Liu Bo <bo.li.liu@oracle.com>
Signed-off-by: Josef Bacik <jbacik@fusionio.com>
-rw-r--r-- | fs/btrfs/transaction.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index d8fce6fe9cf8..fedede1fe178 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c | |||
@@ -1457,6 +1457,13 @@ static void cleanup_transaction(struct btrfs_trans_handle *trans, | |||
1457 | btrfs_abort_transaction(trans, root, err); | 1457 | btrfs_abort_transaction(trans, root, err); |
1458 | 1458 | ||
1459 | spin_lock(&root->fs_info->trans_lock); | 1459 | spin_lock(&root->fs_info->trans_lock); |
1460 | |||
1461 | if (list_empty(&cur_trans->list)) { | ||
1462 | spin_unlock(&root->fs_info->trans_lock); | ||
1463 | btrfs_end_transaction(trans, root); | ||
1464 | return; | ||
1465 | } | ||
1466 | |||
1460 | list_del_init(&cur_trans->list); | 1467 | list_del_init(&cur_trans->list); |
1461 | if (cur_trans == root->fs_info->running_transaction) { | 1468 | if (cur_trans == root->fs_info->running_transaction) { |
1462 | root->fs_info->trans_no_join = 1; | 1469 | root->fs_info->trans_no_join = 1; |