libata: clean up ZPODD when a port is detached
PATCH 1/1 libata: clean up ZPODD when a port is detached
When a ZPODD device is unbound via sysfs, the ACPI notify handler is not removed. This causes panics as observed in Bug #74601. The panic only happens when the wake happens from outside the kernel (i.e. inserting a media or pressing a button). Add a loop to ata_port_detach which loops through the port's devices and checks if zpodd is enabled, if so call zpodd_exit.
--- drivers/ata/libata-core.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/ata/libata-core.c +9 -0
@@ -6314,6 +6314,8 @@ int ata_host_activate(struct ata_host *host, int irq,static void ata_port_detach (struct ata_port *ap) {unsigned long flags; +struct ata_link *link; +struct ata_device *dev;if (!ap->ops->error_handler) goto skip_eh;
@@ -6333,6 +6335,13 @@ static void ata_port_detach(struct ata_port *ap)cancel_delayed_work_sync (&ap->hotplug_task); skip_eh: +/* clean up zpodd on port removal */ +ata_for_each_link (link, ap,HOST_FIRST ) { +ata_for_each_dev (dev, link,ALL ) { +if (zpodd_dev_enabled (dev)) +zpodd_exit (dev); + } + }if (ap->pmp_link) {int i;for (i =0 ; i <SATA_PMP_MAX_PORTS ; i++)
Signature · 1 line
1.8.3.1
Tejun Heo
AppliedQuoted 10 lines · Levente Kurusa
When a ZPODD device is unbound via sysfs, the ACPI notify handler is not removed. This causes panics as observed in Bug #74601. The panic only happens when the wake happens from outside the kernel (i.e. inserting a media or pressing a button). Add a loop to
ata_port_detachwhich loops through the port's devices and checks if zpodd is enabled, if so callzpodd_exit.Reviewed-by Aaron Lu <[email protected]>Signed-off-by Levente Kurusa <[email protected]>
Applied to libata/for-3.15-fixes.
Thanks.
Signature · 1 line
tejun