Patch "ata: libata: fix NCQ autosense logic" has been added to the 5.15-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    ata: libata: fix NCQ autosense logic

to the 5.15-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     ata-libata-fix-ncq-autosense-logic.patch
and it can be found in the queue-5.15 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 832519fc592ff594ff5ce8c3f37c7683ac453326
Author: Niklas Cassel <niklas.cassel@xxxxxxx>
Date:   Mon Sep 26 20:53:06 2022 +0000

    ata: libata: fix NCQ autosense logic
    
    [ Upstream commit 7390896b3484d44cbdb8bc4859964314ac66d3c9 ]
    
    Currently, the logic if we should call ata_scsi_set_sense()
    (and set flag ATA_QCFLAG_SENSE_VALID to indicate that we have
    successfully added sense data to the struct ata_queued_cmd)
    looks like this:
    
    if (dev->class == ATA_DEV_ZAC &&
        ((qc->result_tf.status & ATA_SENSE) || qc->result_tf.auxiliary))
    
    The problem with this is that a drive can support the NCQ command
    error log without supporting NCQ autosense.
    
    On such a drive, if the failing command has sense data, the status
    field in the NCQ command error log will have the ATA_SENSE bit set.
    
    It is just that this sense data is not included in the NCQ command
    error log when NCQ autosense is not supported. Instead the sense
    data has to be fetched using the REQUEST SENSE DATA EXT command.
    
    Therefore, we should only add the sense data if the drive supports
    NCQ autosense AND the ATA_SENSE bit is set in the status field.
    
    Fix this, and at the same time, remove the duplicated ATA_DEV_ZAC
    check. The struct ata_taskfile supplied to ata_eh_read_log_10h()
    is memset:ed before calling the function, so simply checking if
    qc->result_tf.auxiliary is set is sufficient to tell us that the
    log actually contained sense data.
    
    Fixes: d238ffd59d3c ("libata: do not attempt to retrieve sense code twice")
    Signed-off-by: Niklas Cassel <niklas.cassel@xxxxxxx>
    Signed-off-by: Damien Le Moal <damien.lemoal@xxxxxxxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/ata/libata-sata.c b/drivers/ata/libata-sata.c
index 1e59e5b6b047..b5aa525d8760 100644
--- a/drivers/ata/libata-sata.c
+++ b/drivers/ata/libata-sata.c
@@ -1413,7 +1413,8 @@ static int ata_eh_read_log_10h(struct ata_device *dev,
 	tf->hob_lbah = buf[10];
 	tf->nsect = buf[12];
 	tf->hob_nsect = buf[13];
-	if (dev->class == ATA_DEV_ZAC && ata_id_has_ncq_autosense(dev->id))
+	if (dev->class == ATA_DEV_ZAC && ata_id_has_ncq_autosense(dev->id) &&
+	    (tf->status & ATA_SENSE))
 		tf->auxiliary = buf[14] << 16 | buf[15] << 8 | buf[16];
 
 	return 0;
@@ -1477,8 +1478,12 @@ void ata_eh_analyze_ncq_error(struct ata_link *link)
 	memcpy(&qc->result_tf, &tf, sizeof(tf));
 	qc->result_tf.flags = ATA_TFLAG_ISADDR | ATA_TFLAG_LBA | ATA_TFLAG_LBA48;
 	qc->err_mask |= AC_ERR_DEV | AC_ERR_NCQ;
-	if (dev->class == ATA_DEV_ZAC &&
-	    ((qc->result_tf.status & ATA_SENSE) || qc->result_tf.auxiliary)) {
+
+	/*
+	 * If the device supports NCQ autosense, ata_eh_read_log_10h() will have
+	 * stored the sense data in qc->result_tf.auxiliary.
+	 */
+	if (qc->result_tf.auxiliary) {
 		char sense_key, asc, ascq;
 
 		sense_key = (qc->result_tf.auxiliary >> 16) & 0xff;



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux