]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ata: libata-scsi: do not use the deferred QC feature for ATA_DEFER_PORT
authorNiklas Cassel <cassel@kernel.org>
Thu, 14 May 2026 07:39:00 +0000 (09:39 +0200)
committerNiklas Cassel <cassel@kernel.org>
Mon, 18 May 2026 10:11:46 +0000 (12:11 +0200)
The deferred QC feature was meant to handle mixed NCQ and non-NCQ commands,
i.e. for return value ATA_DEFER_LINK.

ATA_DEFER_PORT is returned by PATA drivers, but also certain SATA drivers
like sata_mv and sata_sil24 that uses ap->excl_link to workaround hardware
bugs in these HBAs. Regardless of the reason, using the deferred QC feature
for ATA_DEFER_PORT is always wrong, and will break the ap->excl_link usage
of the SATA drivers that rely on that feature.

Modify ata_scsi_qc_issue() to only use the deferred QC feature when mixing
NCQ and non-NCQ commands, i.e. ATA_DEFER_LINK.

Fixes: 0ea84089dbf6 ("ata: libata-scsi: avoid Non-NCQ command starvation")
Tested-by: Tommy Kelly <linux@tkel.ly>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Signed-off-by: Niklas Cassel <cassel@kernel.org>
drivers/ata/libata-scsi.c

index f9ca5410e223cfdf3b6c6a87221c4f46f133c770..f03b6326ad2dc84d6c2bd091087ff7ffc158d0e8 100644 (file)
@@ -1789,11 +1789,11 @@ static int ata_scsi_qc_issue(struct ata_port *ap, struct ata_queued_cmd *qc)
                goto defer_qc;
        case ATA_DEFER_PORT:
                ret = SCSI_MLQUEUE_HOST_BUSY;
-               goto defer_qc;
+               goto free_qc;
        default:
                WARN_ON_ONCE(1);
                ret = SCSI_MLQUEUE_HOST_BUSY;
-               goto defer_qc;
+               goto free_qc;
        }
 
 issue_qc:
@@ -1813,6 +1813,7 @@ defer_qc:
                return 0;
        }
 
+free_qc:
        /* Force a requeue of the command to defer its execution. */
        ata_qc_free(qc);