acer-wmi: fix resource reclaim in acer_wmi_init error path
authorAxel Lin <axel.lin@gmail.com>
Tue, 22 Jun 2010 08:17:38 +0000 (16:17 +0800)
committerMatthew Garrett <mjg@redhat.com>
Tue, 3 Aug 2010 13:48:48 +0000 (09:48 -0400)
This patch fixes the resource reclaim in acer_wmi_init error path.

Signed-off-by: Axel Lin <axel.lin@gmail.com>
Signed-off-by: Matthew Garrett <mjg@redhat.com>

drivers/platform/x86/acer-wmi.c

index 1ea6c43..ae79624 100644 (file)
@@ -1327,22 +1327,31 @@ static int __init acer_wmi_init(void)
                       "generic video driver\n");
        }
 
-       if (platform_driver_register(&acer_platform_driver)) {
+       err = platform_driver_register(&acer_platform_driver);
+       if (err) {
                printk(ACER_ERR "Unable to register platform driver.\n");
                goto error_platform_register;
        }
+
        acer_platform_device = platform_device_alloc("acer-wmi", -1);
-       platform_device_add(acer_platform_device);
+       if (!acer_platform_device) {
+               err = -ENOMEM;
+               goto error_device_alloc;
+       }
+
+       err = platform_device_add(acer_platform_device);
+       if (err)
+               goto error_device_add;
 
        err = create_sysfs();
        if (err)
-               return err;
+               goto error_create_sys;
 
        if (wmi_has_guid(WMID_GUID2)) {
                interface->debug.wmid_devices = get_wmid_devices();
                err = create_debugfs();
                if (err)
-                       return err;
+                       goto error_create_debugfs;
        }
 
        /* Override any initial settings with values from the commandline */
@@ -1350,8 +1359,16 @@ static int __init acer_wmi_init(void)
 
        return 0;
 
+error_create_debugfs:
+       remove_sysfs(acer_platform_device);
+error_create_sys:
+       platform_device_del(acer_platform_device);
+error_device_add:
+       platform_device_put(acer_platform_device);
+error_device_alloc:
+       platform_driver_unregister(&acer_platform_driver);
 error_platform_register:
-       return -ENODEV;
+       return err;
 }
 
 static void __exit acer_wmi_exit(void)