diff options
Diffstat (limited to 'drivers/scsi/libata-scsi.c')
-rw-r--r-- | drivers/scsi/libata-scsi.c | 17 |
1 files changed, 4 insertions, 13 deletions
diff --git a/drivers/scsi/libata-scsi.c b/drivers/scsi/libata-scsi.c index c1a4b29a9ae1..bcbf71e9895b 100644 --- a/drivers/scsi/libata-scsi.c +++ b/drivers/scsi/libata-scsi.c | |||
@@ -779,20 +779,15 @@ enum scsi_eh_timer_return ata_scsi_timed_out(struct scsi_cmnd *cmd) | |||
779 | 779 | ||
780 | int ata_scsi_error(struct Scsi_Host *host) | 780 | int ata_scsi_error(struct Scsi_Host *host) |
781 | { | 781 | { |
782 | struct ata_port *ap; | 782 | struct ata_port *ap = (struct ata_port *)&host->hostdata[0]; |
783 | unsigned long flags; | ||
784 | 783 | ||
785 | DPRINTK("ENTER\n"); | 784 | DPRINTK("ENTER\n"); |
786 | 785 | ||
787 | ap = (struct ata_port *) &host->hostdata[0]; | 786 | /* synchronize with IRQ handler and port task */ |
787 | spin_unlock_wait(&ap->host_set->lock); | ||
788 | ata_port_flush_task(ap); | ||
788 | 789 | ||
789 | spin_lock_irqsave(&ap->host_set->lock, flags); | ||
790 | WARN_ON(ap->flags & ATA_FLAG_IN_EH); | ||
791 | ap->flags |= ATA_FLAG_IN_EH; | ||
792 | WARN_ON(ata_qc_from_tag(ap, ap->active_tag) == NULL); | 790 | WARN_ON(ata_qc_from_tag(ap, ap->active_tag) == NULL); |
793 | spin_unlock_irqrestore(&ap->host_set->lock, flags); | ||
794 | |||
795 | ata_port_flush_task(ap); | ||
796 | 791 | ||
797 | ap->ops->eng_timeout(ap); | 792 | ap->ops->eng_timeout(ap); |
798 | 793 | ||
@@ -800,10 +795,6 @@ int ata_scsi_error(struct Scsi_Host *host) | |||
800 | 795 | ||
801 | scsi_eh_flush_done_q(&ap->eh_done_q); | 796 | scsi_eh_flush_done_q(&ap->eh_done_q); |
802 | 797 | ||
803 | spin_lock_irqsave(&ap->host_set->lock, flags); | ||
804 | ap->flags &= ~ATA_FLAG_IN_EH; | ||
805 | spin_unlock_irqrestore(&ap->host_set->lock, flags); | ||
806 | |||
807 | DPRINTK("EXIT\n"); | 798 | DPRINTK("EXIT\n"); |
808 | return 0; | 799 | return 0; |
809 | } | 800 | } |