Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

blk-mq: move lockdep_assert_held() into elevator_exit

Commit c48dac137a62 ("block: don't hold q->sysfs_lock in elevator_init_mq")
removes q->sysfs_lock from elevator_init_mq(), but forgot to deal with
lockdep_assert_held() called in blk_mq_sched_free_requests() which is
run in failure path of elevator_init_mq().

blk_mq_sched_free_requests() is called in the following 3 functions:

elevator_init_mq()
elevator_exit()
blk_cleanup_queue()

In blk_cleanup_queue(), blk_mq_sched_free_requests() is followed exactly
by 'mutex_lock(&q->sysfs_lock)'.

So moving the lockdep_assert_held() from blk_mq_sched_free_requests()
into elevator_exit() for fixing the report by syzbot.

Reported-by: syzbot+da3b7677bb913dc1b737@syzkaller.appspotmail.com
Fixed: c48dac137a62 ("block: don't hold q->sysfs_lock in elevator_init_mq")
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: Damien Le Moal <damien.lemoal@wdc.com>
Signed-off-by: Ming Lei <ming.lei@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>

authored by

Ming Lei and committed by
Jens Axboe
284b94be f41def39

+2 -2
-2
block/blk-mq-sched.c
··· 555 555 struct blk_mq_hw_ctx *hctx; 556 556 int i; 557 557 558 - lockdep_assert_held(&q->sysfs_lock); 559 - 560 558 queue_for_each_hw_ctx(q, hctx, i) { 561 559 if (hctx->sched_tags) 562 560 blk_mq_free_rqs(q->tag_set, hctx->sched_tags, i);
+2
block/blk.h
··· 194 194 static inline void elevator_exit(struct request_queue *q, 195 195 struct elevator_queue *e) 196 196 { 197 + lockdep_assert_held(&q->sysfs_lock); 198 + 197 199 blk_mq_sched_free_requests(q); 198 200 __elevator_exit(q, e); 199 201 }