7/8: Submitting tasks from ata_host_intr() breaks ata_port_flush_task(). This patch adds code to disable irq pio delegation to ata_port_flush_task(). Irq pio delegation is re-enabled when next qc is issued. Signed-off-by: Albert Lee <albertcc@xxxxxxxxxx> Cc: Tejun Heo <htejun@xxxxxxxxx> --- Don't know if this is good enough. Maybe Tejun have better ideas. diff -Nrup 06_irq_wq/drivers/ata/libata-core.c 07_irq_wq_fix/drivers/ata/libata-core.c --- 06_irq_wq/drivers/ata/libata-core.c 2007-05-16 13:53:25.000000000 +0800 +++ 07_irq_wq_fix/drivers/ata/libata-core.c 2007-05-16 13:53:37.000000000 +0800 @@ -1321,6 +1321,7 @@ void ata_port_flush_task(struct ata_port spin_lock_irqsave(ap->lock, flags); ap->pflags |= ATA_PFLAG_FLUSH_PORT_TASK; + ap->pflags &= ~ATA_PFLAG_IRQ_DELEGATE; spin_unlock_irqrestore(ap->lock, flags); DPRINTK("flush #1\n"); @@ -5604,6 +5605,9 @@ unsigned int ata_qc_issue_prot(struct at (ap->flags & ATA_FLAG_SETXFER_POLLING)) qc->tf.flags |= ATA_TFLAG_POLLING; + /* delegate data transfer of irq driven pio to workqueue */ + ap->pflags |= ATA_PFLAG_IRQ_DELEGATE; + /* select the device */ ata_dev_select(ap, qc->dev->devno, 1, 0); @@ -5788,9 +5792,12 @@ inline unsigned int ata_host_intr (struc switch (ap->hsm_task_state) { case HSM_ST_FIRST: case HSM_ST: - /* delegate PIO data transfer to workqueue */ - ap->pflags |= ATA_PFLAG_HSM_WQ; - ata_port_queue_task(ap, ata_irq_task, qc, 0); + if (ap->pflags & ATA_PFLAG_IRQ_DELEGATE) { + /* delegate PIO data transfer to workqueue */ + ap->pflags |= ATA_PFLAG_HSM_WQ; + ata_port_queue_task(ap, ata_irq_task, qc, 0); + } else + ata_hsm_move(ap, qc, status, 0); break; default: ata_hsm_move(ap, qc, status, 0); diff -Nrup 06_irq_wq/include/linux/libata.h 07_irq_wq_fix/include/linux/libata.h --- 06_irq_wq/include/linux/libata.h 2007-05-14 14:45:28.000000000 +0800 +++ 07_irq_wq_fix/include/linux/libata.h 2007-05-15 18:14:49.000000000 +0800 @@ -196,6 +196,7 @@ enum { ATA_PFLAG_SUSPENDED = (1 << 17), /* port is suspended (power) */ ATA_PFLAG_PM_PENDING = (1 << 18), /* PM operation pending */ ATA_PFLAG_HSM_WQ = (1 << 19), /* hsm accessing the port in wq */ + ATA_PFLAG_IRQ_DELEGATE = (1 << 20), /* delegate irq pio to wq */ /* struct ata_queued_cmd flags */ ATA_QCFLAG_ACTIVE = (1 << 0), /* cmd not yet ack'd to scsi lyer */ - To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html