aboutsummaryrefslogtreecommitdiffstats
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
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>
-rw-r--r--drivers/ata/libata-core.c19
-rw-r--r--include/linux/libata.h2
2 files changed, 15 insertions, 6 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index f368387829ca..c831c9efee60 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
diff --git a/include/linux/libata.h b/include/linux/libata.h
index 12237d4b9f9b..ced9dd54035e 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -1231,7 +1231,7 @@ static inline void ata_pad_free(struct ata_port *ap, struct device *dev)
1231 1231
1232static inline struct ata_port *ata_shost_to_port(struct Scsi_Host *host) 1232static inline struct ata_port *ata_shost_to_port(struct Scsi_Host *host)
1233{ 1233{
1234 return (struct ata_port *) &host->hostdata[0]; 1234 return *(struct ata_port **)&host->hostdata[0];
1235} 1235}
1236 1236
1237#endif /* __LINUX_LIBATA_H__ */ 1237#endif /* __LINUX_LIBATA_H__ */