Skip to content

Commit

Permalink
libata: fix ata_host_release() free order
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Tejun Heo authored and Jeff Garzik committed Mar 9, 2007
1 parent 8ba5e4c commit 1aa506e
Showing 1 changed file with 10 additions and 6 deletions.
16 changes: 10 additions & 6 deletions drivers/ata/libata-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down

0 comments on commit 1aa506e

Please sign in to comment.