Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f6379020 authored by Tejun Heo's avatar Tejun Heo Committed by Jeff Garzik
Browse files

[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: default avatarTejun Heo <htejun@gmail.com>
Signed-off-by: default avatarJeff Garzik <jgarzik@pobox.com>
parent 35daeb8f
Loading
Loading
Loading
Loading
+3 −9
Original line number Diff line number Diff line
@@ -677,18 +677,12 @@ static void ahci_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);
	} else {
	ahci_restart_port(ap, readl(port_mmio + PORT_IRQ_STAT));
	qc = ata_qc_from_tag(ap, ap->active_tag);
	qc->err_mask |= AC_ERR_TIMEOUT;
	}

	spin_unlock_irqrestore(&host_set->lock, flags);

	if (qc)
	ata_eh_qc_complete(qc);
}

+1 −11
Original line number Diff line number Diff line
@@ -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");
}

+1 −0
Original line number Diff line number Diff line
@@ -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);
+2 −7
Original line number Diff line number Diff line
@@ -2027,14 +2027,9 @@ 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);
}
}

/**
 *      mv_port_init - Perform some early initialization on a single port.
+1 −8
Original line number Diff line number Diff line
@@ -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,9 +451,7 @@ 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);
	DPRINTK("EXIT\n");
}
Loading