Skip to content

Commit fcaa174

Browse files
YuKuai-huaweiaxboe
authored andcommitted
scsi/sg: don't grab scsi host module reference
In order to prevent request_queue to be freed before cleaning up blktrace debugfs entries, commit db59133 ("scsi: sg: fix blktrace debugfs entries leakage") use scsi_device_get(), however, scsi_device_get() will also grab scsi module reference and scsi module can't be removed. It's reported that blktests can't unload scsi_debug after block/001: blktests (master) # ./check block block/001 (stress device hotplugging) [failed] +++ /root/blktests/results/nodev/block/001.out.bad 2023-06-19 Running block/001 Stressing sd +modprobe: FATAL: Module scsi_debug is in use. Fix this problem by grabbing request_queue reference directly, so that scsi host module can still be unloaded while request_queue will be pinged by sg device. Reported-by: Chaitanya Kulkarni <[email protected]> Link: https://lore.kernel.org/all/[email protected]/ Fixes: db59133 ("scsi: sg: fix blktrace debugfs entries leakage") Signed-off-by: Yu Kuai <[email protected]> Reviewed-by: Christoph Hellwig <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jens Axboe <[email protected]>
1 parent a42fb5a commit fcaa174

File tree

1 file changed

+3
-3
lines changed

1 file changed

+3
-3
lines changed

drivers/scsi/sg.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1497,7 +1497,7 @@ sg_add_device(struct device *cl_dev)
14971497
int error;
14981498
unsigned long iflags;
14991499

1500-
error = scsi_device_get(scsidp);
1500+
error = blk_get_queue(scsidp->request_queue);
15011501
if (error)
15021502
return error;
15031503

@@ -1558,7 +1558,7 @@ sg_add_device(struct device *cl_dev)
15581558
out:
15591559
if (cdev)
15601560
cdev_del(cdev);
1561-
scsi_device_put(scsidp);
1561+
blk_put_queue(scsidp->request_queue);
15621562
return error;
15631563
}
15641564

@@ -1575,7 +1575,7 @@ sg_device_destroy(struct kref *kref)
15751575
*/
15761576

15771577
blk_trace_remove(q);
1578-
scsi_device_put(sdp->device);
1578+
blk_put_queue(q);
15791579

15801580
write_lock_irqsave(&sg_index_lock, flags);
15811581
idr_remove(&sg_index_idr, sdp->index);

0 commit comments

Comments
 (0)