From 9ade6d312287fd1729a02e349f5f23483ffc4e1c Mon Sep 17 00:00:00 2001 From: Alex Elder Date: Thu, 7 May 2015 13:00:20 -0500 Subject: [PATCH] greybus: battery: free struct on error in caller When a battery connection is initialized, a gb_battery structure for it is allocated in gb_battery_connection_init(). Currently that function ends by calling init_and_register(); in the event an error occurs, init_and_register() is responsible for freeing the allocated gb_battery structure. Make the code a bit better balanced by having the function that allocates the structure be responsible for freeing it in case of error. Signed-off-by: Alex Elder Signed-off-by: Greg Kroah-Hartman --- drivers/staging/greybus/battery.c | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/drivers/staging/greybus/battery.c b/drivers/staging/greybus/battery.c index eb688c9e821a..c815338ba307 100644 --- a/drivers/staging/greybus/battery.c +++ b/drivers/staging/greybus/battery.c @@ -299,8 +299,6 @@ static enum power_supply_property battery_props[] = { static int init_and_register(struct gb_connection *connection, struct gb_battery *gb) { - int retval; - // FIXME - get a better (i.e. unique) name // FIXME - anything else needs to be set? gb->bat.name = "gb_battery"; @@ -309,18 +307,13 @@ static int init_and_register(struct gb_connection *connection, gb->bat.num_properties = ARRAY_SIZE(battery_props); gb->bat.get_property = get_property; - retval = power_supply_register(&connection->bundle->intf->dev, - &gb->bat); - if (retval) - kfree(gb); - return retval; + return power_supply_register(&connection->bundle->intf->dev, &gb->bat); } #else static int init_and_register(struct gb_connection *connection, struct gb_battery *gb) { struct power_supply_config cfg = {}; - int retval = 0; cfg.drv_data = gb; @@ -334,11 +327,10 @@ static int init_and_register(struct gb_connection *connection, gb->bat = power_supply_register(&connection->bundle->intf->dev, &gb->desc, &cfg); - if (IS_ERR(gb->bat)) { - retval = PTR_ERR(gb->bat); - kfree(gb); - } - return retval; + if (IS_ERR(gb->bat)) + return PTR_ERR(gb->bat); + + return 0; } #endif @@ -356,12 +348,14 @@ static int gb_battery_connection_init(struct gb_connection *connection) /* Check the version */ retval = get_version(gb); - if (retval) { + if (retval) + goto out; + retval = init_and_register(connection, gb); +out: + if (retval) kfree(gb); - return retval; - } - return init_and_register(connection, gb); + return retval; } static void gb_battery_connection_exit(struct gb_connection *connection) -- 2.39.5