]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ata: libata-scsi: schedule deferred atapi command
authorDamien Le Moal <dlemoal@kernel.org>
Wed, 22 Jul 2026 22:42:26 +0000 (07:42 +0900)
committerDamien Le Moal <dlemoal@kernel.org>
Wed, 29 Jul 2026 01:52:04 +0000 (10:52 +0900)
Modify atapi_qc_complete() to call ata_scsi_schedule_deferred_qc() to
ensure that any deferred queued command can execute. This is similar to
ata_scsi_qc_complete() function for regular ATA devices.

Fixes: 0ea84089dbf6 ("ata: libata-scsi: avoid Non-NCQ command starvation")
Cc: stable@vger.kernel.org
Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
drivers/ata/libata-scsi.c

index 02b04de925f94a68c4f774cb0366deec344ccaa3..cd64787c47728bca4463291e953d680f5069d159 100644 (file)
@@ -2993,6 +2993,7 @@ static void atapi_fixup_inquiry(struct scsi_cmnd *cmd)
 
 static void atapi_qc_complete(struct ata_queued_cmd *qc)
 {
+       struct ata_link *link = qc->dev->link;
        struct scsi_cmnd *cmd = qc->scsicmd;
        unsigned int err_mask = qc->err_mask;
 
@@ -3022,12 +3023,12 @@ static void atapi_qc_complete(struct ata_queued_cmd *qc)
                        ata_scsi_qc_done(qc, false, 0);
                else
                        ata_scsi_qc_done(qc, true, SAM_STAT_CHECK_CONDITION);
-               return;
+               goto schedule_deferred;
        }
 
        if (cmd->result) {
                ata_scsi_qc_done(qc, false, 0);
-               return;
+               goto schedule_deferred;
        }
 
        /* successful completion path */
@@ -3035,6 +3036,9 @@ static void atapi_qc_complete(struct ata_queued_cmd *qc)
                atapi_fixup_inquiry(cmd);
 
        ata_scsi_qc_done(qc, true, SAM_STAT_GOOD);
+
+schedule_deferred:
+       ata_scsi_schedule_deferred_qc(link);
 }
 /**
  *     atapi_xlat - Initialize PACKET taskfile