diff options
author | Holger Macht <hmacht@suse.de> | 2008-06-09 16:22:24 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2008-08-06 10:11:02 -0700 |
commit | f5be80be9238a5202efaefbb3469fe0bd4219d7e (patch) | |
tree | 5418ead92d7a9272881201867460ce59a06dab95 | |
parent | e70106f86bfd6b7209889373a20b3bc7a57b773c (diff) | |
download | lwn-f5be80be9238a5202efaefbb3469fe0bd4219d7e.tar.gz lwn-f5be80be9238a5202efaefbb3469fe0bd4219d7e.zip |
bay: exit if notify handler cannot be installed
commit 7efd52a407bed6a2b02015b8ebbff7beba155392 upstream
If acpi_install_notify_handler() for a bay device fails, the bay driver is
superfluous. Most likely, another driver (like libata) is already caring
about this device anyway. Furthermore,
register_hotplug_dock_device(acpi_handle) from the dock driver must not be
called twice with the same handler. This would result in an endless loop
consuming 100% of CPU. So clean up and exit.
Signed-off-by: Holger Macht <hmacht@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Len Brown <len.brown@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | drivers/acpi/bay.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/drivers/acpi/bay.c b/drivers/acpi/bay.c index 1fa86811b8ee..a845062e7fde 100644 --- a/drivers/acpi/bay.c +++ b/drivers/acpi/bay.c @@ -299,16 +299,20 @@ static int bay_add(acpi_handle handle, int id) */ pdev->dev.uevent_suppress = 0; - if (acpi_bay_add_fs(new_bay)) { - platform_device_unregister(new_bay->pdev); - goto bay_add_err; - } - /* register for events on this device */ status = acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY, bay_notify, new_bay); if (ACPI_FAILURE(status)) { - printk(KERN_ERR PREFIX "Error installing bay notify handler\n"); + printk(KERN_INFO PREFIX "Error installing bay notify handler\n"); + platform_device_unregister(new_bay->pdev); + goto bay_add_err; + } + + if (acpi_bay_add_fs(new_bay)) { + acpi_remove_notify_handler(handle, ACPI_SYSTEM_NOTIFY, + bay_notify); + platform_device_unregister(new_bay->pdev); + goto bay_add_err; } /* if we are on a dock station, we should register for dock |