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


Reply via email to