• Wang Shilong's avatar
    Btrfs: device_replace: fix deadlock for nocow case · 12cf9372
    Wang Shilong authored
    commit cb7ab021 cause a following deadlock found by
    xfstests,btrfs/011:
    
    Thread1 is commiting transaction which is blocked at
    btrfs_scrub_pause().
    
    Thread2 is calling btrfs_file_aio_write() which has held
    inode's @i_mutex and commit transaction(blocked because
    Thread1 is committing transaction).
    
    Thread3 is copy_nocow_page worker which will also try to
    hold inode @i_mutex, so thread3 will wait Thread1 finished.
    
    Thread4 is waiting pending workers finished which will wait
    Thread3 finished. So the problem is like this:
    
    Thread1--->Thread4--->Thread3--->Thread2---->Thread1
    
    Deadlock happens! we fix it by letting Thread1 go firstly,
    which means we won't block transaction commit while we are
    waiting pending workers finished.
    Reported-by: default avatarQu Wenruo <quwenruo@cn.fujitsu.com>
    Signed-off-by: default avatarWang Shilong <wangsl.fnst@cn.fujitsu.com>
    Signed-off-by: default avatarJosef Bacik <jbacik@fb.com>
    12cf9372
scrub.c 90.7 KB