• Filipe Manana's avatar
    btrfs: fix sleep while in non-sleep context during qgroup removal · 0bb78830
    Filipe Manana authored
    While removing a qgroup's sysfs entry we end up taking the kernfs_mutex,
    through kobject_del(), while holding the fs_info->qgroup_lock spinlock,
    producing the following trace:
    
      [821.843637] BUG: sleeping function called from invalid context at kernel/locking/mutex.c:281
      [821.843641] in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 28214, name: podman
      [821.843644] CPU: 3 PID: 28214 Comm: podman Tainted: G        W         5.11.6 #15
      [821.843646] Hardware name: Dell Inc. PowerEdge R330/084XW4, BIOS 2.11.0 12/08/2020
      [821.843647] Call Trace:
      [821.843650]  dump_stack+0xa1/0xfb
      [821.843656]  ___might_sleep+0x144/0x160
      [821.843659]  mutex_lock+0x17/0x40
      [821.843662]  kernfs_remove_by_name_ns+0x1f/0x80
      [821.843666]  sysfs_remove_group+0x7d/0xe0
      [821.843668]  sysfs_remove_groups+0x28/0x40
      [821.843670]  kobject_del+0x2a/0x80
      [821.843672]  btrfs_sysfs_del_one_qgroup+0x2b/0x40 [btrfs]
      [821.843685]  __del_qgroup_rb+0x12/0x150 [btrfs]
      [821.843696]  btrfs_remove_qgroup+0x288/0x2a0 [btrfs]
      [821.843707]  btrfs_ioctl+0x3129/0x36a0 [btrfs]
      [821.843717]  ? __mod_lruvec_page_state+0x5e/0xb0
      [821.843719]  ? page_add_new_anon_rmap+0xbc/0x150
      [821.843723]  ? kfree+0x1b4/0x300
      [821.843725]  ? mntput_no_expire+0x55/0x330
      [821.843728]  __x64_sys_ioctl+0x5a/0xa0
      [821.843731]  do_syscall_64+0x33/0x70
      [821.843733]  entry_SYSCALL_64_after_hwframe+0x44/0xa9
      [821.843736] RIP: 0033:0x4cd3fb
      [821.843741] RSP: 002b:000000c000906b20 EFLAGS: 00000206 ORIG_RAX: 0000000000000010
      [821.843744] RAX: ffffffffffffffda RBX: 000000c000050000 RCX: 00000000004cd3fb
      [821.843745] RDX: 000000c000906b98 RSI: 000000004010942a RDI: 000000000000000f
      [821.843747] RBP: 000000c000907cd0 R08: 000000c000622901 R09: 0000000000000000
      [821.843748] R10: 000000c000d992c0 R11: 0000000000000206 R12: 000000000000012d
      [821.843749] R13: 000000000000012c R14: 0000000000000200 R15: 0000000000000049
    
    Fix this by removing the qgroup sysfs entry while not holding the spinlock,
    since the spinlock is only meant for protection of the qgroup rbtree.
    Reported-by: default avatarStuart Shelton <srcshelton@gmail.com>
    Link: https://lore.kernel.org/linux-btrfs/7A5485BB-0628-419D-A4D3-27B1AF47E25A@gmail.com/
    Fixes: 49e5fb46 ("btrfs: qgroup: export qgroups in sysfs")
    CC: stable@vger.kernel.org # 5.10+
    Reviewed-by: default avatarQu Wenruo <wqu@suse.com>
    Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    0bb78830
qgroup.c 110 KB