Btrfs: fix deadlock when throttling transactions
authorJosef Bacik <josef@redhat.com>
Sun, 24 Jul 2011 19:45:34 +0000 (15:45 -0400)
committerChris Mason <chris.mason@oracle.com>
Wed, 27 Jul 2011 16:46:46 +0000 (12:46 -0400)
commit81317fdeddcef259b6ecf7b5c0d04caa167c6b54
treeaeca005b8b595539b554a6b8a92dc052ccad5601
parenta65917156e345946dbde3d7effd28124c6d6a8c2
Btrfs: fix deadlock when throttling transactions

Hit this nice little deadlock.  What happens is this

__btrfs_end_transaction with throttle set, --use_count so it equals 0
  btrfs_commit_transaction
    <somebody else actually manages to start the commit>
    btrfs_end_transaction --use_count so now its -1 <== BAD
      we just return and wait on the transaction

This is bad because we just return after our use_count is -1 and don't let go
of our num_writer count on the transaction, so the guy committing the
transaction just sits there forever.  Fix this by inc'ing our use_count if we're
going to call commit_transaction so that if we call btrfs_end_transaction it's
valid.  Thanks,

Signed-off-by: Josef Bacik <josef@redhat.com>
Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/transaction.c