• Qu Wenruo's avatar
    btrfs: do not abort transaction if there is already an existing qgroup · 8049ba5d
    Qu Wenruo authored
    [BUG]
    Syzbot reported a regression that after commit 6ed05643 ("btrfs:
    create qgroup earlier in snapshot creation") we can trigger transaction
    abort during snapshot creation:
    
      BTRFS: Transaction aborted (error -17)
      WARNING: CPU: 0 PID: 5057 at fs/btrfs/transaction.c:1778 create_pending_snapshot+0x25f4/0x2b70 fs/btrfs/transaction.c:1778
      Modules linked in:
      CPU: 0 PID: 5057 Comm: syz-executor225 Not tainted 6.6.0-syzkaller-15365-g30523014 #0
      Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 10/09/2023
      RIP: 0010:create_pending_snapshot+0x25f4/0x2b70 fs/btrfs/transaction.c:1778
      Call Trace:
       <TASK>
       create_pending_snapshots+0x195/0x1d0 fs/btrfs/transaction.c:1967
       btrfs_commit_transaction+0xf1c/0x3730 fs/btrfs/transaction.c:2440
       create_snapshot+0x4a5/0x7e0 fs/btrfs/ioctl.c:845
       btrfs_mksubvol+0x5d0/0x750 fs/btrfs/ioctl.c:995
       btrfs_mksnapshot+0xb5/0xf0 fs/btrfs/ioctl.c:1041
       __btrfs_ioctl_snap_create+0x344/0x460 fs/btrfs/ioctl.c:1294
       btrfs_ioctl_snap_create+0x13c/0x190 fs/btrfs/ioctl.c:1321
       btrfs_ioctl+0xbbf/0xd40
       vfs_ioctl fs/ioctl.c:51 [inline]
       __do_sys_ioctl fs/ioctl.c:871 [inline]
       __se_sys_ioctl+0xf8/0x170 fs/ioctl.c:857
       do_syscall_x64 arch/x86/entry/common.c:51 [inline]
       do_syscall_64+0x44/0x110 arch/x86/entry/common.c:82
       entry_SYSCALL_64_after_hwframe+0x63/0x6b
      RIP: 0033:0x7f2f791127b9
       </TASK>
    
    [CAUSE]
    The error number is -EEXIST, which can happen for qgroup if there is
    already an existing qgroup and then we're trying to create a snapshot
    for it.
    
    [FIX]
    In that case, we can continue creating the snapshot, although it may
    lead to qgroup inconsistency, it's not so critical to abort the current
    transaction.
    
    So in this case, we can just ignore the non-critical errors, mostly -EEXIST
    (there is already a qgroup).
    
    Reported-by: syzbot+4d81015bc10889fd12ea@syzkaller.appspotmail.com
    Fixes: 6ed05643 ("btrfs: create qgroup earlier in snapshot creation")
    Reviewed-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarQu Wenruo <wqu@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    8049ba5d
transaction.c 81 KB