lkml.org 
[lkml]   [2008]   [Sep]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[PATCH] acer-wmi: add error checks in module_init
There are sevaral bugs in module_init and module_exit for acer-wmi.

- No error handlings for platform_device_alloc() and platform_device_add()

- acer_platform_device is not freeed in module_exit

This patch fixes these bugs by using platform_device_register_simple()
and platform_device_unregister() respectively.

This patch also makes create_sysfs() take a argument struct
platform_device pointer so that it looks symmetrical to remove_sysfs().

Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Cc: Carlos Corbacho <carlos@strangeworlds.co.uk>
---
drivers/misc/acer-wmi.c | 48 +++++++++++++++++++++++++++---------------------
1 file changed, 27 insertions(+), 21 deletions(-)

Index: 2.6-git/drivers/misc/acer-wmi.c
===================================================================
--- 2.6-git.orig/drivers/misc/acer-wmi.c
+++ 2.6-git/drivers/misc/acer-wmi.c
@@ -1129,40 +1129,36 @@ static int remove_sysfs(struct platform_
return 0;
}

-static int create_sysfs(void)
+static int create_sysfs(struct platform_device *device)
{
int retval = -ENOMEM;

if (has_cap(ACER_CAP_WIRELESS)) {
- retval = device_create_file(&acer_platform_device->dev,
- &dev_attr_wireless);
+ retval = device_create_file(&device->dev, &dev_attr_wireless);
if (retval)
goto error_sysfs;
}

if (has_cap(ACER_CAP_BLUETOOTH)) {
- retval = device_create_file(&acer_platform_device->dev,
- &dev_attr_bluetooth);
+ retval = device_create_file(&device->dev, &dev_attr_bluetooth);
if (retval)
goto error_sysfs;
}

if (has_cap(ACER_CAP_THREEG)) {
- retval = device_create_file(&acer_platform_device->dev,
- &dev_attr_threeg);
+ retval = device_create_file(&device->dev, &dev_attr_threeg);
if (retval)
goto error_sysfs;
}

- retval = device_create_file(&acer_platform_device->dev,
- &dev_attr_interface);
+ retval = device_create_file(&device->dev, &dev_attr_interface);
if (retval)
goto error_sysfs;

return 0;

error_sysfs:
- remove_sysfs(acer_platform_device);
+ remove_sysfs(device);
return retval;
}

@@ -1242,22 +1238,27 @@ static int __init acer_wmi_init(void)

set_quirks();

- 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;
+ return err;
+ }
+ acer_platform_device = platform_device_register_simple("acer-wmi", -1,
+ NULL, 0);
+ if (IS_ERR(acer_platform_device)) {
+ err = PTR_ERR(acer_platform_device);
+ goto out1;
}
- acer_platform_device = platform_device_alloc("acer-wmi", -1);
- platform_device_add(acer_platform_device);

- err = create_sysfs();
+ err = create_sysfs(acer_platform_device);
if (err)
- return err;
+ goto out2;

if (wmi_has_guid(WMID_GUID2)) {
interface->debug.wmid_devices = get_wmid_devices();
err = create_debugfs();
if (err)
- return err;
+ goto out3;
}

/* Override any initial settings with values from the commandline */
@@ -1265,19 +1266,24 @@ static int __init acer_wmi_init(void)

return 0;

-error_platform_register:
- return -ENODEV;
+out3:
+ remove_sysfs(acer_platform_device);
+out2:
+ platform_device_unregister(acer_platform_device);
+out1:
+ platform_driver_unregister(&acer_platform_driver);
+
+ return err;
}

static void __exit acer_wmi_exit(void)
{
remove_sysfs(acer_platform_device);
remove_debugfs();
- platform_device_del(acer_platform_device);
+ platform_device_unregister(acer_platform_device);
platform_driver_unregister(&acer_platform_driver);

printk(ACER_INFO "Acer Laptop WMI Extras unloaded\n");
- return;
}

module_init(acer_wmi_init);

\
 
 \ /
  Last update: 2008-09-21 16:33    [W:0.047 / U:1.488 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site