| From 2aead4b445abaf4fb9789dd3c5c4456f979bfb90 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 20 May 2025 13:20:37 -0700 |
| Subject: nvme: fix command limits status code |
| |
| From: Keith Busch <kbusch@kernel.org> |
| |
| [ Upstream commit 10f4a7cd724e34b7a6ff96e57ac49dc0cadececc ] |
| |
| The command specific status code, 0x183, was introduced in the NVMe 2.0 |
| specification defined to "Command Size Limits Exceeded" and only ever |
| applied to DSM and Copy commands. Fix the name and, remove the |
| incorrect translation to error codes and special treatment in the |
| target code for it. |
| |
| Fixes: 3b7c33b28a44d4 ("nvme.h: add Write Zeroes definitions") |
| Cc: Chaitanya Kulkarni <chaitanyak@nvidia.com> |
| Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com> |
| Signed-off-by: Christoph Hellwig <hch@lst.de> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/nvme/host/constants.c | 2 +- |
| drivers/nvme/host/core.c | 1 - |
| drivers/nvme/host/pr.c | 2 -- |
| drivers/nvme/target/core.c | 9 +-------- |
| drivers/nvme/target/io-cmd-bdev.c | 9 +-------- |
| include/linux/nvme.h | 2 +- |
| 6 files changed, 4 insertions(+), 21 deletions(-) |
| |
| diff --git a/drivers/nvme/host/constants.c b/drivers/nvme/host/constants.c |
| index 2b9e6cfaf2a80..1a0058be58210 100644 |
| --- a/drivers/nvme/host/constants.c |
| +++ b/drivers/nvme/host/constants.c |
| @@ -145,7 +145,7 @@ static const char * const nvme_statuses[] = { |
| [NVME_SC_BAD_ATTRIBUTES] = "Conflicting Attributes", |
| [NVME_SC_INVALID_PI] = "Invalid Protection Information", |
| [NVME_SC_READ_ONLY] = "Attempted Write to Read Only Range", |
| - [NVME_SC_ONCS_NOT_SUPPORTED] = "ONCS Not Supported", |
| + [NVME_SC_CMD_SIZE_LIM_EXCEEDED ] = "Command Size Limits Exceeded", |
| [NVME_SC_ZONE_BOUNDARY_ERROR] = "Zoned Boundary Error", |
| [NVME_SC_ZONE_FULL] = "Zone Is Full", |
| [NVME_SC_ZONE_READ_ONLY] = "Zone Is Read Only", |
| diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c |
| index 98dad1bdff440..eca764fede48f 100644 |
| --- a/drivers/nvme/host/core.c |
| +++ b/drivers/nvme/host/core.c |
| @@ -284,7 +284,6 @@ static blk_status_t nvme_error_status(u16 status) |
| case NVME_SC_NS_NOT_READY: |
| return BLK_STS_TARGET; |
| case NVME_SC_BAD_ATTRIBUTES: |
| - case NVME_SC_ONCS_NOT_SUPPORTED: |
| case NVME_SC_INVALID_OPCODE: |
| case NVME_SC_INVALID_FIELD: |
| case NVME_SC_INVALID_NS: |
| diff --git a/drivers/nvme/host/pr.c b/drivers/nvme/host/pr.c |
| index dc7922f226004..80dd09aa01a3b 100644 |
| --- a/drivers/nvme/host/pr.c |
| +++ b/drivers/nvme/host/pr.c |
| @@ -82,8 +82,6 @@ static int nvme_status_to_pr_err(int status) |
| return PR_STS_SUCCESS; |
| case NVME_SC_RESERVATION_CONFLICT: |
| return PR_STS_RESERVATION_CONFLICT; |
| - case NVME_SC_ONCS_NOT_SUPPORTED: |
| - return -EOPNOTSUPP; |
| case NVME_SC_BAD_ATTRIBUTES: |
| case NVME_SC_INVALID_OPCODE: |
| case NVME_SC_INVALID_FIELD: |
| diff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c |
| index ed2424f8a396e..4606c88136669 100644 |
| --- a/drivers/nvme/target/core.c |
| +++ b/drivers/nvme/target/core.c |
| @@ -62,14 +62,7 @@ inline u16 errno_to_nvme_status(struct nvmet_req *req, int errno) |
| return NVME_SC_LBA_RANGE | NVME_STATUS_DNR; |
| case -EOPNOTSUPP: |
| req->error_loc = offsetof(struct nvme_common_command, opcode); |
| - switch (req->cmd->common.opcode) { |
| - case nvme_cmd_dsm: |
| - case nvme_cmd_write_zeroes: |
| - return NVME_SC_ONCS_NOT_SUPPORTED | NVME_STATUS_DNR; |
| - default: |
| - return NVME_SC_INVALID_OPCODE | NVME_STATUS_DNR; |
| - } |
| - break; |
| + return NVME_SC_INVALID_OPCODE | NVME_STATUS_DNR; |
| case -ENODATA: |
| req->error_loc = offsetof(struct nvme_rw_command, nsid); |
| return NVME_SC_ACCESS_DENIED; |
| diff --git a/drivers/nvme/target/io-cmd-bdev.c b/drivers/nvme/target/io-cmd-bdev.c |
| index eaf31c823cbe8..73ecbc13c5b23 100644 |
| --- a/drivers/nvme/target/io-cmd-bdev.c |
| +++ b/drivers/nvme/target/io-cmd-bdev.c |
| @@ -145,15 +145,8 @@ u16 blk_to_nvme_status(struct nvmet_req *req, blk_status_t blk_sts) |
| req->error_loc = offsetof(struct nvme_rw_command, slba); |
| break; |
| case BLK_STS_NOTSUPP: |
| + status = NVME_SC_INVALID_OPCODE | NVME_STATUS_DNR; |
| req->error_loc = offsetof(struct nvme_common_command, opcode); |
| - switch (req->cmd->common.opcode) { |
| - case nvme_cmd_dsm: |
| - case nvme_cmd_write_zeroes: |
| - status = NVME_SC_ONCS_NOT_SUPPORTED | NVME_STATUS_DNR; |
| - break; |
| - default: |
| - status = NVME_SC_INVALID_OPCODE | NVME_STATUS_DNR; |
| - } |
| break; |
| case BLK_STS_MEDIUM: |
| status = NVME_SC_ACCESS_DENIED; |
| diff --git a/include/linux/nvme.h b/include/linux/nvme.h |
| index 1c101f6fad2f3..84d4f0657b7a8 100644 |
| --- a/include/linux/nvme.h |
| +++ b/include/linux/nvme.h |
| @@ -1954,7 +1954,7 @@ enum { |
| NVME_SC_BAD_ATTRIBUTES = 0x180, |
| NVME_SC_INVALID_PI = 0x181, |
| NVME_SC_READ_ONLY = 0x182, |
| - NVME_SC_ONCS_NOT_SUPPORTED = 0x183, |
| + NVME_SC_CMD_SIZE_LIM_EXCEEDED = 0x183, |
| |
| /* |
| * I/O Command Set Specific - Fabrics commands: |
| -- |
| 2.39.5 |
| |