diff options
author | Tejun Heo <htejun@gmail.com> | 2006-03-31 06:36:47 -0500 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2006-03-31 10:14:42 -0500 |
commit | e4a70e76add280db6068426716a9b2a74099144f (patch) | |
tree | b978d7da736590fe0603e7a88a7a9b20cc2a36b1 /drivers/scsi | |
parent | 79ea24e72e59b5f0951483cc4f357afe9bf7ff89 (diff) |
[PATCH] libata: fix ata_qc_issue failure path
On sg_err failure path, ata_qc_issue() doesn't mark the qc active
before returning. This triggers WARN_ON() in __ata_qc_complete() when
the qc gets completed. This patch moves ap->active_tag and
QCFLAG_ACTIVE setting to the top of the function.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/libata-core.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c index 21b0ed583b8a..eb4df01d9fa0 100644 --- a/drivers/scsi/libata-core.c +++ b/drivers/scsi/libata-core.c | |||
@@ -4006,6 +4006,9 @@ unsigned int ata_qc_issue(struct ata_queued_cmd *qc) | |||
4006 | { | 4006 | { |
4007 | struct ata_port *ap = qc->ap; | 4007 | struct ata_port *ap = qc->ap; |
4008 | 4008 | ||
4009 | qc->ap->active_tag = qc->tag; | ||
4010 | qc->flags |= ATA_QCFLAG_ACTIVE; | ||
4011 | |||
4009 | if (ata_should_dma_map(qc)) { | 4012 | if (ata_should_dma_map(qc)) { |
4010 | if (qc->flags & ATA_QCFLAG_SG) { | 4013 | if (qc->flags & ATA_QCFLAG_SG) { |
4011 | if (ata_sg_setup(qc)) | 4014 | if (ata_sg_setup(qc)) |
@@ -4020,9 +4023,6 @@ unsigned int ata_qc_issue(struct ata_queued_cmd *qc) | |||
4020 | 4023 | ||
4021 | ap->ops->qc_prep(qc); | 4024 | ap->ops->qc_prep(qc); |
4022 | 4025 | ||
4023 | qc->ap->active_tag = qc->tag; | ||
4024 | qc->flags |= ATA_QCFLAG_ACTIVE; | ||
4025 | |||
4026 | return ap->ops->qc_issue(qc); | 4026 | return ap->ops->qc_issue(qc); |
4027 | 4027 | ||
4028 | sg_err: | 4028 | sg_err: |