Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1aa506e4 authored by Tejun Heo's avatar Tejun Heo Committed by Jeff Garzik
Browse files

libata: fix ata_host_release() free order



host->ops->host_stop() might access ports.  Free ports after
host_stop.

Signed-off-by: default avatarTejun Heo <htejun@gmail.com>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent 8ba5e4cb
Loading
Loading
Loading
Loading
+10 −6
Original line number Diff line number Diff line
@@ -5685,18 +5685,22 @@ static void ata_host_release(struct device *gendev, void *res)
	for (i = 0; i < host->n_ports; i++) {
		struct ata_port *ap = host->ports[i];

		if (!ap)
			continue;

		if (ap->ops->port_stop)
		if (ap && ap->ops->port_stop)
			ap->ops->port_stop(ap);

		scsi_host_put(ap->scsi_host);
	}

	if (host->ops->host_stop)
		host->ops->host_stop(host);

	for (i = 0; i < host->n_ports; i++) {
		struct ata_port *ap = host->ports[i];

		if (ap)
			scsi_host_put(ap->scsi_host);

		host->ports[i] = NULL;
	}

	dev_set_drvdata(gendev, NULL);
}