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>

authored by Tejun Heo and committed by Jeff Garzik 1aa506e4 8ba5e4cb

+10 -6
+10 -6
drivers/ata/libata-core.c
··· 5685 for (i = 0; i < host->n_ports; i++) { 5686 struct ata_port *ap = host->ports[i]; 5687 5688 - if (!ap) 5689 - continue; 5690 - 5691 - if (ap->ops->port_stop) 5692 ap->ops->port_stop(ap); 5693 - 5694 - scsi_host_put(ap->scsi_host); 5695 } 5696 5697 if (host->ops->host_stop) 5698 host->ops->host_stop(host); 5699 5700 dev_set_drvdata(gendev, NULL); 5701 }
··· 5685 for (i = 0; i < host->n_ports; i++) { 5686 struct ata_port *ap = host->ports[i]; 5687 5688 + if (ap && ap->ops->port_stop) 5689 ap->ops->port_stop(ap); 5690 } 5691 5692 if (host->ops->host_stop) 5693 host->ops->host_stop(host); 5694 + 5695 + for (i = 0; i < host->n_ports; i++) { 5696 + struct ata_port *ap = host->ports[i]; 5697 + 5698 + if (ap) 5699 + scsi_host_put(ap->scsi_host); 5700 + 5701 + host->ports[i] = NULL; 5702 + } 5703 5704 dev_set_drvdata(gendev, NULL); 5705 }