X-Git-Url: http://git.cascardo.info/?a=blobdiff_plain;f=drivers%2Fata%2Flibata-core.c;fp=drivers%2Fata%2Flibata-core.c;h=0a6a943b3779ec700af7f7bb5a30f220f0c1ab4d;hb=23d69b09b78c4876e134f104a3814c30747c53f1;hp=6669b44044fbb02dd582086fd713a147a55727fb;hpb=569ff2de2e1c8ac67c8df3a7367d46d0d9460a35;p=cascardo%2Flinux.git diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 6669b44044fb..0a6a943b3779 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c @@ -4807,9 +4807,6 @@ static void ata_verify_xfer(struct ata_queued_cmd *qc) { struct ata_device *dev = qc->dev; - if (ata_tag_internal(qc->tag)) - return; - if (ata_is_nodata(qc->tf.protocol)) return; @@ -4858,14 +4855,23 @@ void ata_qc_complete(struct ata_queued_cmd *qc) if (unlikely(qc->err_mask)) qc->flags |= ATA_QCFLAG_FAILED; - if (unlikely(qc->flags & ATA_QCFLAG_FAILED)) { - /* always fill result TF for failed qc */ + /* + * Finish internal commands without any further processing + * and always with the result TF filled. + */ + if (unlikely(ata_tag_internal(qc->tag))) { fill_result_tf(qc); + __ata_qc_complete(qc); + return; + } - if (!ata_tag_internal(qc->tag)) - ata_qc_schedule_eh(qc); - else - __ata_qc_complete(qc); + /* + * Non-internal qc has failed. Fill the result TF and + * summon EH. + */ + if (unlikely(qc->flags & ATA_QCFLAG_FAILED)) { + fill_result_tf(qc); + ata_qc_schedule_eh(qc); return; }