diff mbox series

[RFC,16/48] target: core: undepend PR registrant of nacl

Message ID 20220803162857.27770-17-d.bogdanov@yadro.com (mailing list archive)
State New, archived
Headers show
Series Target cluster implementation over DLM | expand

Commit Message

Dmitry Bogdanov Dec. 24, 2021, 9:45 a.m. UTC
Make registration info be independent of nacl. Store and use an
information about initiatror name and target port inside registration
object.

Signed-off-by: Dmitry Bogdanov <d.bogdanov@yadro.com>
---
 drivers/target/target_core_configfs.c   |  14 +-
 drivers/target/target_core_device.c     |   7 -
 drivers/target/target_core_fabric_lib.c |  50 ++++----
 drivers/target/target_core_internal.h   |   9 +-
 drivers/target/target_core_pr.c         | 164 ++++++++----------------
 drivers/target/target_core_pr.h         |   2 -
 include/target/target_core_base.h       |   1 +
 7 files changed, 88 insertions(+), 159 deletions(-)
diff mbox series

Patch

diff --git a/drivers/target/target_core_configfs.c b/drivers/target/target_core_configfs.c
index 610de251994e..6e654edc4399 100644
--- a/drivers/target/target_core_configfs.c
+++ b/drivers/target/target_core_configfs.c
@@ -1735,7 +1735,6 @@  static struct se_device *pr_to_dev(struct config_item *item)
 static ssize_t target_core_dev_pr_show_spc3_res(struct se_device *dev,
 		char *page)
 {
-	struct se_node_acl *se_nacl;
 	struct t10_pr_registration *pr_reg;
 	char i_buf[PR_REG_ISID_ID_LEN] = { };
 
@@ -1743,12 +1742,11 @@  static ssize_t target_core_dev_pr_show_spc3_res(struct se_device *dev,
 	if (!pr_reg)
 		return sprintf(page, "No SPC-3 Reservation holder\n");
 
-	se_nacl = pr_reg->pr_reg_nacl;
 	core_pr_dump_initiator_port(pr_reg, i_buf, PR_REG_ISID_ID_LEN);
 
 	return sprintf(page, "SPC-3 Reservation: %s Initiator: %s%s\n",
-		se_nacl->se_tpg->se_tpg_tfo->fabric_name,
-		se_nacl->initiatorname, i_buf);
+		pr_reg->se_tpg->se_tpg_tfo->fabric_name,
+		pr_reg->pr_iport, i_buf);
 }
 
 static ssize_t target_core_dev_pr_show_spc2_res(struct se_device *dev,
@@ -1823,7 +1821,6 @@  static ssize_t target_pr_res_pr_holder_tg_port_show(struct config_item *item,
 		char *page)
 {
 	struct se_device *dev = pr_to_dev(item);
-	struct se_node_acl *se_nacl;
 	struct se_portal_group *se_tpg;
 	struct t10_pr_registration *pr_reg;
 	const struct target_core_fabric_ops *tfo;
@@ -1836,8 +1833,7 @@  static ssize_t target_pr_res_pr_holder_tg_port_show(struct config_item *item,
 		goto out_unlock;
 	}
 
-	se_nacl = pr_reg->pr_reg_nacl;
-	se_tpg = se_nacl->se_tpg;
+	se_tpg = pr_reg->se_tpg;
 	tfo = se_tpg->se_tpg_tfo;
 
 	len += sprintf(page+len, "SPC-3 Reservation: %s"
@@ -1874,12 +1870,12 @@  static ssize_t target_pr_res_pr_registered_i_pts_show(struct config_item *item,
 
 		memset(buf, 0, 384);
 		memset(i_buf, 0, PR_REG_ISID_ID_LEN);
-		tfo = pr_reg->pr_reg_nacl->se_tpg->se_tpg_tfo;
+		tfo = pr_reg->se_tpg->se_tpg_tfo;
 		core_pr_dump_initiator_port(pr_reg, i_buf,
 					PR_REG_ISID_ID_LEN);
 		sprintf(buf, "%s Node: %s%s Key: 0x%016Lx PRgen: 0x%08x\n",
 			tfo->fabric_name,
-			pr_reg->pr_reg_nacl->initiatorname, i_buf, pr_reg->pr_res_key,
+			pr_reg->pr_iport, i_buf, pr_reg->pr_res_key,
 			pr_reg->pr_res_generation);
 
 		if (len + strlen(buf) >= PAGE_SIZE)
diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c
index c0e4fb7b95d6..a4c31f3112ce 100644
--- a/drivers/target/target_core_device.c
+++ b/drivers/target/target_core_device.c
@@ -391,12 +391,6 @@  void core_disable_device_list_for_node(
 	struct se_node_acl *nacl,
 	struct se_portal_group *tpg)
 {
-	/*
-	 * rcu_dereference_raw protected by se_lun->lun_group symlink
-	 * reference to se_device->dev_group.
-	 */
-	struct se_device *dev = rcu_dereference_raw(lun->lun_se_dev);
-
 	lockdep_assert_held(&nacl->lun_entry_mutex);
 
 	/*
@@ -437,7 +431,6 @@  void core_disable_device_list_for_node(
 
 	kfree_rcu(orig, rcu_head);
 
-	core_scsi3_free_pr_reg_from_nacl(dev, nacl);
 	target_luns_data_has_changed(nacl, NULL, false);
 }
 
diff --git a/drivers/target/target_core_fabric_lib.c b/drivers/target/target_core_fabric_lib.c
index 6600ae44f29d..cd1360095036 100644
--- a/drivers/target/target_core_fabric_lib.c
+++ b/drivers/target/target_core_fabric_lib.c
@@ -33,14 +33,14 @@ 
 
 
 static int sas_get_pr_transport_id(
-	struct se_node_acl *nacl,
+	struct t10_pr_registration *pr_reg,
 	int *format_code,
 	unsigned char *buf)
 {
 	int ret;
 
 	/* Skip over 'naa. prefix */
-	ret = hex2bin(&buf[4], &nacl->initiatorname[4], 8);
+	ret = hex2bin(&buf[4], &pr_reg->pr_iport[4], 8);
 	if (ret) {
 		pr_debug("%s: invalid hex string\n", __func__);
 		return ret;
@@ -50,7 +50,7 @@  static int sas_get_pr_transport_id(
 }
 
 static int fc_get_pr_transport_id(
-	struct se_node_acl *se_nacl,
+	struct t10_pr_registration *pr_reg,
 	int *format_code,
 	unsigned char *buf)
 {
@@ -62,7 +62,7 @@  static int fc_get_pr_transport_id(
 	 * We convert the ASCII formatted N Port name into a binary
 	 * encoded TransportID.
 	 */
-	ptr = &se_nacl->initiatorname[0];
+	ptr = &pr_reg->pr_iport[0];
 	for (i = 0; i < 23; ) {
 		if (!strncmp(&ptr[i], ":", 1)) {
 			i++;
@@ -82,13 +82,13 @@  static int fc_get_pr_transport_id(
 }
 
 static int sbp_get_pr_transport_id(
-	struct se_node_acl *nacl,
+	struct t10_pr_registration *pr_reg,
 	int *format_code,
 	unsigned char *buf)
 {
 	int ret;
 
-	ret = hex2bin(&buf[8], nacl->initiatorname, 8);
+	ret = hex2bin(&buf[8], pr_reg->pr_iport, 8);
 	if (ret) {
 		pr_debug("%s: invalid hex string\n", __func__);
 		return ret;
@@ -98,7 +98,7 @@  static int sbp_get_pr_transport_id(
 }
 
 static int srp_get_pr_transport_id(
-	struct se_node_acl *nacl,
+	struct t10_pr_registration *pr_reg,
 	int *format_code,
 	unsigned char *buf)
 {
@@ -106,7 +106,7 @@  static int srp_get_pr_transport_id(
 	unsigned len, count, leading_zero_bytes;
 	int rc;
 
-	p = nacl->initiatorname;
+	p = pr_reg->pr_iport;
 	if (strncasecmp(p, "0x", 2) == 0)
 		p += 2;
 	len = strlen(p);
@@ -126,7 +126,6 @@  static int srp_get_pr_transport_id(
 }
 
 static int iscsi_get_pr_transport_id(
-	struct se_node_acl *se_nacl,
 	struct t10_pr_registration *pr_reg,
 	int *format_code,
 	unsigned char *buf)
@@ -135,7 +134,6 @@  static int iscsi_get_pr_transport_id(
 	int isid_len;
 	u16 len = 0;
 
-	spin_lock_irq(&se_nacl->nacl_sess_lock);
 	/*
 	 * Only null terminate the last field.
 	 *
@@ -151,7 +149,7 @@  static int iscsi_get_pr_transport_id(
 	 * length of the iSCSI TransportID or the contents of the ADDITIONAL
 	 * LENGTH field.
 	 */
-	len = sprintf(&buf[off], "%s", se_nacl->initiatorname);
+	len = sprintf(&buf[off], "%s", pr_reg->pr_iport);
 	off += len;
 	if ((*format_code == 1) && (pr_reg->isid_present_at_reg)) {
 		/*
@@ -193,7 +191,6 @@  static int iscsi_get_pr_transport_id(
 	}
 	buf[off] = '\0';
 	len += 1;
-	spin_unlock_irq(&se_nacl->nacl_sess_lock);
 	/*
 	 * The ADDITIONAL LENGTH field specifies the number of bytes that follow
 	 * in the TransportID. The additional length shall be at least 20 and
@@ -214,14 +211,12 @@  static int iscsi_get_pr_transport_id(
 }
 
 static int iscsi_get_pr_transport_id_len(
-	struct se_node_acl *se_nacl,
 	struct t10_pr_registration *pr_reg,
 	int *format_code)
 {
 	u32 len = 0, padding = 0;
 
-	spin_lock_irq(&se_nacl->nacl_sess_lock);
-	len = strlen(se_nacl->initiatorname);
+	len = strlen(pr_reg->pr_iport);
 	/*
 	 * Add extra byte for NULL terminator
 	 */
@@ -239,7 +234,6 @@  static int iscsi_get_pr_transport_id_len(
 		*format_code = 1;
 	} else
 		*format_code = 0;
-	spin_unlock_irq(&se_nacl->nacl_sess_lock);
 	/*
 	 * The ADDITIONAL LENGTH field specifies the number of bytes that follow
 	 * in the TransportID. The additional length shall be at least 20 and
@@ -342,19 +336,19 @@  static char *iscsi_parse_pr_out_transport_id(
 	return &buf[4];
 }
 
-int target_get_pr_transport_id_len(struct se_node_acl *nacl,
+int target_get_pr_transport_id_len(
 		struct t10_pr_registration *pr_reg, int *format_code)
 {
-	switch (nacl->se_tpg->proto_id) {
+	switch (pr_reg->se_tpg->proto_id) {
 	case SCSI_PROTOCOL_FCP:
 	case SCSI_PROTOCOL_SBP:
 	case SCSI_PROTOCOL_SRP:
 	case SCSI_PROTOCOL_SAS:
 		break;
 	case SCSI_PROTOCOL_ISCSI:
-		return iscsi_get_pr_transport_id_len(nacl, pr_reg, format_code);
+		return iscsi_get_pr_transport_id_len(pr_reg, format_code);
 	default:
-		pr_err("Unknown proto_id: 0x%02x\n", nacl->se_tpg->proto_id);
+		pr_err("Unknown proto_id: 0x%02x\n", pr_reg->se_tpg->proto_id);
 		return -EINVAL;
 	}
 
@@ -365,24 +359,24 @@  int target_get_pr_transport_id_len(struct se_node_acl *nacl,
 	return 24;
 }
 
-int target_get_pr_transport_id(struct se_node_acl *nacl,
+int target_get_pr_transport_id(
 		struct t10_pr_registration *pr_reg, int *format_code,
 		unsigned char *buf)
 {
-	switch (nacl->se_tpg->proto_id) {
+	switch (pr_reg->se_tpg->proto_id) {
 	case SCSI_PROTOCOL_SAS:
-		return sas_get_pr_transport_id(nacl, format_code, buf);
+		return sas_get_pr_transport_id(pr_reg, format_code, buf);
 	case SCSI_PROTOCOL_SBP:
-		return sbp_get_pr_transport_id(nacl, format_code, buf);
+		return sbp_get_pr_transport_id(pr_reg, format_code, buf);
 	case SCSI_PROTOCOL_SRP:
-		return srp_get_pr_transport_id(nacl, format_code, buf);
+		return srp_get_pr_transport_id(pr_reg, format_code, buf);
 	case SCSI_PROTOCOL_FCP:
-		return fc_get_pr_transport_id(nacl, format_code, buf);
+		return fc_get_pr_transport_id(pr_reg, format_code, buf);
 	case SCSI_PROTOCOL_ISCSI:
-		return iscsi_get_pr_transport_id(nacl, pr_reg, format_code,
+		return iscsi_get_pr_transport_id(pr_reg, format_code,
 				buf);
 	default:
-		pr_err("Unknown proto_id: 0x%02x\n", nacl->se_tpg->proto_id);
+		pr_err("Unknown proto_id: 0x%02x\n", pr_reg->se_tpg->proto_id);
 		return -EINVAL;
 	}
 }
diff --git a/drivers/target/target_core_internal.h b/drivers/target/target_core_internal.h
index d4ace697edb0..8bd48eb1cf9b 100644
--- a/drivers/target/target_core_internal.h
+++ b/drivers/target/target_core_internal.h
@@ -97,11 +97,10 @@  void	target_setup_backend_cits(struct target_backend *);
 int	target_fabric_setup_cits(struct target_fabric_configfs *);
 
 /* target_core_fabric_lib.c */
-int	target_get_pr_transport_id_len(struct se_node_acl *nacl,
-		struct t10_pr_registration *pr_reg, int *format_code);
-int	target_get_pr_transport_id(struct se_node_acl *nacl,
-		struct t10_pr_registration *pr_reg, int *format_code,
-		unsigned char *buf);
+int	target_get_pr_transport_id_len(struct t10_pr_registration *pr_reg,
+				       int *format_code);
+int	target_get_pr_transport_id(struct t10_pr_registration *pr_reg,
+				   int *format_code, unsigned char *buf);
 const char *target_parse_pr_out_transport_id(struct se_portal_group *tpg,
 		char *buf, u32 *out_tid_len, char **port_nexus_ptr);
 
diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c
index 844b971827e6..aa967ea74e5b 100644
--- a/drivers/target/target_core_pr.c
+++ b/drivers/target/target_core_pr.c
@@ -64,7 +64,7 @@  enum preempt_type {
 	PREEMPT_AND_ABORT,
 };
 
-static void __core_scsi3_complete_pro_release(struct se_device *, struct se_node_acl *,
+static void __core_scsi3_complete_pro_release(struct se_device *,
 					      struct t10_pr_registration *, int, int);
 
 static int is_reservation_holder(
@@ -609,7 +609,9 @@  static u32 core_scsi3_pr_generation(struct se_device *dev)
 static struct t10_pr_registration *__core_scsi3_do_alloc_registration(
 	struct se_device *dev,
 	struct se_node_acl *nacl,
-	struct se_lun *lun,
+	const char *initiatorname,
+	u64 unpacked_lun,
+	struct se_portal_group *se_tpg,
 	struct se_dev_entry *dest_deve,
 	u64 mapped_lun,
 	unsigned char *isid,
@@ -632,6 +634,7 @@  static struct t10_pr_registration *__core_scsi3_do_alloc_registration(
 	INIT_LIST_HEAD(&pr_reg->pr_reg_atp_mem_list);
 	atomic_set(&pr_reg->pr_res_holders, 0);
 	pr_reg->pr_reg_nacl = nacl;
+	strscpy(pr_reg->pr_iport, initiatorname, PR_APTPL_MAX_IPORT_LEN);
 	/*
 	 * For destination registrations for ALL_TG_PT=1 and SPEC_I_PT=1,
 	 * the se_dev_entry->pr_ref will have been already obtained by
@@ -656,8 +659,9 @@  static struct t10_pr_registration *__core_scsi3_do_alloc_registration(
 		rcu_read_unlock();
 	}
 	pr_reg->pr_res_mapped_lun = mapped_lun;
-	pr_reg->pr_aptpl_target_lun = lun->unpacked_lun;
-	pr_reg->tg_pt_sep_rtpi = lun->lun_tpg->tpg_rtpi;
+	pr_reg->pr_aptpl_target_lun = unpacked_lun;
+	pr_reg->tg_pt_sep_rtpi = se_tpg->tpg_rtpi;
+	pr_reg->se_tpg = se_tpg;
 	pr_reg->pr_res_key = sa_res_key;
 	pr_reg->pr_reg_all_tg_pt = all_tg_pt;
 	pr_reg->pr_reg_aptpl = aptpl;
@@ -703,7 +707,10 @@  static struct t10_pr_registration *__core_scsi3_alloc_registration(
 	 * Create a registration for the I_T Nexus upon which the
 	 * PROUT REGISTER was received.
 	 */
-	pr_reg = __core_scsi3_do_alloc_registration(dev, nacl, lun, deve, mapped_lun,
+	pr_reg = __core_scsi3_do_alloc_registration(dev, nacl,
+						    nacl->initiatorname, lun->unpacked_lun,
+						    lun->lun_tpg,
+						    deve, mapped_lun,
 						    isid, sa_res_key, all_tg_pt,
 						    aptpl);
 	if (!pr_reg)
@@ -782,7 +789,11 @@  static struct t10_pr_registration *__core_scsi3_alloc_registration(
 				kref_read(&deve_tmp->pr_kref) != 0);
 
 			pr_reg_atp = __core_scsi3_do_alloc_registration(dev,
-						nacl_tmp, dest_lun, deve_tmp,
+						nacl_tmp,
+						nacl_tmp->initiatorname,
+						dest_lun->unpacked_lun,
+						lun->lun_tpg,
+						deve_tmp,
 						deve_tmp->mapped_lun, NULL,
 						sa_res_key, all_tg_pt, aptpl);
 			if (!pr_reg_atp) {
@@ -1009,11 +1020,10 @@  int core_scsi3_check_aptpl_registration(
 static void __core_scsi3_dump_registration(
 	const struct target_core_fabric_ops *tfo,
 	struct se_device *dev,
-	struct se_node_acl *nacl,
 	struct t10_pr_registration *pr_reg,
 	enum register_type register_type)
 {
-	struct se_portal_group *se_tpg = nacl->se_tpg;
+	struct se_portal_group *se_tpg = pr_reg->se_tpg;
 	char i_buf[PR_REG_ISID_ID_LEN] = { };
 
 	core_pr_dump_initiator_port(pr_reg, i_buf, PR_REG_ISID_ID_LEN);
@@ -1021,7 +1031,7 @@  static void __core_scsi3_dump_registration(
 	pr_debug("SPC-3 PR [%s] Service Action: REGISTER%s Initiator"
 		" Node: %s%s\n", tfo->fabric_name, (register_type == REGISTER_AND_MOVE) ?
 		"_AND_MOVE" : (register_type == REGISTER_AND_IGNORE_EXISTING_KEY) ?
-		"_AND_IGNORE_EXISTING_KEY" : "", nacl->initiatorname,
+		"_AND_IGNORE_EXISTING_KEY" : "", pr_reg->pr_iport,
 		i_buf);
 	pr_debug("SPC-3 PR [%s] registration on Target Port: %s,0x%04x\n",
 		 tfo->fabric_name, tfo->tpg_get_wwn(se_tpg),
@@ -1057,7 +1067,7 @@  static void __core_scsi3_add_registration(
 	spin_lock(&pr_tmpl->registration_lock);
 	list_add_tail(&pr_reg->pr_reg_list, &pr_tmpl->registration_list);
 
-	__core_scsi3_dump_registration(tfo, dev, nacl, pr_reg, register_type);
+	__core_scsi3_dump_registration(tfo, dev, pr_reg, register_type);
 	spin_unlock(&pr_tmpl->registration_lock);
 	/*
 	 * Skip extra processing for ALL_TG_PT=0 or REGISTER_AND_MOVE.
@@ -1070,8 +1080,6 @@  static void __core_scsi3_add_registration(
 	 */
 	list_for_each_entry_safe(pr_reg_tmp, pr_reg_tmp_safe,
 			&pr_reg->pr_reg_atp_list, pr_reg_atp_mem_list) {
-		struct se_node_acl *nacl_tmp = pr_reg_tmp->pr_reg_nacl;
-
 		list_del(&pr_reg_tmp->pr_reg_atp_mem_list);
 
 		pr_reg_tmp->pr_res_generation = core_scsi3_pr_generation(dev);
@@ -1080,7 +1088,7 @@  static void __core_scsi3_add_registration(
 		list_add_tail(&pr_reg_tmp->pr_reg_list,
 			      &pr_tmpl->registration_list);
 
-		__core_scsi3_dump_registration(tfo, dev, nacl_tmp, pr_reg_tmp,
+		__core_scsi3_dump_registration(tfo, dev, pr_reg_tmp,
 					       register_type);
 		spin_unlock(&pr_tmpl->registration_lock);
 		/*
@@ -1208,7 +1216,6 @@  static int core_scsi3_check_implicit_release(
 	struct se_device *dev,
 	struct t10_pr_registration *pr_reg)
 {
-	struct se_node_acl *nacl = pr_reg->pr_reg_nacl;
 	struct t10_pr_registration *pr_res_holder;
 	int ret = 0;
 
@@ -1232,7 +1239,7 @@  static int core_scsi3_check_implicit_release(
 		 *    service action with the SERVICE ACTION RESERVATION KEY
 		 *    field set to zero (see 5.7.11.3).
 		 */
-		__core_scsi3_complete_pro_release(dev, nacl, pr_reg, 0, 1);
+		__core_scsi3_complete_pro_release(dev, pr_reg, 0, 1);
 		ret = 1;
 		/*
 		 * For 'All Registrants' reservation types, all existing
@@ -1241,8 +1248,7 @@  static int core_scsi3_check_implicit_release(
 		 * reservation holder is implicitly released here.
 		 */
 	} else if (pr_reg->pr_reg_all_tg_pt &&
-		  (!strcmp(pr_res_holder->pr_reg_nacl->initiatorname,
-			  pr_reg->pr_reg_nacl->initiatorname)) &&
+		  (!strcmp(pr_res_holder->pr_iport, pr_reg->pr_iport)) &&
 		  (pr_res_holder->pr_res_key == pr_reg->pr_res_key)) {
 		pr_err("SPC-3 PR: Unable to perform ALL_TG_PT=1"
 			" UNREGISTER while existing reservation with matching"
@@ -1264,7 +1270,7 @@  static void __core_scsi3_free_registration(
 	__acquires(&pr_tmpl->registration_lock)
 {
 	const struct target_core_fabric_ops *tfo =
-			pr_reg->pr_reg_nacl->se_tpg->se_tpg_tfo;
+			pr_reg->se_tpg->se_tpg_tfo;
 	struct t10_reservation *pr_tmpl = &dev->t10_pr;
 	struct se_node_acl *nacl = pr_reg->pr_reg_nacl;
 	struct se_dev_entry *deve;
@@ -1305,8 +1311,7 @@  static void __core_scsi3_free_registration(
 	spin_lock(&pr_tmpl->registration_lock);
 	pr_debug("SPC-3 PR [%s] Service Action: UNREGISTER Initiator"
 		" Node: %s%s\n", tfo->fabric_name,
-		pr_reg->pr_reg_nacl->initiatorname,
-		i_buf);
+		pr_reg->pr_iport, i_buf);
 	pr_debug("SPC-3 PR [%s] for %s TCM Subsystem %s Object Target"
 		" Port(s)\n", tfo->fabric_name,
 		(pr_reg->pr_reg_all_tg_pt) ? "ALL" : "SINGLE",
@@ -1328,43 +1333,6 @@  static void __core_scsi3_free_registration(
 	list_add_tail(&pr_reg->pr_reg_abort_list, preempt_and_abort_list);
 }
 
-void core_scsi3_free_pr_reg_from_nacl(
-	struct se_device *dev,
-	struct se_node_acl *nacl)
-{
-	struct t10_reservation *pr_tmpl = &dev->t10_pr;
-	struct t10_pr_registration *pr_reg, *pr_reg_tmp, *pr_res_holder;
-	bool free_reg = false;
-	/*
-	 * If the passed se_node_acl matches the reservation holder,
-	 * release the reservation.
-	 */
-	spin_lock(&dev->dev_reservation_lock);
-	pr_res_holder = dev->dev_pr_res_holder;
-	if ((pr_res_holder != NULL) &&
-	    (pr_res_holder->pr_reg_nacl == nacl)) {
-		__core_scsi3_complete_pro_release(dev, nacl, pr_res_holder, 0, 1);
-		free_reg = true;
-	}
-	spin_unlock(&dev->dev_reservation_lock);
-	/*
-	 * Release any registration associated with the struct se_node_acl.
-	 */
-	spin_lock(&pr_tmpl->registration_lock);
-	if (pr_res_holder && free_reg)
-		__core_scsi3_free_registration(dev, pr_res_holder, NULL, 0);
-
-	list_for_each_entry_safe(pr_reg, pr_reg_tmp,
-			&pr_tmpl->registration_list, pr_reg_list) {
-
-		if (pr_reg->pr_reg_nacl != nacl)
-			continue;
-
-		__core_scsi3_free_registration(dev, pr_reg, NULL, 0);
-	}
-	spin_unlock(&pr_tmpl->registration_lock);
-}
-
 void core_scsi3_free_all_registrations(
 	struct se_device *dev)
 {
@@ -1373,11 +1341,8 @@  void core_scsi3_free_all_registrations(
 
 	spin_lock(&dev->dev_reservation_lock);
 	pr_res_holder = dev->dev_pr_res_holder;
-	if (pr_res_holder != NULL) {
-		struct se_node_acl *pr_res_nacl = pr_res_holder->pr_reg_nacl;
-		__core_scsi3_complete_pro_release(dev, pr_res_nacl,
-						  pr_res_holder, 0, 0);
-	}
+	if (pr_res_holder != NULL)
+		__core_scsi3_complete_pro_release(dev, pr_res_holder, 0, 0);
 	spin_unlock(&dev->dev_reservation_lock);
 
 	spin_lock(&pr_tmpl->registration_lock);
@@ -1872,7 +1837,7 @@  static int core_scsi3_update_aptpl_buf(
 
 		tmp[0] = '\0';
 		isid_buf[0] = '\0';
-		tpg = pr_reg->pr_reg_nacl->se_tpg;
+		tpg = pr_reg->se_tpg;
 		/*
 		 * Write out any ISID value to APTPL metadata that was included
 		 * in the original registration.
@@ -1893,7 +1858,7 @@  static int core_scsi3_update_aptpl_buf(
 				"res_scope=%02x\nres_all_tg_pt=%d\n"
 				"mapped_lun=%llu\n", reg_count,
 				tpg->se_tpg_tfo->fabric_name,
-				pr_reg->pr_reg_nacl->initiatorname, isid_buf,
+				pr_reg->pr_iport, isid_buf,
 				pr_reg->pr_res_key, pr_reg->pr_res_type,
 				pr_reg->pr_res_scope, pr_reg->pr_reg_all_tg_pt,
 				pr_reg->pr_res_mapped_lun);
@@ -1903,7 +1868,7 @@  static int core_scsi3_update_aptpl_buf(
 				"sa_res_key=%llu\nres_holder=0\n"
 				"res_all_tg_pt=%d\nmapped_lun=%llu\n",
 				reg_count, tpg->se_tpg_tfo->fabric_name,
-				pr_reg->pr_reg_nacl->initiatorname, isid_buf,
+				pr_reg->pr_iport, isid_buf,
 				pr_reg->pr_res_key, pr_reg->pr_reg_all_tg_pt,
 				pr_reg->pr_res_mapped_lun);
 		}
@@ -2149,7 +2114,7 @@  core_scsi3_emulate_pro_register(struct se_cmd *cmd, u64 res_key, u64 sa_res_key,
 			 " Key for %s to: 0x%016Lx PRgeneration:"
 			 " 0x%08x\n", cmd->se_tfo->fabric_name,
 			 (register_type == REGISTER_AND_IGNORE_EXISTING_KEY) ? "_AND_IGNORE_EXISTING_KEY" : "",
-			 pr_reg->pr_reg_nacl->initiatorname,
+			 pr_reg->pr_iport,
 			 pr_reg->pr_res_key, pr_reg->pr_res_generation);
 
 	} else {
@@ -2180,8 +2145,8 @@  core_scsi3_emulate_pro_register(struct se_cmd *cmd, u64 res_key, u64 sa_res_key,
 					continue;
 				if (pr_reg == pr_reg_p)
 					continue;
-				if (strcmp(pr_reg->pr_reg_nacl->initiatorname,
-					   pr_reg_p->pr_reg_nacl->initiatorname))
+				if (strcmp(pr_reg->pr_iport,
+					   pr_reg_p->pr_iport))
 					continue;
 
 				__core_scsi3_free_registration(dev,
@@ -2329,14 +2294,13 @@  core_scsi3_pro_reserve(struct se_cmd *cmd, int type, int scope, u64 res_key)
 		 * RESERVATION CONFLICT status.
 		 */
 		if (!is_reservation_holder(pr_res_holder, pr_reg)) {
-			struct se_node_acl *pr_res_nacl = pr_res_holder->pr_reg_nacl;
 			pr_err("SPC-3 PR: Attempted RESERVE from"
 				" [%s]: %s while reservation already held by"
 				" [%s]: %s, returning RESERVATION_CONFLICT\n",
 				cmd->se_tfo->fabric_name,
 				se_sess->se_node_acl->initiatorname,
-				pr_res_nacl->se_tpg->se_tpg_tfo->fabric_name,
-				pr_res_holder->pr_reg_nacl->initiatorname);
+				pr_res_holder->se_tpg->se_tpg_tfo->fabric_name,
+				pr_res_holder->pr_iport);
 
 			spin_unlock(&dev->dev_reservation_lock);
 			ret = TCM_RESERVATION_CONFLICT;
@@ -2351,15 +2315,14 @@  core_scsi3_pro_reserve(struct se_cmd *cmd, int type, int scope, u64 res_key)
 		 */
 		if ((pr_res_holder->pr_res_type != type) ||
 		    (pr_res_holder->pr_res_scope != scope)) {
-			struct se_node_acl *pr_res_nacl = pr_res_holder->pr_reg_nacl;
 			pr_err("SPC-3 PR: Attempted RESERVE from"
 				" [%s]: %s trying to change TYPE and/or SCOPE,"
 				" while reservation already held by [%s]: %s,"
 				" returning RESERVATION_CONFLICT\n",
 				cmd->se_tfo->fabric_name,
 				se_sess->se_node_acl->initiatorname,
-				pr_res_nacl->se_tpg->se_tpg_tfo->fabric_name,
-				pr_res_holder->pr_reg_nacl->initiatorname);
+				pr_res_holder->se_tpg->se_tpg_tfo->fabric_name,
+				pr_res_holder->pr_iport);
 
 			spin_unlock(&dev->dev_reservation_lock);
 			ret = TCM_RESERVATION_CONFLICT;
@@ -2429,12 +2392,11 @@  core_scsi3_emulate_pro_reserve(struct se_cmd *cmd, int type, int scope,
 
 static void __core_scsi3_complete_pro_release(
 	struct se_device *dev,
-	struct se_node_acl *se_nacl,
 	struct t10_pr_registration *pr_reg,
 	int explicit,
 	int unreg)
 {
-	const struct target_core_fabric_ops *tfo = se_nacl->se_tpg->se_tpg_tfo;
+	const struct target_core_fabric_ops *tfo = pr_reg->se_tpg->se_tpg_tfo;
 	char i_buf[PR_REG_ISID_ID_LEN] = { };
 	int pr_res_type = 0, pr_res_scope = 0;
 
@@ -2486,7 +2448,7 @@  static void __core_scsi3_complete_pro_release(
 			(pr_reg->pr_reg_all_tg_pt) ? 1 : 0);
 	}
 	pr_debug("SPC-3 PR [%s] RELEASE Node: %s%s\n",
-		tfo->fabric_name, se_nacl->initiatorname,
+		tfo->fabric_name, pr_reg->pr_iport,
 		i_buf);
 	/*
 	 * Clear TYPE and SCOPE for the next PROUT Service Action: RESERVE
@@ -2579,15 +2541,14 @@  core_scsi3_emulate_pro_release(struct se_cmd *cmd, int type, int scope,
 	 */
 	if ((pr_res_holder->pr_res_type != type) ||
 	    (pr_res_holder->pr_res_scope != scope)) {
-		struct se_node_acl *pr_res_nacl = pr_res_holder->pr_reg_nacl;
 		pr_err("SPC-3 PR RELEASE: Attempted to release"
 			" reservation from [%s]: %s with different TYPE "
 			"and/or SCOPE  while reservation already held by"
 			" [%s]: %s, returning RESERVATION_CONFLICT\n",
 			cmd->se_tfo->fabric_name,
 			se_sess->se_node_acl->initiatorname,
-			pr_res_nacl->se_tpg->se_tpg_tfo->fabric_name,
-			pr_res_holder->pr_reg_nacl->initiatorname);
+			pr_res_holder->se_tpg->se_tpg_tfo->fabric_name,
+			pr_res_holder->pr_iport);
 
 		spin_unlock(&dev->dev_reservation_lock);
 		ret = TCM_RESERVATION_CONFLICT;
@@ -2609,8 +2570,7 @@  core_scsi3_emulate_pro_release(struct se_cmd *cmd, int type, int scope,
 	 * d) If the persistent reservation is of any other type, the device
 	 *    server shall not establish a unit attention condition.
 	 */
-	__core_scsi3_complete_pro_release(dev, se_sess->se_node_acl,
-					  pr_reg, 1, 0);
+	__core_scsi3_complete_pro_release(dev, pr_reg, 1, 0);
 
 	spin_unlock(&dev->dev_reservation_lock);
 
@@ -2695,11 +2655,8 @@  core_scsi3_emulate_pro_clear(struct se_cmd *cmd, u64 res_key)
 	 */
 	spin_lock(&dev->dev_reservation_lock);
 	pr_res_holder = dev->dev_pr_res_holder;
-	if (pr_res_holder) {
-		struct se_node_acl *pr_res_nacl = pr_res_holder->pr_reg_nacl;
-		__core_scsi3_complete_pro_release(dev, pr_res_nacl,
-						  pr_res_holder, 0, 0);
-	}
+	if (pr_res_holder)
+		__core_scsi3_complete_pro_release(dev, pr_res_holder, 0, 0);
 	spin_unlock(&dev->dev_reservation_lock);
 	/*
 	 * b) Remove all registration(s) (see spc4r17 5.7.7);
@@ -2743,8 +2700,7 @@  static void __core_scsi3_complete_pro_preempt(
 	int scope,
 	enum preempt_type preempt_type)
 {
-	struct se_node_acl *nacl = pr_reg->pr_reg_nacl;
-	const struct target_core_fabric_ops *tfo = nacl->se_tpg->se_tpg_tfo;
+	const struct target_core_fabric_ops *tfo = pr_reg->se_tpg->se_tpg_tfo;
 	char i_buf[PR_REG_ISID_ID_LEN] = { };
 
 	lockdep_assert_held(&dev->dev_reservation_lock);
@@ -2754,8 +2710,7 @@  static void __core_scsi3_complete_pro_preempt(
 	 * Do an implicit RELEASE of the existing reservation.
 	 */
 	if (dev->dev_pr_res_holder)
-		__core_scsi3_complete_pro_release(dev, nacl,
-						  dev->dev_pr_res_holder, 0, 0);
+		__core_scsi3_complete_pro_release(dev, dev->dev_pr_res_holder, 0, 0);
 
 	dev->dev_pr_res_holder = pr_reg;
 	pr_reg->pr_res_holder = 1;
@@ -2769,7 +2724,7 @@  static void __core_scsi3_complete_pro_preempt(
 		(pr_reg->pr_reg_all_tg_pt) ? 1 : 0);
 	pr_debug("SPC-3 PR [%s] PREEMPT%s from Node: %s%s\n",
 		tfo->fabric_name, (preempt_type == PREEMPT_AND_ABORT) ? "_AND_ABORT" : "",
-		nacl->initiatorname, i_buf);
+		pr_reg->pr_iport, i_buf);
 	/*
 	 * For PREEMPT_AND_ABORT, add the preempting reservation's
 	 * struct t10_pr_registration to the list that will be compared
@@ -3015,7 +2970,6 @@  core_scsi3_pro_preempt(struct se_cmd *cmd, int type, int scope, u64 res_key,
 	 */
 	if (pr_reg_n != pr_res_holder)
 		__core_scsi3_complete_pro_release(dev,
-						  pr_res_holder->pr_reg_nacl,
 						  dev->dev_pr_res_holder, 0, 0);
 	/*
 	 * b) Remove the registrations for all I_T nexuses identified
@@ -3142,7 +3096,7 @@  core_scsi3_emulate_pro_register_and_move(struct se_cmd *cmd, u64 res_key,
 	struct se_device *dev = cmd->se_dev;
 	struct se_dev_entry *dest_se_deve = NULL;
 	struct se_lun *se_lun = cmd->se_lun, *tmp_lun;
-	struct se_node_acl *pr_res_nacl, *pr_reg_nacl, *dest_node_acl = NULL;
+	struct se_node_acl *dest_node_acl = NULL;
 	struct se_portal_group *se_tpg, *dest_se_tpg = NULL;
 	const struct target_core_fabric_ops *dest_tf_ops = NULL, *tf_ops;
 	struct t10_pr_registration *pr_reg, *pr_res_holder, *dest_pr_reg;
@@ -3297,23 +3251,21 @@  core_scsi3_emulate_pro_register_and_move(struct se_cmd *cmd, u64 res_key,
 	 * ILLEGAL REQUEST, and the additional sense code set to INVALID FIELD
 	 * IN PARAMETER LIST.
 	 */
-	pr_reg_nacl = pr_reg->pr_reg_nacl;
-	matching_iname = (!strcmp(initiator_str,
-				  pr_reg_nacl->initiatorname)) ? 1 : 0;
+	matching_iname = !strcmp(initiator_str, pr_reg->pr_iport);
 	if (!matching_iname)
 		goto after_iport_check;
 
 	if (!iport_ptr || !pr_reg->isid_present_at_reg) {
 		pr_err("SPC-3 PR REGISTER_AND_MOVE: TransportID: %s"
 			" matches: %s on received I_T Nexus\n", initiator_str,
-			pr_reg_nacl->initiatorname);
+			pr_reg->pr_iport);
 		ret = TCM_INVALID_PARAMETER_LIST;
 		goto out;
 	}
 	if (!strcmp(iport_ptr, pr_reg->pr_reg_isid)) {
 		pr_err("SPC-3 PR REGISTER_AND_MOVE: TransportID: %s %s"
 			" matches: %s %s on received I_T Nexus\n",
-			initiator_str, iport_ptr, pr_reg_nacl->initiatorname,
+			initiator_str, iport_ptr, pr_reg->pr_iport,
 			pr_reg->pr_reg_isid);
 		ret = TCM_INVALID_PARAMETER_LIST;
 		goto out;
@@ -3419,7 +3371,6 @@  core_scsi3_emulate_pro_register_and_move(struct se_cmd *cmd, u64 res_key,
 		ret = TCM_RESERVATION_CONFLICT;
 		goto out;
 	}
-	pr_res_nacl = pr_res_holder->pr_reg_nacl;
 	/*
 	 * b) Ignore the contents of the (received) SCOPE and TYPE fields;
 	 */
@@ -3471,8 +3422,7 @@  core_scsi3_emulate_pro_register_and_move(struct se_cmd *cmd, u64 res_key,
 	 * f) Release the persistent reservation for the persistent reservation
 	 *    holder (i.e., the I_T nexus on which the
 	 */
-	__core_scsi3_complete_pro_release(dev, pr_res_nacl,
-					  dev->dev_pr_res_holder, 0, 0);
+	__core_scsi3_complete_pro_release(dev, dev->dev_pr_res_holder, 0, 0);
 	/*
 	 * g) Move the persistent reservation to the specified I_T nexus using
 	 *    the same scope and type as the persistent reservation released in
@@ -3497,7 +3447,7 @@  core_scsi3_emulate_pro_register_and_move(struct se_cmd *cmd, u64 res_key,
 		dest_pr_reg->pr_res_generation);
 	pr_debug("SPC-3 PR Successfully moved reservation from"
 		" %s Fabric Node: %s%s -> %s Fabric Node: %s %s\n",
-		tf_ops->fabric_name, pr_reg_nacl->initiatorname,
+		tf_ops->fabric_name, pr_reg->pr_iport,
 		i_buf, dest_tf_ops->fabric_name,
 		dest_node_acl->initiatorname, (iport_ptr != NULL) ?
 		iport_ptr : "");
@@ -3885,7 +3835,6 @@  static sense_reason_t
 core_scsi3_pri_read_full_status(struct se_cmd *cmd)
 {
 	struct se_device *dev = cmd->se_dev;
-	struct se_node_acl *se_nacl;
 	struct se_portal_group *se_tpg;
 	struct t10_pr_registration *pr_reg, *pr_reg_tmp;
 	struct t10_reservation *pr_tmpl = &dev->t10_pr;
@@ -3925,8 +3874,7 @@  core_scsi3_pri_read_full_status(struct se_cmd *cmd)
 	list_for_each_entry_safe(pr_reg, pr_reg_tmp,
 			&pr_tmpl->registration_list, pr_reg_list) {
 
-		se_nacl = pr_reg->pr_reg_nacl;
-		se_tpg = pr_reg->pr_reg_nacl->se_tpg;
+		se_tpg = pr_reg->se_tpg;
 		add_desc_len = 0;
 
 		atomic_inc_mb(&pr_reg->pr_res_holders);
@@ -3935,7 +3883,7 @@  core_scsi3_pri_read_full_status(struct se_cmd *cmd)
 		 * Determine expected length of $FABRIC_MOD specific
 		 * TransportID full status descriptor..
 		 */
-		exp_desc_len = target_get_pr_transport_id_len(se_nacl, pr_reg,
+		exp_desc_len = target_get_pr_transport_id_len(pr_reg,
 					&format_code);
 		if (exp_desc_len < 0 ||
 		    exp_desc_len + add_len > cmd->data_length) {
@@ -4001,7 +3949,7 @@  core_scsi3_pri_read_full_status(struct se_cmd *cmd)
 		/*
 		 * Now, have the $FABRIC_MOD fill in the transport ID.
 		 */
-		desc_len = target_get_pr_transport_id(se_nacl, pr_reg,
+		desc_len = target_get_pr_transport_id(pr_reg,
 				&format_code, &buf[off+4]);
 
 		spin_lock(&pr_tmpl->registration_lock);
diff --git a/drivers/target/target_core_pr.h b/drivers/target/target_core_pr.h
index b793c99637ab..202f9aec963a 100644
--- a/drivers/target/target_core_pr.h
+++ b/drivers/target/target_core_pr.h
@@ -68,8 +68,6 @@  extern int core_scsi3_alloc_aptpl_registration(
 extern int core_scsi3_check_aptpl_registration(struct se_device *,
 			struct se_portal_group *, struct se_lun *,
 			struct se_node_acl *, u64);
-extern void core_scsi3_free_pr_reg_from_nacl(struct se_device *,
-					     struct se_node_acl *);
 extern void core_scsi3_free_all_registrations(struct se_device *);
 extern unsigned char *core_scsi3_pr_dump_type(int);
 
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h
index 91c068525c02..1b673b25c6cd 100644
--- a/include/target/target_core_base.h
+++ b/include/target/target_core_base.h
@@ -369,6 +369,7 @@  struct t10_pr_registration {
 	u64 pr_res_key;
 	atomic_t pr_res_holders;
 	struct se_node_acl *pr_reg_nacl;
+	struct se_portal_group *se_tpg;
 	/* Used by ALL_TG_PT=1 registration with deve->pr_ref taken */
 	struct se_dev_entry *pr_reg_deve;
 	struct list_head pr_reg_list;