dm-mpath, scsi_dh: request scsi_dh modules in scsi_dh, not dm-mpath
authorChristoph Hellwig <hch@lst.de>
Thu, 27 Aug 2015 12:16:55 +0000 (14:16 +0200)
committerJames Bottomley <JBottomley@Odin.com>
Fri, 28 Aug 2015 20:14:55 +0000 (13:14 -0700)
This way we can reused the same code any attachment method, not just those
requested from dm-mpath.

[jejb: fixup checkpatch error]
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Acked-by: Mike Snitzer <snitzer@redhat.com>
Signed-off-by: James Bottomley <JBottomley@Odin.com>
drivers/md/dm-mpath.c
drivers/scsi/device_handler/scsi_dh.c
include/scsi/scsi_dh.h

index a9f58fdb5d69d2461f155b1b316c3cb0624d788c..5a67671a3973b576a9bdcc8dabc576448336b9ba 100644 (file)
@@ -725,12 +725,6 @@ static int parse_hw_handler(struct dm_arg_set *as, struct multipath *m)
                return 0;
 
        m->hw_handler_name = kstrdup(dm_shift_arg(as), GFP_KERNEL);
-       if (!try_then_request_module(scsi_dh_handler_exist(m->hw_handler_name),
-                                    "scsi_dh_%s", m->hw_handler_name)) {
-               ti->error = "unknown hardware handler type";
-               ret = -EINVAL;
-               goto fail;
-       }
 
        if (hw_argc > 1) {
                char *p;
index 869b5bd1ad252243d0133c3da35681a13fb6ecee..3dfef5b0d298f9a8f16c6517ce680c3a0ca169e0 100644 (file)
@@ -29,7 +29,7 @@
 static DEFINE_SPINLOCK(list_lock);
 static LIST_HEAD(scsi_dh_list);
 
-static struct scsi_device_handler *get_device_handler(const char *name)
+static struct scsi_device_handler *__scsi_dh_lookup(const char *name)
 {
        struct scsi_device_handler *tmp, *found = NULL;
 
@@ -44,6 +44,19 @@ static struct scsi_device_handler *get_device_handler(const char *name)
        return found;
 }
 
+static struct scsi_device_handler *scsi_dh_lookup(const char *name)
+{
+       struct scsi_device_handler *dh;
+
+       dh = __scsi_dh_lookup(name);
+       if (!dh) {
+               request_module(name);
+               dh = __scsi_dh_lookup(name);
+       }
+
+       return dh;
+}
+
 /*
  * device_handler_match_function - Match a device handler to a device
  * @sdev - SCSI device to be tested
@@ -158,7 +171,8 @@ store_dh_state(struct device *dev, struct device_attribute *attr,
                /*
                 * Attach to a device handler
                 */
-               if (!(scsi_dh = get_device_handler(buf)))
+               scsi_dh = scsi_dh_lookup(buf);
+               if (!scsi_dh)
                        return err;
                err = scsi_dh_handler_attach(sdev, scsi_dh);
        } else {
@@ -322,8 +336,7 @@ static int scsi_dh_notifier_remove(struct device *dev, void *data)
  */
 int scsi_register_device_handler(struct scsi_device_handler *scsi_dh)
 {
-
-       if (get_device_handler(scsi_dh->name))
+       if (__scsi_dh_lookup(scsi_dh->name))
                return -EBUSY;
 
        if (!scsi_dh->attach || !scsi_dh->detach)
@@ -350,7 +363,7 @@ EXPORT_SYMBOL_GPL(scsi_register_device_handler);
 int scsi_unregister_device_handler(struct scsi_device_handler *scsi_dh)
 {
 
-       if (!get_device_handler(scsi_dh->name))
+       if (!__scsi_dh_lookup(scsi_dh->name))
                return -ENODEV;
 
        bus_for_each_dev(&scsi_bus_type, NULL, scsi_dh,
@@ -454,17 +467,6 @@ int scsi_dh_set_params(struct request_queue *q, const char *params)
 }
 EXPORT_SYMBOL_GPL(scsi_dh_set_params);
 
-/*
- * scsi_dh_handler_exist - Return TRUE(1) if a device handler exists for
- *     the given name. FALSE(0) otherwise.
- * @name - name of the device handler.
- */
-int scsi_dh_handler_exist(const char *name)
-{
-       return (get_device_handler(name) != NULL);
-}
-EXPORT_SYMBOL_GPL(scsi_dh_handler_exist);
-
 /*
  * scsi_dh_attach - Attach device handler
  * @q - Request queue that is associated with the scsi_device
@@ -478,7 +480,7 @@ int scsi_dh_attach(struct request_queue *q, const char *name)
        struct scsi_device_handler *scsi_dh;
        int err = 0;
 
-       scsi_dh = get_device_handler(name);
+       scsi_dh = scsi_dh_lookup(name);
        if (!scsi_dh)
                return -EINVAL;
 
index 99c9196fe606bbbec73e48fe15a92b158959ed4e..966b921135b599103a285e9ed9c7238a154d2337 100644 (file)
@@ -57,7 +57,6 @@ enum {
 };
 #if defined(CONFIG_SCSI_DH) || defined(CONFIG_SCSI_DH_MODULE)
 extern int scsi_dh_activate(struct request_queue *, activate_complete, void *);
-extern int scsi_dh_handler_exist(const char *);
 extern int scsi_dh_attach(struct request_queue *, const char *);
 extern const char *scsi_dh_attached_handler_name(struct request_queue *, gfp_t);
 extern int scsi_dh_set_params(struct request_queue *, const char *);
@@ -68,10 +67,6 @@ static inline int scsi_dh_activate(struct request_queue *req,
        fn(data, 0);
        return 0;
 }
-static inline int scsi_dh_handler_exist(const char *name)
-{
-       return 0;
-}
 static inline int scsi_dh_attach(struct request_queue *req, const char *name)
 {
        return SCSI_DH_NOSYS;