]> err.no Git - linux-2.6/commitdiff
[PATCH] libata: add ATA_QCFLAG_EH_SCHEDULED
authorTejun Heo <htejun@gmail.com>
Fri, 10 Feb 2006 06:10:48 +0000 (15:10 +0900)
committerJeff Garzik <jgarzik@pobox.com>
Fri, 10 Feb 2006 11:50:45 +0000 (06:50 -0500)
Add ATA_QCFLAG_EH_SCHEDULED.  If this flag is set, the qc is owned by
EH and normal completion path is not allowed to finish it.  This patch
doesn't actually use this flag.

Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
drivers/scsi/libata-core.c
drivers/scsi/libata-scsi.c
drivers/scsi/libata.h
include/linux/libata.h

index 22db73932253802840986bad3fa85ce070196a39..977a53dd16773747362775f7b422eafac3b6ab00 100644 (file)
@@ -3620,19 +3620,7 @@ void ata_qc_free(struct ata_queued_cmd *qc)
        }
 }
 
-/**
- *     ata_qc_complete - Complete an active ATA command
- *     @qc: Command to complete
- *     @err_mask: ATA Status register contents
- *
- *     Indicate to the mid and upper layers that an ATA
- *     command has completed, with either an ok or not-ok status.
- *
- *     LOCKING:
- *     spin_lock_irqsave(host_set lock)
- */
-
-void ata_qc_complete(struct ata_queued_cmd *qc)
+inline void __ata_qc_complete(struct ata_queued_cmd *qc)
 {
        assert(qc != NULL);     /* ata_qc_from_tag _might_ return NULL */
        assert(qc->flags & ATA_QCFLAG_ACTIVE);
@@ -3650,6 +3638,25 @@ void ata_qc_complete(struct ata_queued_cmd *qc)
        qc->complete_fn(qc);
 }
 
+/**
+ *     ata_qc_complete - Complete an active ATA command
+ *     @qc: Command to complete
+ *     @err_mask: ATA Status register contents
+ *
+ *     Indicate to the mid and upper layers that an ATA
+ *     command has completed, with either an ok or not-ok status.
+ *
+ *     LOCKING:
+ *     spin_lock_irqsave(host_set lock)
+ */
+void ata_qc_complete(struct ata_queued_cmd *qc)
+{
+       if (unlikely(qc->flags & ATA_QCFLAG_EH_SCHEDULED))
+               return;
+
+       __ata_qc_complete(qc);
+}
+
 static inline int ata_should_dma_map(struct ata_queued_cmd *qc)
 {
        struct ata_port *ap = qc->ap;
index b007bb4093820e63475fbde0eb88c342c199423f..1df468eb2bf312a71ae606ecfa56f2ddc9ab6470 100644 (file)
@@ -770,7 +770,7 @@ static void __ata_eh_qc_complete(struct ata_queued_cmd *qc)
 
        spin_lock_irqsave(&ap->host_set->lock, flags);
        qc->scsidone = ata_eh_scsidone;
-       ata_qc_complete(qc);
+       __ata_qc_complete(qc);
        assert(!ata_tag_valid(qc->tag));
        spin_unlock_irqrestore(&ap->host_set->lock, flags);
 
index 9d76923a22536eeb850427757fed3d794b0c270a..1cd071a32e933e2cdf20acf74b81ce75c5901327 100644 (file)
@@ -46,6 +46,7 @@ extern struct ata_queued_cmd *ata_qc_new_init(struct ata_port *ap,
 extern int ata_rwcmd_protocol(struct ata_queued_cmd *qc);
 extern void ata_qc_free(struct ata_queued_cmd *qc);
 extern unsigned int ata_qc_issue(struct ata_queued_cmd *qc);
+extern void __ata_qc_complete(struct ata_queued_cmd *qc);
 extern int ata_check_atapi_dma(struct ata_queued_cmd *qc);
 extern void ata_dev_select(struct ata_port *ap, unsigned int device,
                            unsigned int wait, unsigned int can_sleep);
index 68b3fe6f9a4da7d23040f44e1ac1005065c801f3..5c70a57f93eedd1b81206668448dd56ef71bc016 100644 (file)
@@ -169,6 +169,7 @@ enum {
        ATA_QCFLAG_SG           = (1 << 3), /* have s/g table? */
        ATA_QCFLAG_SINGLE       = (1 << 4), /* no s/g, just a single buffer */
        ATA_QCFLAG_DMAMAP       = ATA_QCFLAG_SG | ATA_QCFLAG_SINGLE,
+       ATA_QCFLAG_EH_SCHEDULED = (1 << 5), /* EH scheduled */
 
        /* various lengths of time */
        ATA_TMOUT_EDD           = 5 * HZ,       /* heuristic */