FAILED: patch "[PATCH] ata: libata-scsi: schedule deferred atapi command" failed to apply to 6.18-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.18-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.18.y
git checkout FETCH_HEAD
git cherry-pick -x e7468b3f9b404ac7c1329ef07c146c3356dfbd01
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026080550-flaring-quickstep-e60d@gregkh' --subject-prefix 'PATCH 6.18.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From e7468b3f9b404ac7c1329ef07c146c3356dfbd01 Mon Sep 17 00:00:00 2001
From: Damien Le Moal <[email protected]>
Date: Thu, 23 Jul 2026 07:42:26 +0900
Subject: [PATCH] ata: libata-scsi: schedule deferred atapi command
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.
drivers/ata/libata-scsi.c +6 -2
@@ -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 ); elseata_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
Sasha Levin
maintainerPATCH 1/2 ata: libata-scsi: terminate deferred commands on time out
From: Damien Le Moal <[email protected]>
[ Upstream commit 2e1d2e65e773d67dab163127f11a47dab0fbca9f ]
If a command times out while we have deferred non-NCQ commands waiting to be issued, the SCSI EH task is not immediately woken up as the waiting deferred commands are never issued nor completed, thus leaving the SCSI host in a busy state (shost->host_failed != scsi_host_busy(shost)) which prevents the SCSI EH task from being woken up. Eventually, when the deferred commands also time out, the SCSI EH task is woken up and the timeout processing occurs.
Avoid this unnecessary SCSI EH task wake-up additional time by scheduling a retry of all waiting deferred QCs, using the eh_timed_out SCSI host template operation. The function ata_scsi_eh_timed_out() is introduced to implement this operation.
However, terminating deferred commands with DID_REQUEUE to force a retry by calling the function ata_scsi_requeue_deferred_qc() may still keep the SCSI host in a busy state because the block layer may immediately re-issue these commands. The solution to this is to schedule libata EH for the port which suffered the command timeout to prevent accepting any new command. ata_scsi_requeue_deferred_qc() is modified to add a call to ata_port_schedule_eh() for this purpose.
In addition to this change, ata_scsi_requeue_deferred_qc() is also modified to take a new timedout_scmd scsi command argument which indicates the SCSI command that timed out. With this additional argument, ata_scsi_requeue_deferred_qc() can now also terminate with DID_TIME_OUT any timed out deferred qc, which simplifies ata_scsi_cmd_error_handler(). In this case, ata_scsi_requeue_deferred_qc() returns SCSI_EH_DONE, with this return value propagated back to the ata_scsi_eh_timed_out() operation to indicate to scsi_timeout() that the timed out command was handled and no further processing is needed.
For non-timed out deferred qc that need to be retried, ata_scsi_requeue_deferred_qc() returns SCSI_EH_NOT_HANDLED, thus indicating to scsi_timeout() that the timed out command needs to go through the SCSI EH (and libata EH) processing by adding it to the EH work queue with scsi_eh_scmd_add().
One side effect of these changes is that the function atapi_qc_complete() needs to be modified to ensure that a deferred ATAPI command that needs to be retried is completed with DID_REQUEUE instead of the default SAM_STAT_GOOD status, and a command that timed out is completed with DID_TIME_OUT instead of SAM_STAT_CHECK_CONDITION.
Stable-dep-of: e7468b3f9b40 ("ata: libata-scsi: schedule deferred atapi command")
--- drivers/ata/libata-eh.c | 29 ++------- drivers/ata/libata-scsi.c | 130 ++++++++++++++++++++++++++++++++------ drivers/ata/libata.h | 3 +- include/linux/libata.h | 2 + 4 files changed, 119 insertions(+), 45 deletions(-)
drivers/ata/libata-eh.c +6 -23
@@ -648,29 +648,12 @@ void ata_scsi_cmd_error_handler(struct Scsi_Host *host, struct ata_port *ap,set_host_byte (scmd,DID_OK );ata_qc_for_each_raw (ap, qc, i) { -if (qc->scsicmd != scmd) -continue ; -if ((qc->flags &ATA_QCFLAG_ACTIVE ) || - qc == qc->dev->link->deferred_qc) +if (qc->scsicmd == scmd && + qc->flags &ATA_QCFLAG_ACTIVE )break ; } -if (i <ATA_MAX_QUEUE && qc == qc->dev->link->deferred_qc) { -/* -* This is a deferred command that timed out while -* waiting for the command queue to drain. Since the qc -* is not active yet (deferred_qc is still set, so the -* deferred qc work has not issued the command yet), -* simply signal the timeout by finishing the SCSI -* command and clear the deferred qc to prevent the -* deferred qc work from issuing this qc. -*/ -WARN_ON_ONCE (qc->flags &ATA_QCFLAG_ACTIVE ); - qc->dev->link->deferred_qc =NULL ; -cancel_work (&qc->dev->link->deferred_qc_work); -set_host_byte (scmd,DID_TIME_OUT ); -scsi_eh_finish_cmd (scmd, &ap->eh_done_q); - }else if (i <ATA_MAX_QUEUE ) { +if (i <ATA_MAX_QUEUE ) {/* the scmd has an associated qc */ if (!(qc->flags &ATA_QCFLAG_EH )) {/* which hasn't failed yet, timeout */
@@ -944,10 +927,10 @@ static void ata_eh_set_pending(struct ata_port *ap, bool fastdrain) ap->pflags |=ATA_PFLAG_EH_PENDING ;/* -* If we have a deferred qc, requeue it so that it is retried once EH -* completes. +* If we have deferred QCs, requeue them so that the SCSI EH task can +* run. */ -ata_scsi_requeue_deferred_qc (ap); +ata_scsi_requeue_deferred_qc (ap,NULL );if (!fastdrain)return ;
drivers/ata/libata-scsi.c +109 -21
188 lines not on this page · raw message
drivers/ata/libata.h +2 -1
@@ -172,7 +172,8 @@ int ata_scsi_dev_config(struct scsi_device *sdev, struct queue_limits *lim, struct ata_device *dev);int __ata_scsi_queuecmd (struct scsi_cmnd *scmd,struct ata_device *dev);void ata_scsi_deferred_qc_work (struct work_struct *work); -void ata_scsi_requeue_deferred_qc (struct ata_port *ap); +enum scsi_timeout_action ata_scsi_requeue_deferred_qc (struct ata_port *ap, +struct scsi_cmnd *scmd);/* libata-eh.c */ extern unsigned int ata_internal_cmd_timeout (struct ata_device *dev,u8 cmd);
include/linux/libata.h +2 -0
@@ -1151,6 +1151,7 @@ extern int ata_scsi_ioctl(struct scsi_device *dev, unsigned int cmd,#define ATA_SCSI_COMPAT_IOCTL /* empty */ #endif extern int ata_scsi_queuecmd (struct Scsi_Host *h,struct scsi_cmnd *cmd); +enum scsi_timeout_action ata_scsi_eh_timed_out (struct scsi_cmnd *cmd);#if IS_REACHABLE (CONFIG_ATA )bool ata_scsi_dma_need_drain (struct request *rq);#else
@@ -1460,6 +1461,7 @@ extern const struct attribute_group *ata_common_sdev_groups[]; .ioctl = ata_scsi_ioctl, \ATA_SCSI_COMPAT_IOCTL \ .queuecommand = ata_scsi_queuecmd, \ + .eh_timed_out = ata_scsi_eh_timed_out, \ .dma_need_drain = ata_scsi_dma_need_drain, \ .this_id = ATA_SHT_THIS_ID, \ .emulated = ATA_SHT_EMULATED, \
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 2/2 ata: libata-scsi: schedule deferred atapi command
From: Damien Le Moal <[email protected]>
[ Upstream commit e7468b3f9b404ac7c1329ef07c146c3356dfbd01 ]
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.
--- drivers/ata/libata-scsi.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/ata/libata-scsi.c +6 -2
@@ -2990,6 +2990,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;
@@ -3019,12 +3020,12 @@ static void atapi_qc_complete(struct ata_queued_cmd *qc)ata_scsi_qc_done (qc, false,0 ); elseata_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 */
@@ -3032,6 +3033,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
Signature · 1 line
2.53.0