aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTejun Heo <htejun@gmail.com>2006-02-01 10:56:10 -0500
committerJeff Garzik <jgarzik@pobox.com>2006-02-09 01:18:37 -0500
commitdde44589bf9fac0168c6ce6d097c99c33b18074f (patch)
treeee68375254528cd19fbaa66969634c7a2fd87a6f
parent725b2805fd5d729b0db59fe8fc992e97523782c7 (diff)
[PATCH] libata: implement ATA_FLAG_IN_EH port flag
ATA_FLAG_IN_EH flag is set on entry to EH and cleared on completion. This patch just sets and clears the flag. Following patches will build normal qc execution / EH synchronization aroung this flag. Signed-off-by: Tejun Heo <htejun@gmail.com> Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
-rw-r--r--drivers/scsi/libata-scsi.c9
-rw-r--r--include/linux/libata.h2
2 files changed, 11 insertions, 0 deletions
diff --git a/drivers/scsi/libata-scsi.c b/drivers/scsi/libata-scsi.c
index 2d328b3af067..3a4f40b251fb 100644
--- a/drivers/scsi/libata-scsi.c
+++ b/drivers/scsi/libata-scsi.c
@@ -735,6 +735,11 @@ int ata_scsi_error(struct Scsi_Host *host)
735 735
736 DPRINTK("ENTER\n"); 736 DPRINTK("ENTER\n");
737 737
738 spin_lock_irqsave(&ap->host_set->lock, flags);
739 assert(!(ap->flags & ATA_FLAG_IN_EH));
740 ap->flags |= ATA_FLAG_IN_EH;
741 spin_unlock_irqrestore(&ap->host_set->lock, flags);
742
738 ap = (struct ata_port *) &host->hostdata[0]; 743 ap = (struct ata_port *) &host->hostdata[0];
739 ap->ops->eng_timeout(ap); 744 ap->ops->eng_timeout(ap);
740 745
@@ -742,6 +747,10 @@ int ata_scsi_error(struct Scsi_Host *host)
742 747
743 scsi_eh_flush_done_q(&ap->eh_done_q); 748 scsi_eh_flush_done_q(&ap->eh_done_q);
744 749
750 spin_lock_irqsave(&ap->host_set->lock, flags);
751 ap->flags &= ~ATA_FLAG_IN_EH;
752 spin_unlock_irqrestore(&ap->host_set->lock, flags);
753
745 DPRINTK("EXIT\n"); 754 DPRINTK("EXIT\n");
746 return 0; 755 return 0;
747} 756}
diff --git a/include/linux/libata.h b/include/linux/libata.h
index 474cdfa35d1e..55176df403a5 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -162,6 +162,8 @@ enum {
162 ATA_FLAG_PIO_LBA48 = (1 << 13), /* Host DMA engine is LBA28 only */ 162 ATA_FLAG_PIO_LBA48 = (1 << 13), /* Host DMA engine is LBA28 only */
163 ATA_FLAG_IRQ_MASK = (1 << 14), /* Mask IRQ in PIO xfers */ 163 ATA_FLAG_IRQ_MASK = (1 << 14), /* Mask IRQ in PIO xfers */
164 164
165 ATA_FLAG_IN_EH = (1 << 15), /* EH in progress */
166
165 ATA_QCFLAG_ACTIVE = (1 << 1), /* cmd not yet ack'd to scsi lyer */ 167 ATA_QCFLAG_ACTIVE = (1 << 1), /* cmd not yet ack'd to scsi lyer */
166 ATA_QCFLAG_SG = (1 << 3), /* have s/g table? */ 168 ATA_QCFLAG_SG = (1 << 3), /* have s/g table? */
167 ATA_QCFLAG_SINGLE = (1 << 4), /* no s/g, just a single buffer */ 169 ATA_QCFLAG_SINGLE = (1 << 4), /* no s/g, just a single buffer */