diff options
Diffstat (limited to 'drivers/acpi/pci_root.c')
| -rw-r--r-- | drivers/acpi/pci_root.c | 9 | 
1 files changed, 7 insertions, 2 deletions
diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c index 0ac546d5e53..5ff17306612 100644 --- a/drivers/acpi/pci_root.c +++ b/drivers/acpi/pci_root.c @@ -646,6 +646,7 @@ static void handle_root_bridge_insertion(acpi_handle handle)  static void handle_root_bridge_removal(struct acpi_device *device)  { +	acpi_status status;  	struct acpi_eject_event *ej_event;  	ej_event = kmalloc(sizeof(*ej_event), GFP_KERNEL); @@ -661,7 +662,9 @@ static void handle_root_bridge_removal(struct acpi_device *device)  	ej_event->device = device;  	ej_event->event = ACPI_NOTIFY_EJECT_REQUEST; -	acpi_bus_hot_remove_device(ej_event); +	status = acpi_os_hotplug_execute(acpi_bus_hot_remove_device, ej_event); +	if (ACPI_FAILURE(status)) +		kfree(ej_event);  }  static void _handle_hotplug_event_root(struct work_struct *work) @@ -676,8 +679,9 @@ static void _handle_hotplug_event_root(struct work_struct *work)  	handle = hp_work->handle;  	type = hp_work->type; -	root = acpi_pci_find_root(handle); +	acpi_scan_lock_acquire(); +	root = acpi_pci_find_root(handle);  	acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer);  	switch (type) { @@ -711,6 +715,7 @@ static void _handle_hotplug_event_root(struct work_struct *work)  		break;  	} +	acpi_scan_lock_release();  	kfree(hp_work); /* allocated in handle_hotplug_event_bridge */  	kfree(buffer.pointer);  }  |