Btrfs: Use btrfs_join_transaction to avoid deadlocks during snapshot creation
authorYan Zheng <zheng.yan@oracle.com>
Tue, 6 Jan 2009 14:58:06 +0000 (09:58 -0500)
committerChris Mason <chris.mason@oracle.com>
Tue, 6 Jan 2009 14:58:06 +0000 (09:58 -0500)
commit180591bcfed1a2cec048abb21d3dab840625caab
tree9bd247570ef8f3ed33afcb25bb365ccd707c8a73
parent9ca03b997f71787e345951e6267fbd8eba14d49f
Btrfs: Use btrfs_join_transaction to avoid deadlocks during snapshot creation

Snapshot creation happens at a specific time during transaction commit.  We
need to make sure the code called by snapshot creation doesn't wait
for the running transaction to commit.

This changes btrfs_delete_inode and finish_pending_snaps to use
btrfs_join_transaction instead of btrfs_start_transaction to avoid deadlocks.

It would be better if btrfs_delete_inode didn't use the join, but the
call path that triggers it is:

btrfs_commit_transaction->create_pending_snapshots->
create_pending_snapshot->btrfs_lookup_dentry->
fixup_tree_root_location->btrfs_read_fs_root->
btrfs_read_fs_root_no_name->btrfs_orphan_cleanup->iput

This will be fixed in a later patch by moving the orphan cleanup to the
cleaner thread.

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