From: Zhengrong Li <zhengrong_li@linux.alibaba.com>
To: linux-nvme@lists.infradead.org
Cc: hch@lst.de, sagi@grimberg.me, kch@nvidia.com,
zhengrong_li@linux.alibaba.com
Subject: [PATCH] nvmet: fix Reservation Register Replace for unregistered host with IEKEY
Date: Sat, 25 Jul 2026 11:50:54 +0800 [thread overview]
Message-ID: <178521959386.52051.17173420094473200063@linux.alibaba.com> (raw)
When a host sends a Reservation Register command with RREGA=Replace
and IEKEY=1 without being previously registered, nvmet returns
Reservation Conflict. SPDK accepts this combination and creates a
new registrant with the provided NRKEY, with an explicit unit test
covering this scenario (test/unit/lib/nvmf/subsystem.c).
Fix nvmet_pr_replace() to add a new registrant when the host is not
found in the registrant list and IEKEY is set with a non-zero NRKEY,
consistent with SPDK's behavior.
Tested with nvme-cli against nvmet-tcp:
# no prior registration
nvme resv-register /dev/nvmeXn1 -n 1 --rrega=2 --iekey --nrkey=0x9999
Before: RESERVATION_CONFLICT (0x4083)
After: success, registrant created with rkey 0x9999
Signed-off-by: Zhengrong Li <zhengrong_li@linux.alibaba.com>
---
drivers/nvme/target/pr.c | 20 +++++++++++++++++++-
1 file changed, 19 insertions(+), 1 deletion(-)
diff --git a/drivers/nvme/target/pr.c b/drivers/nvme/target/pr.c
index c71ae46244ff..f00de35683ca 100644
--- a/drivers/nvme/target/pr.c
+++ b/drivers/nvme/target/pr.c
@@ -355,12 +355,14 @@ static u16 nvmet_pr_replace(struct nvmet_req *req,
u16 status = NVME_SC_RESERVATION_CONFLICT | NVME_STATUS_DNR;
struct nvmet_ctrl *ctrl = req->sq->ctrl;
struct nvmet_pr *pr = &req->ns->pr;
- struct nvmet_pr_registrant *reg;
+ struct nvmet_pr_registrant *reg, *new;
u64 nrkey = le64_to_cpu(d->nrkey);
+ bool found = false;
down(&pr->pr_sem);
list_for_each_entry_rcu(reg, &pr->registrant_list, entry) {
if (uuid_equal(®->hostid, &ctrl->hostid)) {
+ found = true;
if (ignore_key || reg->rkey == le64_to_cpu(d->crkey))
status = nvmet_pr_update_reg_attr(pr, reg,
nvmet_pr_update_reg_rkey,
@@ -368,6 +370,22 @@ static u16 nvmet_pr_replace(struct nvmet_req *req,
break;
}
}
+
+ if (!found && ignore_key && nrkey) {
+ new = kmalloc_obj(*new);
+ if (!new) {
+ status = NVME_SC_INTERNAL;
+ goto out;
+ }
+ memset(new, 0, sizeof(*new));
+ INIT_LIST_HEAD(&new->entry);
+ new->rkey = nrkey;
+ uuid_copy(&new->hostid, &ctrl->hostid);
+ list_add_tail_rcu(&new->entry, &pr->registrant_list);
+ status = NVME_SC_SUCCESS;
+ }
+
+out:
up(&pr->pr_sem);
return status;
}
--
2.43.7
next reply other threads:[~2026-07-28 6:22 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-25 3:50 Zhengrong Li [this message]
2026-07-28 7:52 ` [PATCH] nvmet: fix Reservation Register Replace for unregistered host with IEKEY Maurizio Lombardi
2026-07-28 8:26 ` [PATCH v3] " Zhengrong Li
2026-07-28 8:26 ` [PATCH v4] " Zhengrong Li
2026-07-30 4:36 ` Guixin Liu
2026-07-28 8:26 ` [PATCH v2] " Zhengrong Li
2026-07-28 12:44 ` Guixin Liu
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=178521959386.52051.17173420094473200063@linux.alibaba.com \
--to=zhengrong_li@linux.alibaba.com \
--cc=hch@lst.de \
--cc=kch@nvidia.com \
--cc=linux-nvme@lists.infradead.org \
--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