Skip to content

Commit

Permalink
sd: use __register_blkdev to avoid a modprobe for an unregistered dev_t
Browse files Browse the repository at this point in the history
Switch from using blk_register_region to the probe callback passed to
__register_blkdev to disable the request_module call for an unclaimed
dev_t in the SD majors.

Signed-off-by: Christoph Hellwig <[email protected]>
Reviewed-by: Hannes Reinecke <[email protected]>
Acked-by: Martin K. Petersen <[email protected]>
Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
Christoph Hellwig authored and axboe committed Nov 16, 2020
1 parent f9550f1 commit 996e509
Showing 1 changed file with 5 additions and 14 deletions.
19 changes: 5 additions & 14 deletions drivers/scsi/sd.c
Original file line number Diff line number Diff line change
Expand Up @@ -630,13 +630,11 @@ static struct scsi_driver sd_template = {
};

/*
* Dummy kobj_map->probe function.
* The default ->probe function will call modprobe, which is
* pointless as this module is already loaded.
* Don't request a new module, as that could deadlock in multipath
* environment.
*/
static struct kobject *sd_default_probe(dev_t devt, int *partno, void *data)
static void sd_default_probe(dev_t devt)
{
return NULL;
}

/*
Expand Down Expand Up @@ -3528,9 +3526,6 @@ static int sd_remove(struct device *dev)

free_opal_dev(sdkp->opal_dev);

blk_register_region(devt, SD_MINORS, NULL,
sd_default_probe, NULL, NULL);

mutex_lock(&sd_ref_mutex);
dev_set_drvdata(dev, NULL);
put_device(&sdkp->dev);
Expand Down Expand Up @@ -3720,11 +3715,9 @@ static int __init init_sd(void)
SCSI_LOG_HLQUEUE(3, printk("init_sd: sd driver entry point\n"));

for (i = 0; i < SD_MAJORS; i++) {
if (register_blkdev(sd_major(i), "sd") != 0)
if (__register_blkdev(sd_major(i), "sd", sd_default_probe))
continue;
majors++;
blk_register_region(sd_major(i), SD_MINORS, NULL,
sd_default_probe, NULL, NULL);
}

if (!majors)
Expand Down Expand Up @@ -3797,10 +3790,8 @@ static void __exit exit_sd(void)

class_unregister(&sd_disk_class);

for (i = 0; i < SD_MAJORS; i++) {
blk_unregister_region(sd_major(i), SD_MINORS);
for (i = 0; i < SD_MAJORS; i++)
unregister_blkdev(sd_major(i), "sd");
}
}

module_init(init_sd);
Expand Down

0 comments on commit 996e509

Please sign in to comment.