Commit 2a64fb0e authored by Alex Elder's avatar Alex Elder Committed by Greg Kroah-Hartman

greybus: manifest: clean up properly when parsing bundles

Currently, if an error occurs creating a bundle, we simply
return an error without cleaning up any of the bundles that
had already been successfully set up.

Add code to destroy bundles that have been created in the event
an error occurs.  Add a check to ensure the interface's list of
bundles was empty before parsing for bundles begins.
Signed-off-by: default avatarAlex Elder <elder@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@google.com>
parent fe53b45c
......@@ -256,11 +256,15 @@ static u32 gb_manifest_parse_bundles(struct gb_interface *intf)
{
struct manifest_desc *desc;
struct manifest_desc *next;
struct gb_bundle *bundle;
struct gb_bundle *bundle_next;
u32 count = 0;
if (WARN_ON(!list_empty(&intf->bundles)))
return 0;
list_for_each_entry_safe(desc, next, &intf->manifest_descs, links) {
struct greybus_descriptor_bundle *desc_bundle;
struct gb_bundle *bundle;
if (desc->type != GREYBUS_TYPE_BUNDLE)
continue;
......@@ -270,11 +274,11 @@ static u32 gb_manifest_parse_bundles(struct gb_interface *intf)
bundle = gb_bundle_create(intf, desc_bundle->id,
desc_bundle->class);
if (!bundle)
return 0; /* Error */
goto cleanup;
/* Now go set up this bundle's functions and cports */
if (!gb_manifest_parse_cports(bundle))
return 0; /* Error parsing cports */
goto cleanup;
count++;
......@@ -283,6 +287,13 @@ static u32 gb_manifest_parse_bundles(struct gb_interface *intf)
}
return count;
cleanup:
/* An error occurred; undo any changes we've made */
list_for_each_entry_safe(bundle, bundle_next, &intf->bundles, links) {
gb_bundle_destroy(bundle);
count--;
}
return 0; /* Error; count should also be 0 */
}
static bool gb_manifest_parse_interface(struct gb_interface *intf,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment