asus_acpi: fix oops on non-asus machines
If asus_acpi_init doesn't find any device it knows about, it mistakenly returns a "success" error code even though it cleans up after itself. Later when trying to rmmod asus_acpi, the module_exit routine would try to clean up one more time and we would end up calling acpi_bus_unregister_driver(&asus_hotk_driver) twice. This patch addresses this first problem by returning -ENODEV when no appropriate device is found. Then there was also another bug with the code handling the return value of backlight_device_register. If this function ever failed, the driver would cleanup by calling the module_exit routine from module_init, but it would still return "success". So any attempt to rmmod this module would result in asus_acpi_exit being called twice but it's not ready to handle it (I haven't hit this bug, just found it by code inspection). This patch fixes that by inserting a return -ENODEV; at the end of this error handling path. Signed-off-by: Maxime Austruy <maxime@tralhalla.org> Cc: Len Brown <lenb@kernel.org> Cc: Richard Purdie <rpurdie@rpsys.net> Cc: Jan Engelhardt <jengelh@computergmbh.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
d80d021733
commit
5ebffd7c05
1 changed files with 2 additions and 1 deletions
|
@ -1398,7 +1398,7 @@ static int __init asus_acpi_init(void)
|
||||||
if (!asus_hotk_found) {
|
if (!asus_hotk_found) {
|
||||||
acpi_bus_unregister_driver(&asus_hotk_driver);
|
acpi_bus_unregister_driver(&asus_hotk_driver);
|
||||||
remove_proc_entry(PROC_ASUS, acpi_root_dir);
|
remove_proc_entry(PROC_ASUS, acpi_root_dir);
|
||||||
return result;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
asus_backlight_device = backlight_device_register("asus",NULL,NULL,
|
asus_backlight_device = backlight_device_register("asus",NULL,NULL,
|
||||||
|
@ -1407,6 +1407,7 @@ static int __init asus_acpi_init(void)
|
||||||
printk(KERN_ERR "Could not register asus backlight device\n");
|
printk(KERN_ERR "Could not register asus backlight device\n");
|
||||||
asus_backlight_device = NULL;
|
asus_backlight_device = NULL;
|
||||||
asus_acpi_exit();
|
asus_acpi_exit();
|
||||||
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
asus_backlight_device->props.max_brightness = 15;
|
asus_backlight_device->props.max_brightness = 15;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue