diff options
-rw-r--r-- | drivers/scsi/libata-scsi.c | 9 | ||||
-rw-r--r-- | include/linux/libata.h | 2 |
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 */ |