aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata/libata-core.c
diff options
context:
space:
mode:
authorTejun Heo <htejun@gmail.com>2007-04-17 10:44:06 -0400
committerJeff Garzik <jeff@garzik.org>2007-04-28 14:16:02 -0400
commit4911487a34baa89ec5b5f09a661761b73091fbec (patch)
treef79f6fa1a061cbbfcaac9a1581c7cf9600a82441 /drivers/ata/libata-core.c
parentbf33554290bb6a6b2bd8827076f89fb17fb19e3d (diff)
libata: allocate ap separately from shost
Don't embed ap inside shost. Allocate it separately and point it back from shosts's hostdata. This makes port allocation more flexible and allows regular ATA and SAS share host alloc/init paths. Signed-off-by: Tejun Heo <htejun@gmail.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/ata/libata-core.c')
-rw-r--r--drivers/ata/libata-core.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index f368387829c..c831c9efee6 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -5792,13 +5792,18 @@ static struct ata_port * ata_port_add(const struct ata_probe_ent *ent,
5792 return NULL; 5792 return NULL;
5793 } 5793 }
5794 5794
5795 shost = scsi_host_alloc(ent->sht, sizeof(struct ata_port)); 5795 ap = kzalloc(sizeof(struct ata_port), GFP_KERNEL);
5796 if (!shost) 5796 if (!ap)
5797 return NULL; 5797 return NULL;
5798 5798
5799 shost->transportt = &ata_scsi_transport_template; 5799 shost = scsi_host_alloc(ent->sht, sizeof(struct ata_port *));
5800 if (!shost) {
5801 kfree(ap);
5802 return NULL;
5803 }
5800 5804
5801 ap = ata_shost_to_port(shost); 5805 *(struct ata_port **)&shost->hostdata[0] = ap;
5806 shost->transportt = &ata_scsi_transport_template;
5802 5807
5803 ata_port_init(ap, host, ent, port_no); 5808 ata_port_init(ap, host, ent, port_no);
5804 ata_port_init_shost(ap, shost); 5809 ata_port_init_shost(ap, shost);
@@ -5824,9 +5829,13 @@ static void ata_host_release(struct device *gendev, void *res)
5824 for (i = 0; i < host->n_ports; i++) { 5829 for (i = 0; i < host->n_ports; i++) {
5825 struct ata_port *ap = host->ports[i]; 5830 struct ata_port *ap = host->ports[i];
5826 5831
5827 if (ap) 5832 if (!ap)
5833 continue;
5834
5835 if (ap->scsi_host)
5828 scsi_host_put(ap->scsi_host); 5836 scsi_host_put(ap->scsi_host);
5829 5837
5838 kfree(ap);
5830 host->ports[i] = NULL; 5839 host->ports[i] = NULL;
5831 } 5840 }
5832 5841