Add a new class, sd_mpath_disk_class, which is the multipath version of the scsi_disk class.
Structure sd_mpath_disk is introduced to manage the mpath_disk. Signed-off-by: John Garry <[email protected]> --- drivers/scsi/sd.c | 43 ++++++++++++++++++++++++++++++++++++++++++- drivers/scsi/sd.h | 3 +++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index cea3ab54c4417..222e28ed44e9b 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -70,6 +70,7 @@ #include <scsi/scsi_ioctl.h> #include <scsi/scsicam.h> #include <scsi/scsi_common.h> +#include <scsi/scsi_multipath.h> #include "sd.h" #include "scsi_priv.h" @@ -115,6 +116,39 @@ static DEFINE_IDA(sd_index_ida); static mempool_t *sd_page_pool; static struct lock_class_key sd_bio_compl_lkclass; +#ifdef CONFIG_SCSI_MULTIPATH +struct sd_mpath_disk { + struct mpath_disk *mpath_disk; +}; + +static void sd_mpath_disk_release(struct device *dev) +{ +} + +static const struct class sd_mpath_disk_class = { + .name = "scsi_mpath_disk", + .dev_release = sd_mpath_disk_release, +}; + +static int sd_mpath_class_register(void) +{ + return class_register(&sd_mpath_disk_class); +} + +static void sd_mpath_class_unregister(void) +{ + class_unregister(&sd_mpath_disk_class); +} +#else /* CONFIG_SCSI_MULTIPATH */ +static int sd_mpath_class_register(void) +{ + return 0; +} + +static void sd_mpath_class_unregister(void) +{ +} +#endif static const char *sd_cache_types[] = { "write through", "none", "write back", @@ -4464,11 +4498,15 @@ static int __init init_sd(void) if (err) goto err_out; + err = sd_mpath_class_register(); + if (err) + goto err_out_class; + sd_page_pool = mempool_create_page_pool(SD_MEMPOOL_SIZE, 0); if (!sd_page_pool) { printk(KERN_ERR "sd: can't init discard page pool\n"); err = -ENOMEM; - goto err_out_class; + goto err_out_mpath_class; } err = scsi_register_driver(&sd_template.gendrv); @@ -4479,6 +4517,8 @@ static int __init init_sd(void) err_out_driver: mempool_destroy(sd_page_pool); +err_out_mpath_class: + sd_mpath_class_unregister(); err_out_class: class_unregister(&sd_disk_class); err_out: @@ -4502,6 +4542,7 @@ static void __exit exit_sd(void) mempool_destroy(sd_page_pool); class_unregister(&sd_disk_class); + sd_mpath_class_unregister(); for (i = 0; i < SD_MAJORS; i++) unregister_blkdev(sd_major(i), "sd"); diff --git a/drivers/scsi/sd.h b/drivers/scsi/sd.h index 574af82430169..304b24644d942 100644 --- a/drivers/scsi/sd.h +++ b/drivers/scsi/sd.h @@ -83,6 +83,9 @@ struct zoned_disk_info { struct scsi_disk { struct scsi_device *device; + #ifdef CONFIG_SCSI_MULTIPATH + struct sd_mpath_disk *sd_mpath_disk; + #endif /* * disk_dev is used to show attributes in /sys/class/scsi_disk/, -- 2.43.5

