[PATCH] libata: implement ATA_FLAG_IN_EH port flag
authorTejun Heo <htejun@gmail.com>
Wed, 1 Feb 2006 15:56:10 +0000 (00:56 +0900)
committerJeff Garzik <jgarzik@pobox.com>
Thu, 9 Feb 2006 06:18:37 +0000 (01:18 -0500)
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>
drivers/scsi/libata-scsi.c
include/linux/libata.h

index 2d328b3..3a4f40b 100644 (file)
@@ -735,6 +735,11 @@ int ata_scsi_error(struct Scsi_Host *host)
 
        DPRINTK("ENTER\n");
 
+       spin_lock_irqsave(&ap->host_set->lock, flags);
+       assert(!(ap->flags & ATA_FLAG_IN_EH));
+       ap->flags |= ATA_FLAG_IN_EH;
+       spin_unlock_irqrestore(&ap->host_set->lock, flags);
+
        ap = (struct ata_port *) &host->hostdata[0];
        ap->ops->eng_timeout(ap);
 
@@ -742,6 +747,10 @@ int ata_scsi_error(struct Scsi_Host *host)
 
        scsi_eh_flush_done_q(&ap->eh_done_q);
 
+       spin_lock_irqsave(&ap->host_set->lock, flags);
+       ap->flags &= ~ATA_FLAG_IN_EH;
+       spin_unlock_irqrestore(&ap->host_set->lock, flags);
+
        DPRINTK("EXIT\n");
        return 0;
 }
index 474cdfa..55176df 100644 (file)
@@ -162,6 +162,8 @@ enum {
        ATA_FLAG_PIO_LBA48      = (1 << 13), /* Host DMA engine is LBA28 only */
        ATA_FLAG_IRQ_MASK       = (1 << 14), /* Mask IRQ in PIO xfers */
 
+       ATA_FLAG_IN_EH          = (1 << 15), /* EH in progress */
+
        ATA_QCFLAG_ACTIVE       = (1 << 1), /* cmd not yet ack'd to scsi lyer */
        ATA_QCFLAG_SG           = (1 << 3), /* have s/g table? */
        ATA_QCFLAG_SINGLE       = (1 << 4), /* no s/g, just a single buffer */