From: Dave Jones ata_device_add fails, calls ata_host_remove with pointers to unitialized memory. Signed-off-by: Dave Jones Cc: Jeff Garzik Cc: Tejun Heo Signed-off-by: Andrew Morton --- drivers/scsi/libata-core.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff -puN drivers/scsi/libata-core.c~via-sata-oops-on-init drivers/scsi/libata-core.c --- a/drivers/scsi/libata-core.c~via-sata-oops-on-init +++ a/drivers/scsi/libata-core.c @@ -5461,6 +5461,7 @@ int ata_device_add(const struct ata_prob ap = ata_host_add(ent, host_set, i); + host_set->ports[i] = ap; if (!ap) goto err_out; @@ -5468,7 +5469,6 @@ int ata_device_add(const struct ata_prob if (i == 1 && ent->irq2) irq_line = ent->irq2; - host_set->ports[i] = ap; xfer_mode_mask =(ap->udma_mask << ATA_SHIFT_UDMA) | (ap->mwdma_mask << ATA_SHIFT_MWDMA) | (ap->pio_mask << ATA_SHIFT_PIO); @@ -5594,6 +5594,8 @@ int ata_device_add(const struct ata_prob err_out: for (i = 0; i < count; i++) { + if (!host_set->ports[i]) + break; ata_host_remove(host_set->ports[i], 1); scsi_host_put(host_set->ports[i]->host); } _