scsi: scsi_dh: suppress errors from unsupported devices
authorHannes Reinecke <hare@suse.de>
Wed, 20 Sep 2017 07:18:52 +0000 (09:18 +0200)
committerMartin K. Petersen <martin.petersen@oracle.com>
Mon, 25 Sep 2017 23:03:22 +0000 (19:03 -0400)
Device handlers are optional, and for some handlers like ALUA only
implemented for certain device types.  So suppress any errors for
unsupported devices.

Signed-off-by: Hannes Reinecke <hare@suse.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/scsi_dh.c
drivers/scsi/scsi_priv.h
drivers/scsi/scsi_sysfs.c

index ac798d284a7e8131d3240fb01180fe93677779dd..2b785d09d5bdaf37832113488d3b4ed96a66a737 100644 (file)
@@ -140,12 +140,17 @@ static int scsi_dh_handler_attach(struct scsi_device *sdev,
                case SCSI_DH_RES_TEMP_UNAVAIL:
                        ret = -EAGAIN;
                        break;
+               case SCSI_DH_DEV_UNSUPP:
+               case SCSI_DH_NOSYS:
+                       ret = -ENODEV;
+                       break;
                default:
                        ret = -EINVAL;
                        break;
                }
-               sdev_printk(KERN_ERR, sdev, "%s: Attach failed (%d)\n",
-                           scsi_dh->name, error);
+               if (ret != -ENODEV)
+                       sdev_printk(KERN_ERR, sdev, "%s: Attach failed (%d)\n",
+                                   scsi_dh->name, error);
                module_put(scsi_dh->module);
        } else
                sdev->handler = scsi_dh;
@@ -164,18 +169,20 @@ static void scsi_dh_handler_detach(struct scsi_device *sdev)
        module_put(sdev->handler->module);
 }
 
-int scsi_dh_add_device(struct scsi_device *sdev)
+void scsi_dh_add_device(struct scsi_device *sdev)
 {
        struct scsi_device_handler *devinfo = NULL;
        const char *drv;
-       int err = 0;
 
        drv = scsi_dh_find_driver(sdev);
        if (drv)
                devinfo = __scsi_dh_lookup(drv);
+       /*
+        * device_handler is optional, so ignore errors
+        * from scsi_dh_handler_attach()
+        */
        if (devinfo)
-               err = scsi_dh_handler_attach(sdev, devinfo);
-       return err;
+               (void)scsi_dh_handler_attach(sdev, devinfo);
 }
 
 void scsi_dh_release_device(struct scsi_device *sdev)
index 5c6d016a5ae9b8f3dab21cb49789c7ef2255c047..9125e0162eed0aeca2a4301cae3a79e0c228debc 100644 (file)
@@ -176,10 +176,10 @@ extern struct async_domain scsi_sd_probe_domain;
 
 /* scsi_dh.c */
 #ifdef CONFIG_SCSI_DH
-int scsi_dh_add_device(struct scsi_device *sdev);
+void scsi_dh_add_device(struct scsi_device *sdev);
 void scsi_dh_release_device(struct scsi_device *sdev);
 #else
-static inline int scsi_dh_add_device(struct scsi_device *sdev) { return 0; }
+static inline void scsi_dh_add_device(struct scsi_device *sdev) { }
 static inline void scsi_dh_release_device(struct scsi_device *sdev) { }
 #endif
 static inline void scsi_dh_remove_device(struct scsi_device *sdev) { }
index bf53356f41f0639e7c0e70393d91337a2bed2880..cfc5e316f6cb98611aa4c234aae11987d55ba6ce 100644 (file)
@@ -1234,13 +1234,7 @@ int scsi_sysfs_add_sdev(struct scsi_device *sdev)
 
        scsi_autopm_get_device(sdev);
 
-       error = scsi_dh_add_device(sdev);
-       if (error)
-               /*
-                * device_handler is optional, so any error can be ignored
-                */
-               sdev_printk(KERN_INFO, sdev,
-                               "failed to add device handler: %d\n", error);
+       scsi_dh_add_device(sdev);
 
        error = device_add(&sdev->sdev_gendev);
        if (error) {