Btrfs: fix the deadlock between the transaction start/attach and commit
authorMiao Xie <miaox@cn.fujitsu.com>
Wed, 20 Feb 2013 09:16:24 +0000 (09:16 +0000)
committerJosef Bacik <jbacik@fusionio.com>
Wed, 20 Feb 2013 18:00:03 +0000 (13:00 -0500)
commit178260b2c14969f29ba39a78df74ed485abc6203
tree56bf3f573112f898f3439d6e0a11d76fbb925bb0
parent4b82490649f5c8ecbf888752c325ea68831c497e
Btrfs: fix the deadlock between the transaction start/attach and commit

Now btrfs_commit_transaction() does this

ret = btrfs_run_ordered_operations(root, 0)

which async flushes all inodes on the ordered operations list, it introduced
a deadlock that transaction-start task, transaction-commit task and the flush
workers waited for each other.
(See the following URL to get the detail
 http://marc.info/?l=linux-btrfs&m=136070705732646&w=2)

As we know, if ->in_commit is set, it means someone is committing the
current transaction, we should not try to join it if we are not JOIN
or JOIN_NOLOCK, wait is the best choice for it. In this way, we can avoid
the above problem. In this way, there is another benefit: there is no new
transaction handle to block the transaction which is on the way of commit,
once we set ->in_commit.

Signed-off-by: Miao Xie <miaox@cn.fujitsu.com>
Signed-off-by: Josef Bacik <jbacik@fusionio.com>
fs/btrfs/transaction.c