• Nikolay Borisov's avatar
    btrfs: Rename btrfs_join_transaction_nolock · 8d510121
    Nikolay Borisov authored
    This function is used only during the final phase of freespace cache
    writeout. This is necessary since using the plain btrfs_join_transaction
    api is deadlock prone. The deadlock looks like:
    
    T1:
    btrfs_commit_transaction
      commit_cowonly_roots
        btrfs_write_dirty_block_groups
          btrfs_wait_cache_io
            __btrfs_wait_cache_io
           btrfs_wait_ordered_range <-- Triggers ordered IO for freespace
                                        inode and blocks transaction commit
    				    until freespace cache writeout
    
    T2: <-- after T1 has triggered the writeout
    finish_ordered_fn
      btrfs_finish_ordered_io
        btrfs_join_transaction <--- this would block waiting for current
                                    transaction to commit, but since trans
    				commit is waiting for this writeout to
    				finish
    
    The special purpose functions prevents it by simply skipping the "wait
    for writeout" since it's guaranteed the transaction won't proceed until
    we are done.
    Reviewed-by: default avatarQu Wenruo <wqu@suse.com>
    Signed-off-by: default avatarNikolay Borisov <nborisov@suse.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    8d510121
transaction.c 68.7 KB