]> git.ipfire.org Git - thirdparty/kernel/linux.git/commit
ata: libata-scsi: fix requeue of deferred ATA PASS-THROUGH commands
authorIgor Pylypiv <ipylypiv@google.com>
Sun, 12 Apr 2026 15:36:37 +0000 (08:36 -0700)
committerNiklas Cassel <cassel@kernel.org>
Sun, 12 Apr 2026 17:57:59 +0000 (19:57 +0200)
commit8ebf408e7d463eee02c348a3c8277b95587b710d
tree60fafc44e78a8c0c320526cdf47633b09a6ddac8
parent797f629856c56595e138d69b8b0701ffe3cece21
ata: libata-scsi: fix requeue of deferred ATA PASS-THROUGH commands

Commit 0ea84089dbf6 ("ata: libata-scsi: avoid Non-NCQ command starvation")
introduced ata_scsi_requeue_deferred_qc() to handle commands deferred
during resets or NCQ failures. This deferral logic completed commands
with DID_SOFT_ERROR to trigger a retry in the SCSI mid-layer.

However, DID_SOFT_ERROR is subject to scsi_cmd_retry_allowed() checks.
ATA PASS-THROUGH commands sent via SG_IO ioctl have scmd->allowed set
to zero. This causes the mid-layer to fail the command immediately
instead of retrying, even though the command was never actually issued
to the hardware.

Switch to DID_REQUEUE to ensure these commands are inserted back into
the request queue regardless of retry limits.

Fixes: 0ea84089dbf6 ("ata: libata-scsi: avoid Non-NCQ command starvation")
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Signed-off-by: Igor Pylypiv <ipylypiv@google.com>
Signed-off-by: Niklas Cassel <cassel@kernel.org>
drivers/ata/libata-scsi.c