• Miao Xie's avatar
    Btrfs: fix the deadlock between the transaction start/attach and commit · 178260b2
    Miao Xie authored
    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: default avatarMiao Xie <miaox@cn.fujitsu.com>
    Signed-off-by: default avatarJosef Bacik <jbacik@fusionio.com>
    178260b2
transaction.c 48.4 KB