libata: fix ata_host_release() free order

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

Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
Tejun Heo 2007-03-09 19:36:12 +09:00 committed by Jeff Garzik
parent 8ba5e4cbe4
commit 1aa506e437

View File

@ -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);
}