diff options
| author | Holger Macht <hmacht@suse.de> | 2008-06-09 19:22:24 -0400 |
|---|---|---|
| committer | Len Brown <len.brown@intel.com> | 2008-06-11 19:13:47 -0400 |
| commit | 7efd52a407bed6a2b02015b8ebbff7beba155392 (patch) | |
| tree | c4cd8287c5434236465e3de7c91ed4957bd1c290 | |
| parent | 1fdd68608614cd1e951fd93873fe5597374e8c54 (diff) | |
bay: exit if notify handler cannot be installed
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>
| -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 d2fc94161848..26038c2a2a71 100644 --- a/drivers/acpi/bay.c +++ b/drivers/acpi/bay.c | |||
| @@ -301,16 +301,20 @@ static int bay_add(acpi_handle handle, int id) | |||
| 301 | */ | 301 | */ |
| 302 | pdev->dev.uevent_suppress = 0; | 302 | pdev->dev.uevent_suppress = 0; |
| 303 | 303 | ||
| 304 | if (acpi_bay_add_fs(new_bay)) { | ||
| 305 | platform_device_unregister(new_bay->pdev); | ||
| 306 | goto bay_add_err; | ||
| 307 | } | ||
| 308 | |||
| 309 | /* register for events on this device */ | 304 | /* register for events on this device */ |
| 310 | status = acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY, | 305 | status = acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY, |
| 311 | bay_notify, new_bay); | 306 | bay_notify, new_bay); |
| 312 | if (ACPI_FAILURE(status)) { | 307 | if (ACPI_FAILURE(status)) { |
| 313 | printk(KERN_ERR PREFIX "Error installing bay notify handler\n"); | 308 | printk(KERN_INFO PREFIX "Error installing bay notify handler\n"); |
| 309 | platform_device_unregister(new_bay->pdev); | ||
| 310 | goto bay_add_err; | ||
| 311 | } | ||
| 312 | |||
| 313 | if (acpi_bay_add_fs(new_bay)) { | ||
| 314 | acpi_remove_notify_handler(handle, ACPI_SYSTEM_NOTIFY, | ||
| 315 | bay_notify); | ||
| 316 | platform_device_unregister(new_bay->pdev); | ||
| 317 | goto bay_add_err; | ||
| 314 | } | 318 | } |
| 315 | 319 | ||
| 316 | /* if we are on a dock station, we should register for dock | 320 | /* if we are on a dock station, we should register for dock |
