]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
scsi: core: Fix a regression triggered by scsi_host_busy()
authorBart Van Assche <bvanassche@acm.org>
Tue, 7 Oct 2025 21:48:00 +0000 (14:48 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Mon, 20 Oct 2025 15:57:52 +0000 (11:57 -0400)
Commit 995412e23bb2 ("blk-mq: Replace tags->lock with SRCU for tag
iterators") introduced the following regression:

Call trace:
 __srcu_read_lock+0x30/0x80 (P)
 blk_mq_tagset_busy_iter+0x44/0x300
 scsi_host_busy+0x38/0x70
 ufshcd_print_host_state+0x34/0x1bc
 ufshcd_link_startup.constprop.0+0xe4/0x2e0
 ufshcd_init+0x944/0xf80
 ufshcd_pltfrm_init+0x504/0x820
 ufs_rockchip_probe+0x2c/0x88
 platform_probe+0x5c/0xa4
 really_probe+0xc0/0x38c
 __driver_probe_device+0x7c/0x150
 driver_probe_device+0x40/0x120
 __driver_attach+0xc8/0x1e0
 bus_for_each_dev+0x7c/0xdc
 driver_attach+0x24/0x30
 bus_add_driver+0x110/0x230
 driver_register+0x68/0x130
 __platform_driver_register+0x20/0x2c
 ufs_rockchip_pltform_init+0x1c/0x28
 do_one_initcall+0x60/0x1e0
 kernel_init_freeable+0x248/0x2c4
 kernel_init+0x20/0x140
 ret_from_fork+0x10/0x20

Fix this regression by making scsi_host_busy() check whether the SCSI
host tag set has already been initialized. tag_set->ops is set by
scsi_mq_setup_tags() just before blk_mq_alloc_tag_set() is called. This
fix is based on the assumption that scsi_host_busy() and
scsi_mq_setup_tags() calls are serialized. This is the case in the UFS
driver.

Reported-by: Sebastian Reichel <sebastian.reichel@collabora.com>
Closes: https://lore.kernel.org/linux-block/pnezafputodmqlpumwfbn644ohjybouveehcjhz2hmhtcf2rka@sdhoiivync4y/
Cc: Ming Lei <ming.lei@redhat.com>
Cc: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: Ming Lei <ming.lei@redhat.com>
Tested-by: Sebastian Reichel <sebastian.reichel@collabora.com>
Link: https://patch.msgid.link/20251007214800.1678255-1-bvanassche@acm.org
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/hosts.c

index cc5d05dc395c4637cefa4b97864fa9d50124af03..17173239301e613597392bf812708952e576eda8 100644 (file)
@@ -611,8 +611,9 @@ int scsi_host_busy(struct Scsi_Host *shost)
 {
        int cnt = 0;
 
-       blk_mq_tagset_busy_iter(&shost->tag_set,
-                               scsi_host_check_in_flight, &cnt);
+       if (shost->tag_set.ops)
+               blk_mq_tagset_busy_iter(&shost->tag_set,
+                                       scsi_host_check_in_flight, &cnt);
        return cnt;
 }
 EXPORT_SYMBOL(scsi_host_busy);