• Johannes Thumshirn's avatar
    btrfs: zoned: fix deadlock on log sync · 6e37d245
    Johannes Thumshirn authored
    Lockdep with fstests test case btrfs/041 detected a unsafe locking
    scenario when we allocate the log node on a zoned filesystem.
    
    btrfs/041
     ============================================
     WARNING: possible recursive locking detected
     5.11.0-rc7+ #939 Not tainted
     --------------------------------------------
     xfs_io/698 is trying to acquire lock:
     ffff88810cd673a0 (&root->log_mutex){+.+.}-{3:3}, at: btrfs_sync_log+0x3d1/0xee0 [btrfs]
    
     but task is already holding lock:
     ffff88810b0fc3a0 (&root->log_mutex){+.+.}-{3:3}, at: btrfs_sync_log+0x313/0xee0 [btrfs]
    
     other info that might help us debug this:
      Possible unsafe locking scenario:
    
            CPU0
            ----
       lock(&root->log_mutex);
       lock(&root->log_mutex);
    
      *** DEADLOCK ***
    
      May be due to missing lock nesting notation
    
     2 locks held by xfs_io/698:
      #0: ffff88810cd66620 (sb_internal){.+.+}-{0:0}, at: btrfs_sync_file+0x2c3/0x570 [btrfs]
      #1: ffff88810b0fc3a0 (&root->log_mutex){+.+.}-{3:3}, at: btrfs_sync_log+0x313/0xee0 [btrfs]
    
     stack backtrace:
     CPU: 0 PID: 698 Comm: xfs_io Not tainted 5.11.0-rc7+ #939
     Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.13.0-0-gf21b5a4-rebuilt.opensuse.org 04/01/2014
     Call Trace:
      dump_stack+0x77/0x97
      __lock_acquire.cold+0xb9/0x32a
      lock_acquire+0xb5/0x400
      ? btrfs_sync_log+0x3d1/0xee0 [btrfs]
      __mutex_lock+0x7b/0x8d0
      ? btrfs_sync_log+0x3d1/0xee0 [btrfs]
      ? btrfs_sync_log+0x3d1/0xee0 [btrfs]
      ? find_first_extent_bit+0x9f/0x100 [btrfs]
      ? __mutex_unlock_slowpath+0x35/0x270
      btrfs_sync_log+0x3d1/0xee0 [btrfs]
      btrfs_sync_file+0x3a8/0x570 [btrfs]
      __x64_sys_fsync+0x34/0x60
      do_syscall_64+0x33/0x40
      entry_SYSCALL_64_after_hwframe+0x44/0xa9
    
    This happens, because we are taking the ->log_mutex albeit it has already
    been locked.
    
    Also while at it, fix the bogus unlock of the tree_log_mutex in the error
    handling.
    
    Fixes: 3ddebf27 ("btrfs: zoned: reorder log node allocation on zoned filesystem")
    Reviewed-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    6e37d245
tree-log.c 174 KB