aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYu Kuai <[email protected]>2023-06-22 00:01:11 +0800
committerJens Axboe <[email protected]>2023-06-23 08:28:18 -0600
commitfcaa174a9c995cf0af3967e55644a1543ea07e36 (patch)
treee5e2fe503acc37f19bb45b6894a96f5b9fb048cc
parenta42fb5a75ccc37dfd69aa9bde5ba2866e802ff3c (diff)
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 db59133e9279 ("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: db59133e9279 ("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]>
-rw-r--r--drivers/scsi/sg.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c
index 2433eeef042a..dcb73787c29d 100644
--- a/drivers/scsi/sg.c
+++ b/drivers/scsi/sg.c
@@ -1497,7 +1497,7 @@ sg_add_device(struct device *cl_dev)
int error;
unsigned long iflags;
- error = scsi_device_get(scsidp);
+ error = blk_get_queue(scsidp->request_queue);
if (error)
return error;
@@ -1558,7 +1558,7 @@ cdev_add_err:
out:
if (cdev)
cdev_del(cdev);
- scsi_device_put(scsidp);
+ blk_put_queue(scsidp->request_queue);
return error;
}
@@ -1575,7 +1575,7 @@ sg_device_destroy(struct kref *kref)
*/
blk_trace_remove(q);
- scsi_device_put(sdp->device);
+ blk_put_queue(q);
write_lock_irqsave(&sg_index_lock, flags);
idr_remove(&sg_index_idr, sdp->index);