ACPI / scan: Fix acpi_bus_id_list bookkeeping
authorLukas Wunner <lukas@wunner.de>
Wed, 25 Nov 2015 20:19:55 +0000 (21:19 +0100)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 9 Dec 2015 00:30:26 +0000 (01:30 +0100)
acpi_device_add() allocates and adds an element to acpi_bus_id_list
(or increments the instance count if the device's HID is already
present in the list), but the element is never deleted from the list
nor freed. Fix it.

Signed-off-by: Lukas Wunner <lukas@wunner.de>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/scan.c

index ddfed0d..be1fc12 100644 (file)
@@ -471,10 +471,24 @@ static void acpi_device_release(struct device *dev)
 
 static void acpi_device_del(struct acpi_device *device)
 {
+       struct acpi_device_bus_id *acpi_device_bus_id;
+
        mutex_lock(&acpi_device_lock);
        if (device->parent)
                list_del(&device->node);
 
+       list_for_each_entry(acpi_device_bus_id, &acpi_bus_id_list, node)
+               if (!strcmp(acpi_device_bus_id->bus_id,
+                           acpi_device_hid(device))) {
+                       if (acpi_device_bus_id->instance_no > 0)
+                               acpi_device_bus_id->instance_no--;
+                       else {
+                               list_del(&acpi_device_bus_id->node);
+                               kfree(acpi_device_bus_id);
+                       }
+                       break;
+               }
+
        list_del(&device->wakeup_list);
        mutex_unlock(&acpi_device_lock);