]> www.infradead.org Git - users/dwmw2/linux.git/commit
loop: Fix ABBA locking race
authorOGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
Tue, 19 Nov 2024 14:42:23 +0000 (23:42 +0900)
committerJens Axboe <axboe@kernel.dk>
Tue, 19 Nov 2024 14:54:56 +0000 (07:54 -0700)
commitb49125574cae26458d4aa02ce8f4523ba9a2a328
treed644563dcc3cccb307b52a848c2e26374cb56518
parent46fd48ab3ea3eb3bb215684bd66ea3d260b091a9
loop: Fix ABBA locking race

Current loop calls vfs_statfs() while holding the q->limits_lock. If
FS takes some locking in vfs_statfs callback, this may lead to ABBA
locking bug (at least, FAT fs has this issue actually).

So this patch calls vfs_statfs() outside q->limits_locks instead,
because looks like no reason to hold q->limits_locks while getting
discord configs.

Chain exists of:
  &sbi->fat_lock --> &q->q_usage_counter(io)#17 --> &q->limits_lock

 Possible unsafe locking scenario:

       CPU0                    CPU1
       ----                    ----
  lock(&q->limits_lock);
                               lock(&q->q_usage_counter(io)#17);
                               lock(&q->limits_lock);
  lock(&sbi->fat_lock);

 *** DEADLOCK ***

Reported-by: syzbot+a5d8c609c02f508672cc@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=a5d8c609c02f508672cc
Reviewed-by: Ming Lei <ming.lei@redhat.com>
Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/block/loop.c