FAILED: patch "[PATCH] ata: libata-scsi: refactor ata_scsi_translate()" failed to apply to 5.15-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 5.15-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-5.15.y
git checkout FETCH_HEAD
git cherry-pick -x bb3a8154b1a1dc2c86d037482c0a2cf9186829ed
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026022431-await-dinginess-62b0@gregkh' --subject-prefix 'PATCH 5.15.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From bb3a8154b1a1dc2c86d037482c0a2cf9186829ed Mon Sep 17 00:00:00 2001
From: Damien Le Moal <[email protected]>
Date: Wed, 17 Dec 2025 14:05:25 +0900
Subject: [PATCH] ata: libata-scsi: refactor ata_scsi_translate()
Factor out of ata_scsi_translate() the code handling queued command deferral using the port qc_defer callback and issuing the queued command with ata_qc_issue() into the new function ata_scsi_qc_issue(), and simplify the goto used in ata_scsi_translate().
While at it, also add a lockdep annotation to check that the port lock is held when ata_scsi_translate() is called.
No functional changes.
drivers/ata/libata-scsi.c +50 -31
@@ -1691,6 +1691,42 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc)ata_qc_done (qc); } +static int ata_scsi_qc_issue (struct ata_port *ap,struct ata_queued_cmd *qc) +{ +int ret; + +if (!ap->ops->qc_defer) + goto issue; + +/* Check if the command needs to be deferred. */ + ret = ap->ops->qc_defer (qc); +switch (ret) { +case 0 : +break ; +case ATA_DEFER_LINK : + ret =SCSI_MLQUEUE_DEVICE_BUSY ; +break ; +case ATA_DEFER_PORT : + ret =SCSI_MLQUEUE_HOST_BUSY ; +break ; +default : +WARN_ON_ONCE (1 ); + ret =SCSI_MLQUEUE_HOST_BUSY ; +break ; + } + +if (ret) { +/* Force a requeue of the command to defer its execution. */ +ata_qc_free (qc); +return ret; + } + +issue: +ata_qc_issue (qc); + +return 0 ; +} +/** * ata_scsi_translate - Translate then issue SCSI command to ATA device * @dev: ATA device to which the command is addressed
@@ -1714,66 +1750,49 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc)* spin_lock_irqsave(host lock) * * RETURNS: -* 0 on success, SCSI_ML_QUEUE_DEVICE_BUSY if the command -* needs to be deferred. +* 0 on success, SCSI_ML_QUEUE_DEVICE_BUSY or SCSI_MLQUEUE_HOST_BUSY if the +* command needs to be deferred. */ static int ata_scsi_translate (struct ata_device *dev,struct scsi_cmnd *cmd,ata_xlat_func_t xlat_func) {struct ata_port *ap = dev->link->ap;struct ata_queued_cmd *qc; -int rc; +lockdep_assert_held (ap->lock); + +/* +* ata_scsi_qc_new() calls scsi_done(cmd) in case of failure. So we +* have nothing further to do when allocating a qc fails. +*/ qc =ata_scsi_qc_new (dev, cmd);if (!qc) - goto err_mem; +return 0 ;/* data is present; dma-map it */ if (cmd->sc_data_direction ==DMA_FROM_DEVICE || cmd->sc_data_direction ==DMA_TO_DEVICE ) {if (unlikely (scsi_bufflen (cmd) <1 )) {ata_dev_warn (dev,"WARNING: zero len r/w req\n" ); - goto err_did; + cmd->result = (DID_ERROR <<16 ); + goto done; }ata_sg_init (qc,scsi_sglist (cmd),scsi_sg_count (cmd)); - qc->dma_dir = cmd->sc_data_direction; } qc->complete_fn = ata_scsi_qc_complete;if (xlat_func (qc)) - goto early_finish; + goto done; -if (ap->ops->qc_defer) { -if ((rc = ap->ops->qc_defer (qc))) - goto defer; - } +return ata_scsi_qc_issue (ap, qc); -/* select device, send command to hardware */ -ata_qc_issue (qc); - -return 0 ; - -early_finish: +done:ata_qc_free (qc);scsi_done (cmd);return 0 ; - -err_did: -ata_qc_free (qc); - cmd->result = (DID_ERROR <<16 ); -scsi_done (cmd); -err_mem: -return 0 ; - -defer: -ata_qc_free (qc); -if (rc ==ATA_DEFER_LINK ) -return SCSI_MLQUEUE_DEVICE_BUSY ; -else -return SCSI_MLQUEUE_HOST_BUSY ; }/**
Sasha Levin
maintainerPATCH 1/4 scsi: ata: Call scsi_done() directly
From: Bart Van Assche <[email protected]>
[ Upstream commit 58bf201dfc032eadbb31eaf817b467bed17f753d ]
Conditional statements are faster than indirect calls. Hence call scsi_done() directly.
Stable-dep-of: bb3a8154b1a1 ("ata: libata-scsi: refactor ata_scsi_translate()")
--- drivers/ata/libata-sata.c | 2 +- drivers/ata/libata-scsi.c | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-)
drivers/ata/libata-sata.c +1 -1
@@ -1276,7 +1276,7 @@ int ata_sas_queuecmd(struct scsi_cmnd *cmd, struct ata_port *ap) rc =__ata_scsi_queuecmd (cmd, ap->link.device); else { cmd->result = (DID_BAD_TARGET <<16 ); - cmd->scsi_done (cmd); +scsi_done (cmd); }return rc; }
drivers/ata/libata-scsi.c +7 -7
@@ -634,7 +634,7 @@ static struct ata_queued_cmd *ata_scsi_qc_new(struct ata_device *dev, qc =ata_qc_new_init (dev,scsi_cmd_to_rq (cmd)->tag);if (qc) { qc->scsicmd = cmd; - qc->scsidone = cmd->scsi_done; + qc->scsidone = scsi_done; qc->sg =scsi_sglist (cmd); qc->n_elem =scsi_sg_count (cmd);
@@ -643,7 +643,7 @@ static struct ata_queued_cmd *ata_scsi_qc_new(struct ata_device *dev, qc->flags |=ATA_QCFLAG_QUIET ; }else { cmd->result = (DID_OK <<16 ) |SAM_STAT_TASK_SET_FULL ; - cmd->scsi_done (cmd); +scsi_done (cmd); }return qc;
@@ -1750,14 +1750,14 @@ static int ata_scsi_translate(struct ata_device *dev, struct scsi_cmnd *cmd, early_finish:ata_qc_free (qc); - cmd->scsi_done (cmd); +scsi_done (cmd);DPRINTK ("EXIT - early finish (good or error)\n" );return 0 ; err_did:ata_qc_free (qc); cmd->result = (DID_ERROR <<16 ); - cmd->scsi_done (cmd); +scsi_done (cmd); err_mem:DPRINTK ("EXIT - internal\n" );return 0 ;
@@ -4068,7 +4068,7 @@ int __ata_scsi_queuecmd(struct scsi_cmnd *scmd, struct ata_device *dev)DPRINTK ("bad CDB len=%u, scsi_op=0x%02x, max=%u\n" , scmd->cmd_len, scsi_op, dev->cdb_len); scmd->result =DID_ERROR <<16 ; - scmd->scsi_done (scmd); +scsi_done (scmd);return 0 ; }
@@ -4110,7 +4110,7 @@ int ata_scsi_queuecmd(struct Scsi_Host *shost, struct scsi_cmnd *cmd) rc =__ata_scsi_queuecmd (cmd, dev); else { cmd->result = (DID_BAD_TARGET <<16 ); - cmd->scsi_done (cmd); +scsi_done (cmd); }spin_unlock_irqrestore (ap->lock, irq_flags);
@@ -4239,7 +4239,7 @@ void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd)break ; } - cmd->scsi_done (cmd); +scsi_done (cmd); }int ata_scsi_add_hosts (struct ata_host *host,struct scsi_host_template *sht)
Signature · 1 line
2.51.0
Sasha Levin
maintainerPATCH 2/4 ata: libata-scsi: drop DPRINTK calls for cdb translation
From: Hannes Reinecke <[email protected]>
[ Upstream commit 1fe9fb71b2ffcedd794daacf4db2056a6cb5199e ]
Drop DPRINTK calls for cdb translation as they are already covered by other traces, and also drop the DPRINTK calls in ata_scsi_hotplug().
Stable-dep-of: bb3a8154b1a1 ("ata: libata-scsi: refactor ata_scsi_translate()")
--- drivers/ata/libata-scsi.c | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-)
drivers/ata/libata-scsi.c +1 -19
@@ -1472,9 +1472,6 @@ static unsigned int ata_scsi_verify_xlat(struct ata_queued_cmd *qc) head = track % dev->heads; sect = (u32 )block % dev->sectors +1 ; -DPRINTK ("block %u track %u cyl %u head %u sect %u\n" , - (u32 )block, track, cyl, head, sect); -/* Check whether the converted CHS can fit. Cylinder: 0-65535 Head: 0-15
@@ -1597,7 +1594,6 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc) goto invalid_fld;break ;default : -DPRINTK ("no-byte command\n" ); fp =0 ; goto invalid_fld; }
@@ -1751,7 +1747,6 @@ static int ata_scsi_translate(struct ata_device *dev, struct scsi_cmnd *cmd, early_finish:ata_qc_free (qc);scsi_done (cmd); -DPRINTK ("EXIT - early finish (good or error)\n" );return 0 ; err_did:
@@ -1759,12 +1754,10 @@ static int ata_scsi_translate(struct ata_device *dev, struct scsi_cmnd *cmd, cmd->result = (DID_ERROR <<16 );scsi_done (cmd); err_mem: -DPRINTK ("EXIT - internal\n" );return 0 ; defer:ata_qc_free (qc); -DPRINTK ("EXIT - defer\n" );if (rc ==ATA_DEFER_LINK )return SCSI_MLQUEUE_DEVICE_BUSY ;else
@@ -2491,8 +2484,6 @@ static void atapi_request_sense(struct ata_queued_cmd *qc)struct ata_port *ap = qc->ap;struct scsi_cmnd *cmd = qc->scsicmd; -DPRINTK ("ATAPI request sense\n" ); -memset (cmd->sense_buffer,0 ,SCSI_SENSE_BUFFERSIZE );#ifdef CONFIG_ATA_SFF
@@ -2531,8 +2522,6 @@ static void atapi_request_sense(struct ata_queued_cmd *qc) qc->complete_fn = atapi_sense_complete;ata_qc_issue (qc); - -DPRINTK ("EXIT\n" ); }/*
@@ -2642,7 +2631,6 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc) qc->tf.flags |=ATA_TFLAG_ISADDR |ATA_TFLAG_DEVICE ;if (scmd->sc_data_direction ==DMA_TO_DEVICE ) { qc->tf.flags |=ATA_TFLAG_WRITE ; -DPRINTK ("direction: write\n" ); } qc->tf.command =ATA_CMD_PACKET ;
@@ -4065,8 +4053,6 @@ int __ata_scsi_queuecmd(struct scsi_cmnd *scmd, struct ata_device *dev)return 0 ; bad_cdb_len: -DPRINTK ("bad CDB len=%u, scsi_op=0x%02x, max=%u\n" , - scmd->cmd_len, scsi_op, dev->cdb_len); scmd->result =DID_ERROR <<16 ;scsi_done (scmd);return 0 ;
@@ -4532,12 +4518,9 @@ void ata_scsi_hotplug(struct work_struct *work) container_of(work, struct ata_port, hotplug_task.work);int i; -if (ap->pflags &ATA_PFLAG_UNLOADING ) { -DPRINTK ("ENTER/EXIT - unloading\n" ); +if (ap->pflags &ATA_PFLAG_UNLOADING )return ; - } -DPRINTK ("ENTER\n" );mutex_lock (&ap->scsi_scan_mutex);/* Unplug detached devices. We cannot use link iterator here
@@ -4553,7 +4536,6 @@ void ata_scsi_hotplug(struct work_struct *work)ata_scsi_scan_host (ap,0 );mutex_unlock (&ap->scsi_scan_mutex); -DPRINTK ("EXIT\n" ); }/**
Signature · 1 line
2.51.0
Sasha Levin
maintainerPATCH 3/4 ata: libata: remove pointless VPRINTK() calls
In reply to Sasha LevinFrom: Hannes Reinecke <[email protected]>
[ Upstream commit e1553351d747cbcd62db01d579dff916edcc782c ]
Most of the information is already covered by tracepoints (if not downright pointless), so remove the VPRINTK() calls. And while we're at it, remove ata_scsi_dump_cdb(), too, as this information can be retrieved from scsi tracing.
Stable-dep-of: bb3a8154b1a1 ("ata: libata-scsi: refactor ata_scsi_translate()")
--- drivers/ata/libata-core.c | 3 --- drivers/ata/libata-sata.c | 2 -- drivers/ata/libata-scsi.c | 42 --------------------------------------- drivers/ata/libata-sff.c | 4 ---- drivers/ata/libata.h | 1 - 5 files changed, 52 deletions(-)
drivers/ata/libata-core.c +0 -3
@@ -4486,8 +4486,6 @@ static void ata_sg_clean(struct ata_queued_cmd *qc)WARN_ON_ONCE (sg ==NULL ); -VPRINTK ("unmapping %u sg elements\n" , qc->n_elem); -if (qc->n_elem)dma_unmap_sg (ap->dev, sg, qc->orig_n_elem, dir);
@@ -4519,7 +4517,6 @@ static int ata_sg_setup(struct ata_queued_cmd *qc)if (n_elem <1 )return -1 ; -VPRINTK ("%d sg elements mapped\n" , n_elem); qc->orig_n_elem = qc->n_elem; qc->n_elem = n_elem; qc->flags |=ATA_QCFLAG_DMAMAP ;
drivers/ata/libata-sata.c +0 -2
@@ -1270,8 +1270,6 @@ int ata_sas_queuecmd(struct scsi_cmnd *cmd, struct ata_port *ap) {int rc =0 ; -ata_scsi_dump_cdb (ap, cmd); -if (likely (ata_dev_enabled (ap->link.device))) rc =__ata_scsi_queuecmd (cmd, ap->link.device);else {
drivers/ata/libata-scsi.c +0 -42
120 lines not on this page · raw message
drivers/ata/libata-sff.c +0 -4
@@ -888,8 +888,6 @@ static void atapi_pio_bytes(struct ata_queued_cmd *qc)if (unlikely (!bytes)) goto atapi_check; -VPRINTK ("ata%u: xfering %d bytes\n" , ap->print_id, bytes); -if (unlikely (__atapi_pio_bytes (qc, bytes))) goto err_out;ata_sff_sync (ap);/* flush */
@@ -2614,7 +2612,6 @@ static void ata_bmdma_fill_sg(struct ata_queued_cmd *qc) prd[pi].addr =cpu_to_le32 (addr); prd[pi].flags_len =cpu_to_le32 (len &0xffff ); -VPRINTK ("PRD[%u] = (0x%X, 0x%X)\n" , pi, addr, len); pi++; sg_len -= len;
@@ -2674,7 +2671,6 @@ static void ata_bmdma_fill_sg_dumb(struct ata_queued_cmd *qc) prd[++pi].addr =cpu_to_le32 (addr +0x8000 ); } prd[pi].flags_len =cpu_to_le32 (blen); -VPRINTK ("PRD[%u] = (0x%X, 0x%X)\n" , pi, addr, len); pi++; sg_len -= len;
drivers/ata/libata.h +0 -1
@@ -150,7 +150,6 @@ extern int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel, unsigned int id, u64 lun);void ata_scsi_sdev_config (struct scsi_device *sdev);int ata_scsi_dev_config (struct scsi_device *sdev,struct ata_device *dev); -void ata_scsi_dump_cdb (struct ata_port *ap,struct scsi_cmnd *cmd);int __ata_scsi_queuecmd (struct scsi_cmnd *scmd,struct ata_device *dev);/* libata-eh.c */
Signature · 1 line
2.51.0
Sasha Levin
maintainerPATCH 4/4 ata: libata-scsi: refactor ata_scsi_translate()
In reply to Sasha LevinFrom: Damien Le Moal <[email protected]>
[ Upstream commit bb3a8154b1a1dc2c86d037482c0a2cf9186829ed ]
Factor out of ata_scsi_translate() the code handling queued command deferral using the port qc_defer callback and issuing the queued command with ata_qc_issue() into the new function ata_scsi_qc_issue(), and simplify the goto used in ata_scsi_translate().
While at it, also add a lockdep annotation to check that the port lock is held when ata_scsi_translate() is called.
No functional changes.
--- drivers/ata/libata-scsi.c | 81 ++++++++++++++++++++++++--------------- 1 file changed, 50 insertions(+), 31 deletions(-)
drivers/ata/libata-scsi.c +50 -31
@@ -1670,6 +1670,42 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc)ata_qc_done (qc); } +static int ata_scsi_qc_issue (struct ata_port *ap,struct ata_queued_cmd *qc) +{ +int ret; + +if (!ap->ops->qc_defer) + goto issue; + +/* Check if the command needs to be deferred. */ + ret = ap->ops->qc_defer (qc); +switch (ret) { +case 0 : +break ; +case ATA_DEFER_LINK : + ret =SCSI_MLQUEUE_DEVICE_BUSY ; +break ; +case ATA_DEFER_PORT : + ret =SCSI_MLQUEUE_HOST_BUSY ; +break ; +default : +WARN_ON_ONCE (1 ); + ret =SCSI_MLQUEUE_HOST_BUSY ; +break ; + } + +if (ret) { +/* Force a requeue of the command to defer its execution. */ +ata_qc_free (qc); +return ret; + } + +issue: +ata_qc_issue (qc); + +return 0 ; +} +/** * ata_scsi_translate - Translate then issue SCSI command to ATA device * @dev: ATA device to which the command is addressed
@@ -1693,66 +1729,49 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc)* spin_lock_irqsave(host lock) * * RETURNS: -* 0 on success, SCSI_ML_QUEUE_DEVICE_BUSY if the command -* needs to be deferred. +* 0 on success, SCSI_ML_QUEUE_DEVICE_BUSY or SCSI_MLQUEUE_HOST_BUSY if the +* command needs to be deferred. */ static int ata_scsi_translate (struct ata_device *dev,struct scsi_cmnd *cmd,ata_xlat_func_t xlat_func) {struct ata_port *ap = dev->link->ap;struct ata_queued_cmd *qc; -int rc; +lockdep_assert_held (ap->lock); + +/* +* ata_scsi_qc_new() calls scsi_done(cmd) in case of failure. So we +* have nothing further to do when allocating a qc fails. +*/ qc =ata_scsi_qc_new (dev, cmd);if (!qc) - goto err_mem; +return 0 ;/* data is present; dma-map it */ if (cmd->sc_data_direction ==DMA_FROM_DEVICE || cmd->sc_data_direction ==DMA_TO_DEVICE ) {if (unlikely (scsi_bufflen (cmd) <1 )) {ata_dev_warn (dev,"WARNING: zero len r/w req\n" ); - goto err_did; + cmd->result = (DID_ERROR <<16 ); + goto done; }ata_sg_init (qc,scsi_sglist (cmd),scsi_sg_count (cmd)); - qc->dma_dir = cmd->sc_data_direction; } qc->complete_fn = ata_scsi_qc_complete;if (xlat_func (qc)) - goto early_finish; - -if (ap->ops->qc_defer) { -if ((rc = ap->ops->qc_defer (qc))) - goto defer; - } - -/* select device, send command to hardware */ -ata_qc_issue (qc); + goto done; -return 0 ; - -early_finish: -ata_qc_free (qc); -scsi_done (cmd); -return 0 ; +return ata_scsi_qc_issue (ap, qc); -err_did: +done:ata_qc_free (qc); - cmd->result = (DID_ERROR <<16 );scsi_done (cmd); -err_mem:return 0 ; - -defer: -ata_qc_free (qc); -if (rc ==ATA_DEFER_LINK ) -return SCSI_MLQUEUE_DEVICE_BUSY ; -else -return SCSI_MLQUEUE_HOST_BUSY ; }struct ata_scsi_args {
Signature · 1 line
2.51.0