[PATCH] libata: kill NULL qc handling from ->eng_timeout callbacks
->eng_timeout cannot be invoked with NULL qc anymore. Add an assertion in ata_scsi_error() and kill NULL qc handling from all ->eng_timeout callbacks. Signed-off-by: Tejun Heo <htejun@gmail.com> Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
This commit is contained in:
Родитель
35daeb8f9b
Коммит
f637902015
|
@ -677,19 +677,13 @@ static void ahci_eng_timeout(struct ata_port *ap)
|
|||
|
||||
spin_lock_irqsave(&host_set->lock, flags);
|
||||
|
||||
ahci_restart_port(ap, readl(port_mmio + PORT_IRQ_STAT));
|
||||
qc = ata_qc_from_tag(ap, ap->active_tag);
|
||||
if (!qc) {
|
||||
printk(KERN_ERR "ata%u: BUG: timeout without command\n",
|
||||
ap->id);
|
||||
} else {
|
||||
ahci_restart_port(ap, readl(port_mmio + PORT_IRQ_STAT));
|
||||
qc->err_mask |= AC_ERR_TIMEOUT;
|
||||
}
|
||||
qc->err_mask |= AC_ERR_TIMEOUT;
|
||||
|
||||
spin_unlock_irqrestore(&host_set->lock, flags);
|
||||
|
||||
if (qc)
|
||||
ata_eh_qc_complete(qc);
|
||||
ata_eh_qc_complete(qc);
|
||||
}
|
||||
|
||||
static inline int ahci_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc)
|
||||
|
|
|
@ -3524,20 +3524,10 @@ static void ata_qc_timeout(struct ata_queued_cmd *qc)
|
|||
|
||||
void ata_eng_timeout(struct ata_port *ap)
|
||||
{
|
||||
struct ata_queued_cmd *qc;
|
||||
|
||||
DPRINTK("ENTER\n");
|
||||
|
||||
qc = ata_qc_from_tag(ap, ap->active_tag);
|
||||
if (qc)
|
||||
ata_qc_timeout(qc);
|
||||
else {
|
||||
printk(KERN_ERR "ata%u: BUG: timeout without command\n",
|
||||
ap->id);
|
||||
goto out;
|
||||
}
|
||||
ata_qc_timeout(ata_qc_from_tag(ap, ap->active_tag));
|
||||
|
||||
out:
|
||||
DPRINTK("EXIT\n");
|
||||
}
|
||||
|
||||
|
|
|
@ -782,6 +782,7 @@ int ata_scsi_error(struct Scsi_Host *host)
|
|||
spin_lock_irqsave(&ap->host_set->lock, flags);
|
||||
assert(!(ap->flags & ATA_FLAG_IN_EH));
|
||||
ap->flags |= ATA_FLAG_IN_EH;
|
||||
assert(ata_qc_from_tag(ap, ap->active_tag) != NULL);
|
||||
spin_unlock_irqrestore(&ap->host_set->lock, flags);
|
||||
|
||||
ap->ops->eng_timeout(ap);
|
||||
|
|
|
@ -2027,13 +2027,8 @@ static void mv_eng_timeout(struct ata_port *ap)
|
|||
mv_err_intr(ap);
|
||||
mv_stop_and_reset(ap);
|
||||
|
||||
if (!qc) {
|
||||
printk(KERN_ERR "ata%u: BUG: timeout without command\n",
|
||||
ap->id);
|
||||
} else {
|
||||
qc->err_mask |= AC_ERR_TIMEOUT;
|
||||
ata_eh_qc_complete(qc);
|
||||
}
|
||||
qc->err_mask |= AC_ERR_TIMEOUT;
|
||||
ata_eh_qc_complete(qc);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -432,11 +432,6 @@ static void pdc_eng_timeout(struct ata_port *ap)
|
|||
spin_lock_irqsave(&host_set->lock, flags);
|
||||
|
||||
qc = ata_qc_from_tag(ap, ap->active_tag);
|
||||
if (!qc) {
|
||||
printk(KERN_ERR "ata%u: BUG: timeout without command\n",
|
||||
ap->id);
|
||||
goto out;
|
||||
}
|
||||
|
||||
switch (qc->tf.protocol) {
|
||||
case ATA_PROT_DMA:
|
||||
|
@ -456,10 +451,8 @@ static void pdc_eng_timeout(struct ata_port *ap)
|
|||
break;
|
||||
}
|
||||
|
||||
out:
|
||||
spin_unlock_irqrestore(&host_set->lock, flags);
|
||||
if (qc)
|
||||
ata_eh_qc_complete(qc);
|
||||
ata_eh_qc_complete(qc);
|
||||
DPRINTK("EXIT\n");
|
||||
}
|
||||
|
||||
|
|
|
@ -639,11 +639,6 @@ static void sil24_eng_timeout(struct ata_port *ap)
|
|||
struct ata_queued_cmd *qc;
|
||||
|
||||
qc = ata_qc_from_tag(ap, ap->active_tag);
|
||||
if (!qc) {
|
||||
printk(KERN_ERR "ata%u: BUG: timeout without command\n",
|
||||
ap->id);
|
||||
return;
|
||||
}
|
||||
|
||||
printk(KERN_ERR "ata%u: command timeout\n", ap->id);
|
||||
qc->err_mask |= AC_ERR_TIMEOUT;
|
||||
|
|
|
@ -867,11 +867,6 @@ static void pdc_eng_timeout(struct ata_port *ap)
|
|||
spin_lock_irqsave(&host_set->lock, flags);
|
||||
|
||||
qc = ata_qc_from_tag(ap, ap->active_tag);
|
||||
if (!qc) {
|
||||
printk(KERN_ERR "ata%u: BUG: timeout without command\n",
|
||||
ap->id);
|
||||
goto out;
|
||||
}
|
||||
|
||||
switch (qc->tf.protocol) {
|
||||
case ATA_PROT_DMA:
|
||||
|
@ -890,10 +885,8 @@ static void pdc_eng_timeout(struct ata_port *ap)
|
|||
break;
|
||||
}
|
||||
|
||||
out:
|
||||
spin_unlock_irqrestore(&host_set->lock, flags);
|
||||
if (qc)
|
||||
ata_eh_qc_complete(qc);
|
||||
ata_eh_qc_complete(qc);
|
||||
DPRINTK("EXIT\n");
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче