Skip to content

Commit

Permalink
libata: allocate ap separately from shost
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Tejun Heo authored and Jeff Garzik committed Apr 28, 2007
1 parent bf33554 commit 4911487
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 6 deletions.
19 changes: 14 additions & 5 deletions drivers/ata/libata-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -5792,13 +5792,18 @@ static struct ata_port * ata_port_add(const struct ata_probe_ent *ent,
return NULL;
}

shost = scsi_host_alloc(ent->sht, sizeof(struct ata_port));
if (!shost)
ap = kzalloc(sizeof(struct ata_port), GFP_KERNEL);
if (!ap)
return NULL;

shost->transportt = &ata_scsi_transport_template;
shost = scsi_host_alloc(ent->sht, sizeof(struct ata_port *));
if (!shost) {
kfree(ap);
return NULL;
}

ap = ata_shost_to_port(shost);
*(struct ata_port **)&shost->hostdata[0] = ap;
shost->transportt = &ata_scsi_transport_template;

ata_port_init(ap, host, ent, port_no);
ata_port_init_shost(ap, shost);
Expand All @@ -5824,9 +5829,13 @@ 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)
if (!ap)
continue;

if (ap->scsi_host)
scsi_host_put(ap->scsi_host);

kfree(ap);
host->ports[i] = NULL;
}

Expand Down
2 changes: 1 addition & 1 deletion include/linux/libata.h
Original file line number Diff line number Diff line change
Expand Up @@ -1231,7 +1231,7 @@ static inline void ata_pad_free(struct ata_port *ap, struct device *dev)

static inline struct ata_port *ata_shost_to_port(struct Scsi_Host *host)
{
return (struct ata_port *) &host->hostdata[0];
return *(struct ata_port **)&host->hostdata[0];
}

#endif /* __LINUX_LIBATA_H__ */

0 comments on commit 4911487

Please sign in to comment.