diff options
author | Gabriel Krisman Bertazi <krisman@collabora.com> | 2020-01-06 19:58:16 +0100 |
---|---|---|
committer | Martin K. Petersen <martin.petersen@oracle.com> | 2020-01-16 04:55:37 +0100 |
commit | cd7ea70bb00aac8f7ab1b0635edc669e12f53891 (patch) | |
tree | 6c25bbfce78677254849f1dc52bd4f506d9b8b64 | |
parent | scsi: drivers: base: Support atomic version of attribute_container_device_tri... (diff) | |
download | linux-cd7ea70bb00aac8f7ab1b0635edc669e12f53891.tar.xz linux-cd7ea70bb00aac8f7ab1b0635edc669e12f53891.zip |
scsi: drivers: base: Propagate errors through the transport component
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>
-rw-r--r-- | drivers/base/transport_class.c | 11 | ||||
-rw-r--r-- | include/linux/transport_class.h | 6 |
2 files changed, 11 insertions, 6 deletions
diff --git a/drivers/base/transport_class.c b/drivers/base/transport_class.c index 5ed86ded6e6b..ccc86206e508 100644 --- a/drivers/base/transport_class.c +++ b/drivers/base/transport_class.c @@ -30,6 +30,10 @@ #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); diff --git a/include/linux/transport_class.h b/include/linux/transport_class.h index a9c59761927b..63076fb835e3 100644 --- a/include/linux/transport_class.h +++ b/include/linux/transport_class.h @@ -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 |