scsi: drivers: base: Propagate errors through the transport component
authorGabriel Krisman Bertazi <krisman@collabora.com>
Mon, 6 Jan 2020 18:58:16 +0000 (13:58 -0500)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 16 Jan 2020 03:55:37 +0000 (22:55 -0500)
The transport registration may fail.  Make sure the errors are propagated
to the callers.

Link: https://lore.kernel.org/r/20200106185817.640331-3-krisman@collabora.com
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/base/transport_class.c
include/linux/transport_class.h

index 5ed86ded6e6b61a813acbd876e814c6f43607fe7..ccc86206e5087f200e0d29fcf00b1d20b5f81320 100644 (file)
 #include <linux/attribute_container.h>
 #include <linux/transport_class.h>
 
+static int transport_remove_classdev(struct attribute_container *cont,
+                                    struct device *dev,
+                                    struct device *classdev);
+
 /**
  * transport_class_register - register an initial transport class
  *
@@ -172,10 +176,11 @@ static int transport_add_class_device(struct attribute_container *cont,
  * routine is simply a trigger point used to add the device to the
  * system and register attributes for it.
  */
-
-void transport_add_device(struct device *dev)
+int transport_add_device(struct device *dev)
 {
-       attribute_container_device_trigger(dev, transport_add_class_device);
+       return attribute_container_device_trigger_safe(dev,
+                                       transport_add_class_device,
+                                       transport_remove_classdev);
 }
 EXPORT_SYMBOL_GPL(transport_add_device);
 
index a9c59761927b720ef22888150a91cce0fe80213c..63076fb835e34244b3792948fb573ca4e463a2a6 100644 (file)
@@ -62,16 +62,16 @@ struct transport_container {
        container_of(x, struct transport_container, ac)
 
 void transport_remove_device(struct device *);
-void transport_add_device(struct device *);
+int transport_add_device(struct device *);
 void transport_setup_device(struct device *);
 void transport_configure_device(struct device *);
 void transport_destroy_device(struct device *);
 
-static inline void
+static inline int
 transport_register_device(struct device *dev)
 {
        transport_setup_device(dev);
-       transport_add_device(dev);
+       return transport_add_device(dev);
 }
 
 static inline void