• Miao Xie's avatar
    Btrfs: don't wait for all the writers circularly during the transaction commit · 0860adfd
    Miao Xie authored
    btrfs_commit_transaction has the following loop before we commit the
    transaction.
    
    do {
        // attempt to do some useful stuff and/or sleep
    } while (atomic_read(&cur_trans->num_writers) > 1 ||
    	 (should_grow && cur_trans->num_joined != joined));
    
    This is used to prevent from the TRANS_START to get in the way of a
    committing transaction. But it does not prevent from TRANS_JOIN, that
    is we would do this loop for a long time if some writers JOIN the
    current transaction endlessly.
    
    Because we need join the current transaction to do some useful stuff,
    we can not block TRANS_JOIN here. So we introduce a external writer
    counter, which is used to count the TRANS_USERSPACE/TRANS_START writers.
    If the external writer counter is zero, we can break the above loop.
    
    In order to make the code more clear, we don't use enum variant
    to define the type of the transaction handle, use bitmask instead.
    Signed-off-by: default avatarMiao Xie <miaox@cn.fujitsu.com>
    Signed-off-by: default avatarJosef Bacik <jbacik@fusionio.com>
    0860adfd
transaction.c 51.8 KB