]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ata: libata-scsi: Return aborted command when missing sense and result TF
authorDamien Le Moal <dlemoal@kernel.org>
Tue, 29 Jul 2025 10:37:12 +0000 (19:37 +0900)
committerDamien Le Moal <dlemoal@kernel.org>
Thu, 31 Jul 2025 03:56:11 +0000 (12:56 +0900)
ata_gen_ata_sense() is always called for a failed qc missing sense data
so that a sense key, code and code qualifier can be generated using
ata_to_sense_error() from the qc status and error fields of its result
task file. However, if the qc does not have its result task file filled,
ata_gen_ata_sense() returns early without setting a sense key.

Improve this by defaulting to returning ABORTED COMMAND without any
additional sense code, since we do not know the reason for the failure.
The same fix is also applied in ata_gen_passthru_sense() with the
additional check that the qc failed (qc->err_mask is set).

Fixes: 816be86c7993 ("ata: libata-scsi: Check ATA_QCFLAG_RTF_FILLED before using result_tf")
Cc: stable@vger.kernel.org
Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/ata/libata-scsi.c

index 9b16c0f553e0f0c7cdd5ee4647906a0b737a3e42..57f674f51b0cea86f21b7a5361c4828876e91c9c 100644 (file)
@@ -938,6 +938,8 @@ static void ata_gen_passthru_sense(struct ata_queued_cmd *qc)
        if (!(qc->flags & ATA_QCFLAG_RTF_FILLED)) {
                ata_dev_dbg(dev,
                            "missing result TF: can't generate ATA PT sense data\n");
+               if (qc->err_mask)
+                       ata_scsi_set_sense(dev, cmd, ABORTED_COMMAND, 0, 0);
                return;
        }
 
@@ -992,8 +994,8 @@ static void ata_gen_ata_sense(struct ata_queued_cmd *qc)
 
        if (!(qc->flags & ATA_QCFLAG_RTF_FILLED)) {
                ata_dev_dbg(dev,
-                           "missing result TF: can't generate sense data\n");
-               return;
+                           "Missing result TF: reporting aborted command\n");
+               goto aborted;
        }
 
        /* Use ata_to_sense_error() to map status register bits
@@ -1004,13 +1006,15 @@ static void ata_gen_ata_sense(struct ata_queued_cmd *qc)
                ata_to_sense_error(tf->status, tf->error,
                                   &sense_key, &asc, &ascq);
                ata_scsi_set_sense(dev, cmd, sense_key, asc, ascq);
-       } else {
-               /* Could not decode error */
-               ata_dev_warn(dev, "could not decode error status 0x%x err_mask 0x%x\n",
-                            tf->status, qc->err_mask);
-               ata_scsi_set_sense(dev, cmd, ABORTED_COMMAND, 0, 0);
                return;
        }
+
+       /* Could not decode error */
+       ata_dev_warn(dev,
+               "Could not decode error 0x%x, status 0x%x (err_mask=0x%x)\n",
+               tf->error, tf->status, qc->err_mask);
+aborted:
+       ata_scsi_set_sense(dev, cmd, ABORTED_COMMAND, 0, 0);
 }
 
 void ata_scsi_sdev_config(struct scsi_device *sdev)