aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/attribute_container.h
diff options
context:
space:
mode:
authorGabriel Krisman Bertazi <krisman@collabora.com>2020-01-06 13:58:15 -0500
committerMartin K. Petersen <martin.petersen@oracle.com>2020-01-15 22:55:36 -0500
commit7c1ef338705fb5c53e6f574ae5eb19fdfacb3d26 (patch)
tree7f06aa8f71974f41bc720375382d1dfb77eb9ff6 /include/linux/attribute_container.h
parentscsi: iscsi: Don't destroy session if there are outstanding connections (diff)
downloadlinux-dev-7c1ef338705fb5c53e6f574ae5eb19fdfacb3d26.tar.xz
linux-dev-7c1ef338705fb5c53e6f574ae5eb19fdfacb3d26.zip
scsi: drivers: base: Support atomic version of attribute_container_device_trigger
attribute_container_device_trigger invokes callbacks that may fail for one or more classdevs, for instance, the transport_add_class_device callback, called during transport creation, does memory allocation. This information, though, is not propagated to upper layers, and any driver using the attribute_container_device_trigger API will not know whether any, some, or all callbacks succeeded. This patch implements a safe version of this dispatcher, to either succeed all the callbacks or revert to the original state. Link: https://lore.kernel.org/r/20200106185817.640331-2-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>
Diffstat (limited to 'include/linux/attribute_container.h')
-rw-r--r--include/linux/attribute_container.h7
1 files changed, 7 insertions, 0 deletions
diff --git a/include/linux/attribute_container.h b/include/linux/attribute_container.h
index d12bb2153cd6..e4004d1e6725 100644
--- a/include/linux/attribute_container.h
+++ b/include/linux/attribute_container.h
@@ -54,6 +54,13 @@ void attribute_container_device_trigger(struct device *dev,
int (*fn)(struct attribute_container *,
struct device *,
struct device *));
+int attribute_container_device_trigger_safe(struct device *dev,
+ int (*fn)(struct attribute_container *,
+ struct device *,
+ struct device *),
+ int (*undo)(struct attribute_container *,
+ struct device *,
+ struct device *));
void attribute_container_trigger(struct device *dev,
int (*fn)(struct attribute_container *,
struct device *));