On Tue, Oct 08, 2019 at 08:43:06PM +0300, Nikolay Borisov wrote: > 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. > > Signed-off-by: Nikolay Borisov <nborisov@xxxxxxxx> Added to misc-next, thanks.
