[PATCH v2] nvmet: preserve ANA log page copy errors
From: Sreeraj S Kurup
Date: Sat Oct 31 2026 - 05:35:05 EST
Preserve errors encountered while copying ANA group
descriptors instead of unconditionally overwriting
them with the result of copying the ANA log page
header.
Ensure that allocation failures are reported correctly
and that short ANA log page reads can still return the
header containing the change count and group count.
Preserve genuine descriptor-copy and header-copy
errors.
Signed-off-by: Sreeraj S Kurup <sreekuttan2156239@xxxxxxxxx>
---
v2:
- Preserve the allocation failure status.
- Handle short ANA log-page reads by checking
descriptor length against the requested transfer
length before copying.
- Preserve genuine descriptor and header copy errors.
drivers/nvme/target/admin-cmd.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/drivers/nvme/target/admin-cmd.c b/drivers/nvme/target/admin-cmd.c
index 26028be8fe4d..b0bcfbc94b93 100644
--- a/drivers/nvme/target/admin-cmd.c
+++ b/drivers/nvme/target/admin-cmd.c
@@ -542,17 +542,23 @@ static void nvmet_execute_get_log_page_ana(struct nvmet_req *req)
u32 grpid;
u16 ngrps = 0;
u16 status;
+ u16 header_status;
status = NVME_SC_INTERNAL;
desc = kmalloc_flex(*desc, nsids, NVMET_MAX_NAMESPACES);
if (!desc)
goto out;
+ status = NVME_SC_SUCCESS;
+
down_read(&nvmet_ana_sem);
for (grpid = 1; grpid <= NVMET_MAX_ANAGRPS; grpid++) {
if (!nvmet_ana_group_enabled[grpid])
continue;
len = nvmet_format_ana_group(req, grpid, desc);
+ if (offset > req->transfer_len || len > req->transfer_len - offset)
+ break;
+
status = nvmet_copy_to_sgl(req, offset, desc, len);
if (status)
break;
@@ -572,7 +578,9 @@ static void nvmet_execute_get_log_page_ana(struct nvmet_req *req)
kfree(desc);
/* copy the header last once we know the number of groups */
- status = nvmet_copy_to_sgl(req, 0, &hdr, sizeof(hdr));
+ header_status = nvmet_copy_to_sgl(req, 0, &hdr, sizeof(hdr));
+ if (!status)
+ status = header_status;
out:
nvmet_req_complete(req, status);
}
--
2.55.0