ACPI video: Don't start video device until its associated input device has been allocated
authorIgor Murzov <intergalactic.anonymous@gmail.com>
Fri, 30 Mar 2012 17:32:09 +0000 (21:32 +0400)
committerLen Brown <len.brown@intel.com>
Fri, 30 Mar 2012 19:47:52 +0000 (15:47 -0400)
Quoth Dmitry Torokhov:
In addition to bus notifier we do install device notifier explicitly
so it might fire up early. The easiest fox would be to move
acpi_video_bus_start_devices() after input_allocate_device() but
before input_register_device() - unregistered input devices can handle
input_event() calls just fine.

May fix crashes reported in:
https://bugzilla.kernel.org/show_bug.cgi?id=40672

Signed-off-by: Igor Murzov <e-mail@date.by>
Signed-off-by: Len Brown <len.brown@intel.com>
drivers/acpi/video.c

index 462486b9f9b2885e9972f5a5a709af87aafa2d86..9577b6fa26507cad1db1f2ddf7d6f114abfdf513 100644 (file)
@@ -1658,16 +1658,17 @@ static int acpi_video_bus_add(struct acpi_device *device)
        error = acpi_video_bus_get_devices(video, device);
        if (error)
                goto err_free_video;
-       error = acpi_video_bus_start_devices(video);
-       if (error)
-               goto err_put_video;
 
        video->input = input = input_allocate_device();
        if (!input) {
                error = -ENOMEM;
-               goto err_stop_video;
+               goto err_put_video;
        }
 
+       error = acpi_video_bus_start_devices(video);
+       if (error)
+               goto err_free_input_dev;
+
        snprintf(video->phys, sizeof(video->phys),
                "%s/video/input0", acpi_device_hid(video->device));
 
@@ -1688,7 +1689,7 @@ static int acpi_video_bus_add(struct acpi_device *device)
 
        error = input_register_device(input);
        if (error)
-               goto err_free_input_dev;
+               goto err_stop_video;
 
        printk(KERN_INFO PREFIX "%s [%s] (multi-head: %s  rom: %s  post: %s)\n",
               ACPI_VIDEO_DEVICE_NAME, acpi_device_bid(device),
@@ -1706,10 +1707,10 @@ static int acpi_video_bus_add(struct acpi_device *device)
 
  err_unregister_input_dev:
        input_unregister_device(input);
- err_free_input_dev:
-       input_free_device(input);
  err_stop_video:
        acpi_video_bus_stop_devices(video);
+ err_free_input_dev:
+       input_free_device(input);
  err_put_video:
        acpi_video_bus_put_devices(video);
        kfree(video->attached_array);