Linux-NVME Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] nvmet: fix Reservation Register Replace for unregistered host with IEKEY
@ 2026-07-25  3:50 Zhengrong Li
  2026-07-28  7:52 ` Maurizio Lombardi
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Zhengrong Li @ 2026-07-25  3:50 UTC (permalink / raw)
  To: linux-nvme; +Cc: hch, sagi, kch, 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.

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(&reg->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



^ permalink raw reply related	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2026-08-04 16:30 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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 v4] " Zhengrong Li
2026-07-30  4:36   ` Guixin Liu
2026-08-04 16:29   ` Christoph Hellwig
2026-07-28  8:26 ` [PATCH v3] " Zhengrong Li
2026-07-28  8:26 ` [PATCH v2] " Zhengrong Li
2026-07-28 12:44   ` Guixin Liu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox