FAILED: patch "[PATCH] ata: libata-scsi: refactor ata_scsi_translate()" failed to apply to 5.10-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 5.10-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.10.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-quote-freefall-2523@gregkh' --subject-prefix 'PATCH 5.10.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/2 ata: libata: remove pointless VPRINTK() calls
From: 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
@@ -4461,8 +4461,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);
@@ -4494,7 +4492,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
@@ -1258,8 +1258,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 2/2 ata: libata-scsi: refactor ata_scsi_translate()
From: 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 | 83 +++++++++++++++++++++++---------------- 1 file changed, 50 insertions(+), 33 deletions(-)
drivers/ata/libata-scsi.c +50 -33
@@ -1668,6 +1668,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
@@ -1691,69 +1727,50 @@ 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 ; +return ata_scsi_qc_issue (ap, qc); -early_finish: +done:ata_qc_free (qc); 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); -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 -return SCSI_MLQUEUE_HOST_BUSY ; }struct ata_scsi_args {
Signature · 1 line
2.51.0