From: Andrea Parri <parri.andrea@gmail.com>
To: Justin Tee <justintee8345@gmail.com>,
Naresh Gottumukkala <nareshgottumukkala83@gmail.com>,
Paul Ely <paul.ely@broadcom.com>, Christoph Hellwig <hch@lst.de>,
Sagi Grimberg <sagi@grimberg.me>,
Chaitanya Kulkarni <kch@nvidia.com>
Cc: "Andrea Parri" <parri.andrea@gmail.com>,
"James Smart" <jsmart833426@gmail.com>,
"Johannes Thumshirn" <johannes.thumshirn@wdc.com>,
"Damien Le Moal" <dlemoal@kernel.org>,
"Keith Busch" <kbusch@kernel.org>,
"Manivannan Sadhasivam" <mani@kernel.org>,
"Krzysztof Wilczyński" <kwilczynski@kernel.org>,
"Niklas Cassel" <cassel@kernel.org>,
linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org
Subject: [PATCH v2 0/4] nvmet: fix read data, status and length checks in fc, zns and pci-epf
Date: Thu, 22 Oct 2026 15:29:29 +0200 [thread overview]
Message-ID: <20261022132934.3592924-1-parri.andrea@gmail.com> (raw)
A connected host can currently receive stale target memory through two
nvmet transports, and ZNS answers a Zone Management Receive whose NUMD
byte count wraps.
The FC transport sends a read buffer even when the command completes with
an error. Some errors occur before the command handler initializes that
buffer, so the host receives data left in the allocation.
The PCI endpoint transport allocates each read segment at the length of
the host's SGL data descriptor and sends every segment in full, even when
the descriptors describe more than the command transfers. The excess
reaches the host uninitialized, on any successful read.
Patch 1 makes the FC transport send read data only for successful
commands, matching the TCP and RDMA transports. Patch 2 rejects NUMD
values whose byte count wraps the u32 length calculation instead of
accepting the wrapped request.
Patch 3 fixes a related PCI endpoint bug that patch 4 depends on. The
transport reports every error it detects itself as a successful
completion, because nvmet_pci_epf_complete_iod() reloads the status from
a CQE that only the nvmet core fills in, so even a write whose data
could not be fetched is reported as written. Patch 4 then makes the
transport reject SGLs whose data descriptors do not add up to the
command's data length.
Patches 1 and 2 were tested on top of nvme-7.4 over the loop, tcp, rdma
(rdma_rxe) and fc (fcloop) transports, with a zoned null_blk namespace
for patch 2. Without them, a failed Identify over fc returns data and a
wrapping NUMD is accepted; with them, neither occurs on any of the four
transports.
blktests nvme/072 and nvme/074 cover patches 1 and 2:
https://lore.kernel.org/r/20261022130927.3583166-1-parri.andrea@gmail.com
Their results in virtme-ng VMs, on v7.3-rc4-108-g551c722f4080 without
the fixes and on nvme-7.4 with this series applied:
loop tcp rdma fc
unpatched 072 pass pass pass FAIL failed Identify transferred
4096 bytes
074 FAIL FAIL FAIL FAIL NUMD 0x4000000f not rejected
patched both pass pass pass pass
Niklas Cassel tested patches 3 and 4 on PCI endpoint hardware with fio
over SGLs, with no change in performance; that exercises the normal
paths, not the new error paths. The pci-epf side of patch 2 is
build-tested only.
An LLM found the bugs fixed here and wrote the fixes. Following commit
1e035297ffda ("docs: remove Assisted-by references"), this is noted here
rather than in Assisted-by trailers.
Changes since v1:
- Dropped commit 31b8a6af19b7 ("nvmet: zns: don't leak stale memory in
zone management receive"), applied to nvme-7.4.
- Patch 2: check NUMD at the start of
nvmet_bdev_execute_zone_mgmt_recv() and in nvmet_io_cmd_transfer_len(),
before any (numd + 1) << 2 is computed, and drop the over-long comment
line (Christoph).
- Patches 3 and 4: add Niklas's Tested-by.
- Patches 1, 3 and 4: no code changes.
- All patches: drop the Assisted-by trailers; LLM use is noted above.
- Rebased on nvme-7.4.
v1: https://lore.kernel.org/r/20261012141239.156408-1-parri.andrea@gmail.com
Andrea Parri (4):
nvmet-fc: only send read data for successful commands
nvmet: zns: reject a NUMD whose byte count wraps
nvmet: pci-epf: report transport errors in command completions
nvmet: pci-epf: require SGLs to match the command data length
drivers/nvme/target/core.c | 3 +++
drivers/nvme/target/fc.c | 8 ++++----
drivers/nvme/target/pci-epf.c | 30 +++++++++++++++++++++++++++---
drivers/nvme/target/zns.c | 12 ++++++++++--
4 files changed, 44 insertions(+), 9 deletions(-)
base-commit: 2e8e30b3cf9f165e1a1d079331543cb7f2ad0e0c
--
2.53.0
next reply other threads:[~2026-10-22 13:29 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-22 13:29 Andrea Parri [this message]
2026-10-22 13:29 ` [PATCH v2 1/4] nvmet-fc: only send read data for successful commands Andrea Parri
2026-10-22 13:29 ` [PATCH v2 2/4] nvmet: zns: reject a NUMD whose byte count wraps Andrea Parri
2026-10-22 13:29 ` [PATCH v2 3/4] nvmet: pci-epf: report transport errors in command completions Andrea Parri
2026-10-22 13:29 ` [PATCH v2 4/4] nvmet: pci-epf: require SGLs to match the command data length Andrea Parri
2026-10-22 15:16 ` [PATCH v2 0/4] nvmet: fix read data, status and length checks in fc, zns and pci-epf Keith Busch
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261022132934.3592924-1-parri.andrea@gmail.com \
--to=parri.andrea@gmail.com \
--cc=cassel@kernel.org \
--cc=dlemoal@kernel.org \
--cc=hch@lst.de \
--cc=johannes.thumshirn@wdc.com \
--cc=jsmart833426@gmail.com \
--cc=justintee8345@gmail.com \
--cc=kbusch@kernel.org \
--cc=kch@nvidia.com \
--cc=kwilczynski@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-nvme@lists.infradead.org \
--cc=mani@kernel.org \
--cc=nareshgottumukkala83@gmail.com \
--cc=paul.ely@broadcom.com \
--cc=sagi@grimberg.me \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®