• Yan Zheng's avatar
    Btrfs: Use btrfs_join_transaction to avoid deadlocks during snapshot creation · 180591bc
    Yan Zheng authored
    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: default avatarChris Mason <chris.mason@oracle.com>
    180591bc
transaction.c 29.7 KB