diff options
Diffstat (limited to 'drivers/ata/libata-eh.c')
-rw-r--r-- | drivers/ata/libata-eh.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index 9f6cfac0f2cc..f77a67303f8b 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c | |||
@@ -550,8 +550,8 @@ void ata_scsi_error(struct Scsi_Host *host) | |||
550 | 550 | ||
551 | DPRINTK("ENTER\n"); | 551 | DPRINTK("ENTER\n"); |
552 | 552 | ||
553 | /* synchronize with port task */ | 553 | /* make sure sff pio task is not running */ |
554 | ata_port_flush_task(ap); | 554 | ata_sff_flush_pio_task(ap); |
555 | 555 | ||
556 | /* synchronize with host lock and sort out timeouts */ | 556 | /* synchronize with host lock and sort out timeouts */ |
557 | 557 | ||
@@ -879,6 +879,8 @@ static void ata_eh_set_pending(struct ata_port *ap, int fastdrain) | |||
879 | void ata_qc_schedule_eh(struct ata_queued_cmd *qc) | 879 | void ata_qc_schedule_eh(struct ata_queued_cmd *qc) |
880 | { | 880 | { |
881 | struct ata_port *ap = qc->ap; | 881 | struct ata_port *ap = qc->ap; |
882 | struct request_queue *q = qc->scsicmd->device->request_queue; | ||
883 | unsigned long flags; | ||
882 | 884 | ||
883 | WARN_ON(!ap->ops->error_handler); | 885 | WARN_ON(!ap->ops->error_handler); |
884 | 886 | ||
@@ -890,7 +892,9 @@ void ata_qc_schedule_eh(struct ata_queued_cmd *qc) | |||
890 | * Note that ATA_QCFLAG_FAILED is unconditionally set after | 892 | * Note that ATA_QCFLAG_FAILED is unconditionally set after |
891 | * this function completes. | 893 | * this function completes. |
892 | */ | 894 | */ |
895 | spin_lock_irqsave(q->queue_lock, flags); | ||
893 | blk_abort_request(qc->scsicmd->request); | 896 | blk_abort_request(qc->scsicmd->request); |
897 | spin_unlock_irqrestore(q->queue_lock, flags); | ||
894 | } | 898 | } |
895 | 899 | ||
896 | /** | 900 | /** |
@@ -1624,6 +1628,7 @@ void ata_eh_analyze_ncq_error(struct ata_link *link) | |||
1624 | } | 1628 | } |
1625 | 1629 | ||
1626 | /* okay, this error is ours */ | 1630 | /* okay, this error is ours */ |
1631 | memset(&tf, 0, sizeof(tf)); | ||
1627 | rc = ata_eh_read_log_10h(dev, &tag, &tf); | 1632 | rc = ata_eh_read_log_10h(dev, &tag, &tf); |
1628 | if (rc) { | 1633 | if (rc) { |
1629 | ata_link_printk(link, KERN_ERR, "failed to read log page 10h " | 1634 | ata_link_printk(link, KERN_ERR, "failed to read log page 10h " |
@@ -3679,7 +3684,7 @@ void ata_std_error_handler(struct ata_port *ap) | |||
3679 | ata_reset_fn_t hardreset = ops->hardreset; | 3684 | ata_reset_fn_t hardreset = ops->hardreset; |
3680 | 3685 | ||
3681 | /* ignore built-in hardreset if SCR access is not available */ | 3686 | /* ignore built-in hardreset if SCR access is not available */ |
3682 | if (ata_is_builtin_hardreset(hardreset) && !sata_scr_valid(&ap->link)) | 3687 | if (hardreset == sata_std_hardreset && !sata_scr_valid(&ap->link)) |
3683 | hardreset = NULL; | 3688 | hardreset = NULL; |
3684 | 3689 | ||
3685 | ata_do_eh(ap, ops->prereset, ops->softreset, hardreset, ops->postreset); | 3690 | ata_do_eh(ap, ops->prereset, ops->softreset, hardreset, ops->postreset); |