From: Guixin Liu <kanie@linux.alibaba.com>
To: Zhengrong Li <zhengrong_li@linux.alibaba.com>,
linux-nvme@lists.infradead.org
Cc: hch@lst.de, sagi@grimberg.me, kch@nvidia.com, mlombard@arkamax.eu
Subject: Re: [PATCH v2] nvmet: fix Reservation Register Replace for unregistered host with IEKEY
Date: Tue, 28 Jul 2026 20:44:48 +0800 [thread overview]
Message-ID: <3974a955-ac5a-4394-9d20-908993bdbd27@linux.alibaba.com> (raw)
In-Reply-To: <178522866228.3074.13245921492128352379@linux.alibaba.com>
Hi Zhengrong:
在 2026/7/28 16:26, Zhengrong Li 写道:
> 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.
Just quote the NVMe spec rather than mentioning SPDK.
>
> 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
Here need add: Fixes: 5a47c2080a73 ("nvmet: support reservation feature").
> Signed-off-by: Zhengrong Li <zhengrong_li@linux.alibaba.com>
> ---
> Changes since v1:
> - Use kzalloc_obj() instead of kmalloc_obj() + memset() (Maurizio).
> ---
> drivers/nvme/target/pr.c | 19 ++++++++++++++++++-
> 1 file changed, 18 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/nvme/target/pr.c b/drivers/nvme/target/pr.c
> index c71ae46244ff..944e3d3947d0 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,21 @@ static u16 nvmet_pr_replace(struct nvmet_req *req,
> break;
> }
> }
> +
> + if (!found && ignore_key && nrkey) {
> + new = kzalloc_obj(*new);
Nit: you can alloc new before down(&pr->pr_sem).
> + if (!new) {
> + status = NVME_SC_INTERNAL;
> + goto out;
> + }
> + 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;
> + }
> +
If the nrkey==0, should return NVME_SC_INVALID_FIELD | NVME_STATUS_DNR
instead of
NVME_SC_RESERVATION_CONFLICT | NVME_STATUS_DNR;
> +out:
> up(&pr->pr_sem);
> return status;
> }
Others looks good, thanks.
Best Regards,
Guixin Liu
prev parent reply other threads:[~2026-07-28 12:45 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-25 3:50 [PATCH] nvmet: fix Reservation Register Replace for unregistered host with IEKEY Zhengrong Li
2026-07-28 7:52 ` 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-08-04 16:29 ` Christoph Hellwig
2026-08-10 19:19 ` Keith Busch
2026-07-28 8:26 ` [PATCH v2] " Zhengrong Li
2026-07-28 12:44 ` Guixin Liu [this message]
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=3974a955-ac5a-4394-9d20-908993bdbd27@linux.alibaba.com \
--to=kanie@linux.alibaba.com \
--cc=hch@lst.de \
--cc=kch@nvidia.com \
--cc=linux-nvme@lists.infradead.org \
--cc=mlombard@arkamax.eu \
--cc=sagi@grimberg.me \
--cc=zhengrong_li@linux.alibaba.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.