{"id":2175863,"url":"http://patchwork.ozlabs.org/api/1.0/patches/2175863/?format=json","project":{"id":13,"url":"http://patchwork.ozlabs.org/api/1.0/projects/13/?format=json","name":"Linux IDE development","link_name":"linux-ide","list_id":"linux-ide.vger.kernel.org","list_email":"linux-ide@vger.kernel.org","web_url":null,"scm_url":null,"webscm_url":null},"msgid":"<20251219075134.501727-2-dlemoal@kernel.org>","date":"2025-12-19T07:51:33","name":"[v2,1/2] ata: libata-scsi: refactor ata_scsi_translate()","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"b4577c57d0742b1d2e24770d3c4712eca99bcdd5","submitter":{"id":86188,"url":"http://patchwork.ozlabs.org/api/1.0/people/86188/?format=json","name":"Damien Le Moal","email":"dlemoal@kernel.org"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/linux-ide/patch/20251219075134.501727-2-dlemoal@kernel.org/mbox/","series":[{"id":485960,"url":"http://patchwork.ozlabs.org/api/1.0/series/485960/?format=json","date":"2025-12-19T07:51:32","name":"Prevent non-NCQ command starvation","version":2,"mbox":"http://patchwork.ozlabs.org/series/485960/mbox/"}],"check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2175863/checks/","tags":{},"headers":{"Return-Path":"\n <linux-ide+bounces-4806-incoming=patchwork.ozlabs.org@vger.kernel.org>","X-Original-To":["incoming@patchwork.ozlabs.org","linux-ide@vger.kernel.org"],"Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256\n header.s=k20201202 header.b=u3fDrj5f;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=2600:3c0a:e001:db::12fc:5321; helo=sea.lore.kernel.org;\n envelope-from=linux-ide+bounces-4806-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)","smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org\n header.b=\"u3fDrj5f\"","smtp.subspace.kernel.org;\n arc=none smtp.client-ip=10.30.226.201"],"Received":["from sea.lore.kernel.org (sea.lore.kernel.org\n [IPv6:2600:3c0a:e001:db::12fc:5321])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4dXfyh3cM4z1y3t\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 19 Dec 2025 18:57:32 +1100 (AEDT)","from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sea.lore.kernel.org (Postfix) with ESMTP id 34B58301C3EE\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 19 Dec 2025 07:56:05 +0000 (UTC)","from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 549081A8F84;\n\tFri, 19 Dec 2025 07:56:04 +0000 (UTC)","from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org\n [10.30.226.201])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id 14275246BBA\n\tfor <linux-ide@vger.kernel.org>; Fri, 19 Dec 2025 07:56:03 +0000 (UTC)","by smtp.kernel.org (Postfix) with ESMTPSA id 22832C116B1;\n\tFri, 19 Dec 2025 07:56:03 +0000 (UTC)"],"ARC-Seal":"i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1766130964; cv=none;\n b=pJuoc3vqS5F8d/HQFNWvvcWLTc5EB7LAR+C7e9B9bIA3sL/t7Ps4z0OasoS6jYKUAd/nMvryUjbMHwwJkdqU3wqqIjybIRJi35srDLffn9Rd+5x+R9G69xY/OD1/a6F8PrbGwRHsRaIGCDP9+Wcg3cyynXLCkvA8I3fXYCGLroU=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1766130964; c=relaxed/simple;\n\tbh=CPoyAbuk6Gz/8xzUr4zU7H2z7Po9wWi83kqnjF9gSKs=;\n\th=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:\n\t MIME-Version;\n b=OQfl0WbmYvI+wMyiFo4HZ20f0SJ1I19NeaMmc2wXA+cNBI0z1J1EWpVbSnH3Tq9qBN+1Lqtg8FlHUMOeEGAeIK6tVjiynaqVdnQps1hm03i8dXKMSBrX9kUVn0CHs5L9a9B7+yuOQ0G4zDX5AhDpFRWK5bBlE7LvL+U0nJ9CC5A=","ARC-Authentication-Results":"i=1; smtp.subspace.kernel.org;\n dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org\n header.b=u3fDrj5f; arc=none smtp.client-ip=10.30.226.201","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;\n\ts=k20201202; t=1766130963;\n\tbh=CPoyAbuk6Gz/8xzUr4zU7H2z7Po9wWi83kqnjF9gSKs=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=u3fDrj5fW8lICHNdXwdcbHZwO+KjXBgsjpQTcfl5rtesALaBQrLQ0boMdPUQJEAwD\n\t IR0CLLJCm0IY+aVTr1TLVjY9mcwO7PzjeE7njV79Z7Q0pNz42+4mDfidXJAkyn7b6Q\n\t rDVlkjrGJcBxIdyPJyLwmuaPsMqDV7V7ZZlJwGa+v8XpKA41HzyQyMBHUGoEk9hcxo\n\t gYJEAQ+tI+gnBgy9L7yK84T2QPFNc6M3IAX4DLrGlvHnaOXAeqnSAh3uxy/d7RgtLD\n\t ipiSeu1h6VdJjcXIHKP3Vq6IFj+2YyKR7JzqyHmEUrgGBRHh1EXP2XcPRMxAcch4wr\n\t ScUk1MaF0o7sw==","From":"Damien Le Moal <dlemoal@kernel.org>","To":"linux-ide@vger.kernel.org,\n\tNiklas Cassel <cassel@kernel.org>","Cc":"Igor Pylypiv <ipylypiv@google.com>,\n\tXingui Yang <yangxingui@huawei.com>","Subject":"[PATCH v2 1/2] ata: libata-scsi: refactor ata_scsi_translate()","Date":"Fri, 19 Dec 2025 16:51:33 +0900","Message-ID":"<20251219075134.501727-2-dlemoal@kernel.org>","X-Mailer":"git-send-email 2.52.0","In-Reply-To":"<20251219075134.501727-1-dlemoal@kernel.org>","References":"<20251219075134.501727-1-dlemoal@kernel.org>","Precedence":"bulk","X-Mailing-List":"linux-ide@vger.kernel.org","List-Id":"<linux-ide.vger.kernel.org>","List-Subscribe":"<mailto:linux-ide+subscribe@vger.kernel.org>","List-Unsubscribe":"<mailto:linux-ide+unsubscribe@vger.kernel.org>","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit"},"content":"Factor out of ata_scsi_translate() the code handling queued command\ndeferral using the port qc_defer callback into the new function\nata_scsi_defer(), and simplify the goto used in ata_scsi_translate().\nWhile at it, also add a lockdep annotation to check that the port lock\nis held when ata_scsi_translate() is called.\n\nNo functional changes.\n\nReviewed-by: Hannes Reinecke <hare@suse.de>\nSigned-off-by: Damien Le Moal <dlemoal@kernel.org>\n---\n drivers/ata/libata-scsi.c | 66 ++++++++++++++++++++++++---------------\n 1 file changed, 40 insertions(+), 26 deletions(-)","diff":"diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c\nindex 721d3f270c8e..42d103542525 100644\n--- a/drivers/ata/libata-scsi.c\n+++ b/drivers/ata/libata-scsi.c\n@@ -1691,6 +1691,30 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc)\n \tata_qc_done(qc);\n }\n \n+static int ata_scsi_defer(struct ata_port *ap, struct ata_queued_cmd *qc)\n+{\n+\tint ret;\n+\n+\tif (!ap->ops->qc_defer)\n+\t\treturn 0;\n+\n+\tret = ap->ops->qc_defer(qc);\n+\tif (!ret)\n+\t\treturn 0;\n+\n+\tata_qc_free(qc);\n+\n+\tswitch (ret) {\n+\tcase ATA_DEFER_LINK:\n+\t\treturn SCSI_MLQUEUE_DEVICE_BUSY;\n+\tcase ATA_DEFER_PORT:\n+\t\treturn SCSI_MLQUEUE_HOST_BUSY;\n+\tdefault:\n+\t\tWARN_ON_ONCE(1);\n+\t\treturn SCSI_MLQUEUE_HOST_BUSY;\n+\t}\n+}\n+\n /**\n  *\tata_scsi_translate - Translate then issue SCSI command to ATA device\n  *\t@dev: ATA device to which the command is addressed\n@@ -1714,8 +1738,8 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc)\n  *\tspin_lock_irqsave(host lock)\n  *\n  *\tRETURNS:\n- *\t0 on success, SCSI_ML_QUEUE_DEVICE_BUSY if the command\n- *\tneeds to be deferred.\n+ *\t0 on success, SCSI_ML_QUEUE_DEVICE_BUSY or SCSI_MLQUEUE_HOST_BUSY if the\n+ *\tcommand needs to be deferred.\n  */\n static int ata_scsi_translate(struct ata_device *dev, struct scsi_cmnd *cmd,\n \t\t\t      ata_xlat_func_t xlat_func)\n@@ -1724,56 +1748,46 @@ static int ata_scsi_translate(struct ata_device *dev, struct scsi_cmnd *cmd,\n \tstruct ata_queued_cmd *qc;\n \tint rc;\n \n+\tlockdep_assert_held(ap->lock);\n+\n+\t/*\n+\t * If we fail to allocate a qc, simply return without reporting an error\n+\t * as scsi_done(cmd) is already called.\n+\t */\n \tqc = ata_scsi_qc_new(dev, cmd);\n \tif (!qc)\n-\t\tgoto err_mem;\n+\t\treturn 0;\n \n \t/* data is present; dma-map it */\n \tif (cmd->sc_data_direction == DMA_FROM_DEVICE ||\n \t    cmd->sc_data_direction == DMA_TO_DEVICE) {\n \t\tif (unlikely(scsi_bufflen(cmd) < 1)) {\n \t\t\tata_dev_warn(dev, \"WARNING: zero len r/w req\\n\");\n-\t\t\tgoto err_did;\n+\t\t\tcmd->result = (DID_ERROR << 16);\n+\t\t\tgoto done;\n \t\t}\n \n \t\tata_sg_init(qc, scsi_sglist(cmd), scsi_sg_count(cmd));\n-\n \t\tqc->dma_dir = cmd->sc_data_direction;\n \t}\n \n \tqc->complete_fn = ata_scsi_qc_complete;\n \n \tif (xlat_func(qc))\n-\t\tgoto early_finish;\n+\t\tgoto done;\n \n-\tif (ap->ops->qc_defer) {\n-\t\tif ((rc = ap->ops->qc_defer(qc)))\n-\t\t\tgoto defer;\n-\t}\n+\trc = ata_scsi_defer(ap, qc);\n+\tif (rc)\n+\t\treturn rc;\n \n-\t/* select device, send command to hardware */\n \tata_qc_issue(qc);\n \n \treturn 0;\n \n-early_finish:\n-\tata_qc_free(qc);\n-\tscsi_done(cmd);\n-\treturn 0;\n-\n-err_did:\n+done:\n \tata_qc_free(qc);\n-\tcmd->result = (DID_ERROR << 16);\n \tscsi_done(cmd);\n-err_mem:\n \treturn 0;\n-\n-defer:\n-\tata_qc_free(qc);\n-\tif (rc == ATA_DEFER_LINK)\n-\t\treturn SCSI_MLQUEUE_DEVICE_BUSY;\n-\telse\n-\t\treturn SCSI_MLQUEUE_HOST_BUSY;\n }\n \n /**\n","prefixes":["v2","1/2"]}