[PATCH v2 1/6] ACPI: dock: clean up error handling paths in dock_add()

From: Alex Chiang
Date: Wed Oct 14 2009 - 18:47:33 EST


Remove some copy/paste code in our error handling paths, which makes
the function smaller and slightly easier to read.

Signed-off-by: Alex Chiang <achiang@xxxxxx>
---

drivers/acpi/dock.c | 75 +++++++++++++++++++--------------------------------
1 files changed, 28 insertions(+), 47 deletions(-)

diff --git a/drivers/acpi/dock.c b/drivers/acpi/dock.c
index 7338b6a..642c7dd 100644
--- a/drivers/acpi/dock.c
+++ b/drivers/acpi/dock.c
@@ -968,11 +968,9 @@ static int dock_add(acpi_handle handle)
platform_device_register_simple(dock_device_name,
dock_station_count, NULL, 0);
dock_device = dock_station->dock_device;
- if (IS_ERR(dock_device)) {
- kfree(dock_station);
- dock_station = NULL;
- return PTR_ERR(dock_device);
- }
+ ret = IS_ERR(dock_device) ? PTR_ERR(dock_device) : 0;
+ if (ret)
+ goto out;
platform_device_add_data(dock_device, &dock_station,
sizeof(struct dock_station *));

@@ -987,46 +985,24 @@ static int dock_add(acpi_handle handle)
dock_station->flags |= DOCK_IS_BAT;

ret = device_create_file(&dock_device->dev, &dev_attr_docked);
- if (ret) {
- printk(KERN_ERR "Error %d adding sysfs file\n", ret);
- platform_device_unregister(dock_device);
- kfree(dock_station);
- dock_station = NULL;
- return ret;
- }
+ if (ret)
+ goto err_unregister;
+
ret = device_create_file(&dock_device->dev, &dev_attr_undock);
- if (ret) {
- printk(KERN_ERR "Error %d adding sysfs file\n", ret);
- device_remove_file(&dock_device->dev, &dev_attr_docked);
- platform_device_unregister(dock_device);
- kfree(dock_station);
- dock_station = NULL;
- return ret;
- }
+ if (ret)
+ goto err_unregister1;
+
ret = device_create_file(&dock_device->dev, &dev_attr_uid);
- if (ret) {
- printk(KERN_ERR "Error %d adding sysfs file\n", ret);
- device_remove_file(&dock_device->dev, &dev_attr_docked);
- device_remove_file(&dock_device->dev, &dev_attr_undock);
- platform_device_unregister(dock_device);
- kfree(dock_station);
- dock_station = NULL;
- return ret;
- }
+ if (ret)
+ goto err_unregister2;
+
ret = device_create_file(&dock_device->dev, &dev_attr_flags);
- if (ret) {
- printk(KERN_ERR "Error %d adding sysfs file\n", ret);
- device_remove_file(&dock_device->dev, &dev_attr_docked);
- device_remove_file(&dock_device->dev, &dev_attr_undock);
- device_remove_file(&dock_device->dev, &dev_attr_uid);
- platform_device_unregister(dock_device);
- kfree(dock_station);
- dock_station = NULL;
- return ret;
- }
+ if (ret)
+ goto err_unregister3;
+
ret = device_create_file(&dock_device->dev, &dev_attr_type);
if (ret)
- printk(KERN_ERR"Error %d adding sysfs file\n", ret);
+ goto err_unregister4;

/* Find dependent devices */
acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
@@ -1036,10 +1012,8 @@ static int dock_add(acpi_handle handle)
/* add the dock station as a device dependent on itself */
dd = alloc_dock_dependent_device(handle);
if (!dd) {
- kfree(dock_station);
- dock_station = NULL;
ret = -ENOMEM;
- goto dock_add_err_unregister;
+ goto err_unregister5;
}
add_dock_dependent_device(dock_station, dd);

@@ -1047,13 +1021,20 @@ static int dock_add(acpi_handle handle)
list_add(&dock_station->sibling, &dock_stations);
return 0;

-dock_add_err_unregister:
+err_unregister5:
device_remove_file(&dock_device->dev, &dev_attr_type);
- device_remove_file(&dock_device->dev, &dev_attr_docked);
- device_remove_file(&dock_device->dev, &dev_attr_undock);
- device_remove_file(&dock_device->dev, &dev_attr_uid);
+err_unregister4:
device_remove_file(&dock_device->dev, &dev_attr_flags);
+err_unregister3:
+ device_remove_file(&dock_device->dev, &dev_attr_uid);
+err_unregister2:
+ device_remove_file(&dock_device->dev, &dev_attr_undock);
+err_unregister1:
+ device_remove_file(&dock_device->dev, &dev_attr_docked);
+err_unregister:
+ printk(KERN_ERR "%s encountered error %d\n", __func__, ret);
platform_device_unregister(dock_device);
+out:
kfree(dock_station);
dock_station = NULL;
return ret;

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/