* [PATCH v4 1/4] scsi: target: core: Add RTPI field to target port
2023-02-21 16:06 [PATCH v4 0/5] scsi: target: make RTPI an TPG identifier Dmitry Bogdanov
@ 2023-02-21 16:06 ` Dmitry Bogdanov
2023-02-21 16:06 ` [PATCH v4 2/4] scsi: target: core: Use RTPI from " Dmitry Bogdanov
` (2 subsequent siblings)
3 siblings, 0 replies; 7+ messages in thread
From: Dmitry Bogdanov @ 2023-02-21 16:06 UTC (permalink / raw)
To: Martin Petersen, target-devel
Cc: Christoph Hellwig, Mike Christie, linux-scsi, linux, Dmitry Bogdanov
SAM-5 4.6.5.2 (Relative Port Identifier attribute) defines the attribute
as unique across SCSI target ports.
The change introduces RTPI attribute to se_portal group. The value is
unique across all enabled SCSI target ports. It also limits number of
SCSI target ports to 65535.
Signed-off-by: Dmitry Bogdanov <d.bogdanov@yadro.com>
---
v4:
use unused variable in target_tpg_disable
make tpg_rtpi variable u16 again
v3:
make variable static
change core_ prefix to target_
split to tpg_enable/tpg_disable functions
v2:
rewrite using XArray to track usage of RTPI
---
drivers/target/target_core_fabric_configfs.c | 9 ++--
drivers/target/target_core_internal.h | 2 +
drivers/target/target_core_tpg.c | 54 ++++++++++++++++++++
include/target/target_core_base.h | 2 +
4 files changed, 62 insertions(+), 5 deletions(-)
diff --git a/drivers/target/target_core_fabric_configfs.c b/drivers/target/target_core_fabric_configfs.c
index 67b18a67317a..873da49ab704 100644
--- a/drivers/target/target_core_fabric_configfs.c
+++ b/drivers/target/target_core_fabric_configfs.c
@@ -836,13 +836,12 @@ static ssize_t target_fabric_tpg_base_enable_store(struct config_item *item,
if (se_tpg->enabled == op)
return count;
-
- ret = se_tpg->se_tpg_tfo->fabric_enable_tpg(se_tpg, op);
+ if (op)
+ ret = target_tpg_enable(se_tpg);
+ else
+ ret = target_tpg_disable(se_tpg);
if (ret)
return ret;
-
- se_tpg->enabled = op;
-
return count;
}
diff --git a/drivers/target/target_core_internal.h b/drivers/target/target_core_internal.h
index 38a6d08f75b3..82fd5768a662 100644
--- a/drivers/target/target_core_internal.h
+++ b/drivers/target/target_core_internal.h
@@ -132,6 +132,8 @@ void core_tpg_remove_lun(struct se_portal_group *, struct se_lun *);
struct se_node_acl *core_tpg_add_initiator_node_acl(struct se_portal_group *tpg,
const char *initiatorname);
void core_tpg_del_initiator_node_acl(struct se_node_acl *acl);
+int target_tpg_enable(struct se_portal_group *se_tpg);
+int target_tpg_disable(struct se_portal_group *se_tpg);
/* target_core_transport.c */
int init_se_kmem_caches(void);
diff --git a/drivers/target/target_core_tpg.c b/drivers/target/target_core_tpg.c
index 736847c933e5..0de3385b94c5 100644
--- a/drivers/target/target_core_tpg.c
+++ b/drivers/target/target_core_tpg.c
@@ -31,6 +31,7 @@
#include "target_core_ua.h"
extern struct se_device *g_lun0_dev;
+static DEFINE_XARRAY_ALLOC(tpg_xa);
/* __core_tpg_get_initiator_node_acl():
*
@@ -439,6 +440,57 @@ static void core_tpg_lun_ref_release(struct percpu_ref *ref)
complete(&lun->lun_shutdown_comp);
}
+static int target_tpg_register_rtpi(struct se_portal_group *se_tpg)
+{
+ u32 val;
+ int ret;
+
+ ret = xa_alloc(&tpg_xa, &val, se_tpg,
+ XA_LIMIT(1, USHRT_MAX), GFP_KERNEL);
+ if (!ret)
+ se_tpg->tpg_rtpi = val;
+
+ return ret;
+}
+
+static void target_tpg_deregister_rtpi(struct se_portal_group *se_tpg)
+{
+ if (se_tpg->tpg_rtpi && se_tpg->enabled)
+ xa_erase(&tpg_xa, se_tpg->tpg_rtpi);
+}
+
+int target_tpg_enable(struct se_portal_group *se_tpg)
+{
+ int ret;
+
+ ret = target_tpg_register_rtpi(se_tpg);
+ if (ret)
+ return ret;
+
+ ret = se_tpg->se_tpg_tfo->fabric_enable_tpg(se_tpg, true);
+ if (ret) {
+ target_tpg_deregister_rtpi(se_tpg);
+ return ret;
+ }
+
+ se_tpg->enabled = true;
+
+ return 0;
+}
+
+int target_tpg_disable(struct se_portal_group *se_tpg)
+{
+ int ret;
+
+ target_tpg_deregister_rtpi(se_tpg);
+
+ ret = se_tpg->se_tpg_tfo->fabric_enable_tpg(se_tpg, false);
+ if (!ret)
+ se_tpg->enabled = false;
+
+ return ret;
+}
+
/* Does not change se_wwn->priv. */
int core_tpg_register(
struct se_wwn *se_wwn,
@@ -535,6 +587,8 @@ int core_tpg_deregister(struct se_portal_group *se_tpg)
kfree_rcu(se_tpg->tpg_virt_lun0, rcu_head);
}
+ target_tpg_deregister_rtpi(se_tpg);
+
return 0;
}
EXPORT_SYMBOL(core_tpg_deregister);
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h
index 12c9ba16217e..814edf746395 100644
--- a/include/target/target_core_base.h
+++ b/include/target/target_core_base.h
@@ -920,6 +920,8 @@ struct se_portal_group {
*/
int proto_id;
bool enabled;
+ /* RELATIVE TARGET PORT IDENTIFIER */
+ u16 tpg_rtpi;
/* Used for PR SPEC_I_PT=1 and REGISTER_AND_MOVE */
atomic_t tpg_pr_ref_count;
/* Spinlock for adding/removing ACLed Nodes */
--
2.25.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v4 2/4] scsi: target: core: Use RTPI from target port
2023-02-21 16:06 [PATCH v4 0/5] scsi: target: make RTPI an TPG identifier Dmitry Bogdanov
2023-02-21 16:06 ` [PATCH v4 1/4] scsi: target: core: Add RTPI field to target port Dmitry Bogdanov
@ 2023-02-21 16:06 ` Dmitry Bogdanov
2023-02-21 16:06 ` [PATCH v4 3/4] scsi: target: core: Drop device-based RTPI Dmitry Bogdanov
2023-02-21 16:06 ` [PATCH v4 4/4] scsi: target: core: Add RTPI attribute for target port Dmitry Bogdanov
3 siblings, 0 replies; 7+ messages in thread
From: Dmitry Bogdanov @ 2023-02-21 16:06 UTC (permalink / raw)
To: Martin Petersen, target-devel
Cc: Christoph Hellwig, Mike Christie, linux-scsi, linux,
Roman Bolshakov, Christoph Hellwig, Dmitry Bogdanov
From: Roman Bolshakov <r.bolshakov@yadro.com>
Replace all references to RTPI from LUN field to se_portal_group field.
It introduces consitent reporting of RTPI for all LUNs and all target
ports.
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Roman Bolshakov <r.bolshakov@yadro.com>
Signed-off-by: Dmitry Bogdanov <d.bogdanov@yadro.com>
---
drivers/target/target_core_alua.c | 4 ++--
drivers/target/target_core_device.c | 2 +-
drivers/target/target_core_pr.c | 8 ++++----
drivers/target/target_core_spc.c | 2 +-
drivers/target/target_core_stat.c | 6 +++---
5 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/drivers/target/target_core_alua.c b/drivers/target/target_core_alua.c
index c8470e7c0e10..3372856319f7 100644
--- a/drivers/target/target_core_alua.c
+++ b/drivers/target/target_core_alua.c
@@ -225,7 +225,7 @@ target_emulate_report_target_port_groups(struct se_cmd *cmd)
/*
* Set RELATIVE TARGET PORT IDENTIFIER
*/
- put_unaligned_be16(lun->lun_rtpi, &buf[off]);
+ put_unaligned_be16(lun->lun_tpg->tpg_rtpi, &buf[off]);
off += 2;
rd_len += 4;
}
@@ -399,7 +399,7 @@ target_emulate_set_target_port_groups(struct se_cmd *cmd)
spin_lock(&dev->se_port_lock);
list_for_each_entry(lun, &dev->dev_sep_list,
lun_dev_link) {
- if (lun->lun_rtpi != rtpi)
+ if (lun->lun_tpg->tpg_rtpi != rtpi)
continue;
// XXX: racy unlock
diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c
index f6e58410ec3f..93f7f050fdf1 100644
--- a/drivers/target/target_core_device.c
+++ b/drivers/target/target_core_device.c
@@ -223,7 +223,7 @@ struct se_dev_entry *core_get_se_deve_from_rtpi(
tpg->se_tpg_tfo->fabric_name);
continue;
}
- if (lun->lun_rtpi != rtpi)
+ if (lun->lun_tpg->tpg_rtpi != rtpi)
continue;
kref_get(&deve->pr_kref);
diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c
index 1493b1d01194..d19ec4e6a4c0 100644
--- a/drivers/target/target_core_pr.c
+++ b/drivers/target/target_core_pr.c
@@ -663,7 +663,7 @@ static struct t10_pr_registration *__core_scsi3_do_alloc_registration(
}
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_rtpi;
+ pr_reg->tg_pt_sep_rtpi = lun->lun_tpg->tpg_rtpi;
pr_reg->pr_res_key = sa_res_key;
pr_reg->pr_reg_all_tg_pt = all_tg_pt;
pr_reg->pr_reg_aptpl = aptpl;
@@ -967,7 +967,7 @@ static int __core_scsi3_check_aptpl_registration(
rcu_read_unlock();
pr_reg->pr_reg_nacl = nacl;
- pr_reg->tg_pt_sep_rtpi = lun->lun_rtpi;
+ pr_reg->tg_pt_sep_rtpi = lun->lun_tpg->tpg_rtpi;
list_del(&pr_reg->pr_reg_aptpl_list);
spin_unlock(&pr_tmpl->aptpl_reg_lock);
/*
@@ -1567,7 +1567,7 @@ core_scsi3_decode_spec_i_port(
*/
if (tmp_tpg->proto_id != proto_ident)
continue;
- dest_rtpi = tmp_lun->lun_rtpi;
+ dest_rtpi = tmp_lun->lun_tpg->tpg_rtpi;
iport_ptr = NULL;
i_str = target_parse_pr_out_transport_id(tmp_tpg,
@@ -3225,7 +3225,7 @@ core_scsi3_emulate_pro_register_and_move(struct se_cmd *cmd, u64 res_key,
spin_lock(&dev->se_port_lock);
list_for_each_entry(tmp_lun, &dev->dev_sep_list, lun_dev_link) {
- if (tmp_lun->lun_rtpi != rtpi)
+ if (tmp_lun->lun_tpg->tpg_rtpi != rtpi)
continue;
dest_se_tpg = tmp_lun->lun_tpg;
dest_tf_ops = dest_se_tpg->se_tpg_tfo;
diff --git a/drivers/target/target_core_spc.c b/drivers/target/target_core_spc.c
index fcc7b10a7ae3..5bae45c3fb65 100644
--- a/drivers/target/target_core_spc.c
+++ b/drivers/target/target_core_spc.c
@@ -317,7 +317,7 @@ spc_emulate_evpd_83(struct se_cmd *cmd, unsigned char *buf)
/* Skip over Obsolete field in RTPI payload
* in Table 472 */
off += 2;
- put_unaligned_be16(lun->lun_rtpi, &buf[off]);
+ put_unaligned_be16(lun->lun_tpg->tpg_rtpi, &buf[off]);
off += 2;
len += 8; /* Header size + Designation descriptor */
/*
diff --git a/drivers/target/target_core_stat.c b/drivers/target/target_core_stat.c
index f85ee5b0fd80..c42cbde8a31b 100644
--- a/drivers/target/target_core_stat.c
+++ b/drivers/target/target_core_stat.c
@@ -455,7 +455,7 @@ static ssize_t target_stat_port_indx_show(struct config_item *item, char *page)
rcu_read_lock();
dev = rcu_dereference(lun->lun_se_dev);
if (dev)
- ret = snprintf(page, PAGE_SIZE, "%u\n", lun->lun_rtpi);
+ ret = snprintf(page, PAGE_SIZE, "%u\n", lun->lun_tpg->tpg_rtpi);
rcu_read_unlock();
return ret;
}
@@ -561,7 +561,7 @@ static ssize_t target_stat_tgt_port_indx_show(struct config_item *item,
rcu_read_lock();
dev = rcu_dereference(lun->lun_se_dev);
if (dev)
- ret = snprintf(page, PAGE_SIZE, "%u\n", lun->lun_rtpi);
+ ret = snprintf(page, PAGE_SIZE, "%u\n", lun->lun_tpg->tpg_rtpi);
rcu_read_unlock();
return ret;
}
@@ -579,7 +579,7 @@ static ssize_t target_stat_tgt_port_name_show(struct config_item *item,
if (dev)
ret = snprintf(page, PAGE_SIZE, "%sPort#%u\n",
tpg->se_tpg_tfo->fabric_name,
- lun->lun_rtpi);
+ lun->lun_tpg->tpg_rtpi);
rcu_read_unlock();
return ret;
}
--
2.25.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v4 3/4] scsi: target: core: Drop device-based RTPI
2023-02-21 16:06 [PATCH v4 0/5] scsi: target: make RTPI an TPG identifier Dmitry Bogdanov
2023-02-21 16:06 ` [PATCH v4 1/4] scsi: target: core: Add RTPI field to target port Dmitry Bogdanov
2023-02-21 16:06 ` [PATCH v4 2/4] scsi: target: core: Use RTPI from " Dmitry Bogdanov
@ 2023-02-21 16:06 ` Dmitry Bogdanov
2023-02-21 16:06 ` [PATCH v4 4/4] scsi: target: core: Add RTPI attribute for target port Dmitry Bogdanov
3 siblings, 0 replies; 7+ messages in thread
From: Dmitry Bogdanov @ 2023-02-21 16:06 UTC (permalink / raw)
To: Martin Petersen, target-devel
Cc: Christoph Hellwig, Mike Christie, linux-scsi, linux,
Roman Bolshakov, Christoph Hellwig, Dmitry Bogdanov
From: Roman Bolshakov <r.bolshakov@yadro.com>
The code is not needed since target port-based RTPI allocation replaced
it.
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Roman Bolshakov <r.bolshakov@yadro.com>
Signed-off-by: Dmitry Bogdanov <d.bogdanov@yadro.com>
---
drivers/target/target_core_device.c | 41 ---------------------------
drivers/target/target_core_internal.h | 1 -
drivers/target/target_core_tpg.c | 6 ----
include/target/target_core_base.h | 4 ---
4 files changed, 52 deletions(-)
diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c
index 93f7f050fdf1..a3292eade6ea 100644
--- a/drivers/target/target_core_device.c
+++ b/drivers/target/target_core_device.c
@@ -479,47 +479,6 @@ void core_clear_lun_from_tpg(struct se_lun *lun, struct se_portal_group *tpg)
mutex_unlock(&tpg->acl_node_mutex);
}
-int core_alloc_rtpi(struct se_lun *lun, struct se_device *dev)
-{
- struct se_lun *tmp;
-
- spin_lock(&dev->se_port_lock);
- if (dev->export_count == 0x0000ffff) {
- pr_warn("Reached dev->dev_port_count =="
- " 0x0000ffff\n");
- spin_unlock(&dev->se_port_lock);
- return -ENOSPC;
- }
-again:
- /*
- * Allocate the next RELATIVE TARGET PORT IDENTIFIER for this struct se_device
- * Here is the table from spc4r17 section 7.7.3.8.
- *
- * Table 473 -- RELATIVE TARGET PORT IDENTIFIER field
- *
- * Code Description
- * 0h Reserved
- * 1h Relative port 1, historically known as port A
- * 2h Relative port 2, historically known as port B
- * 3h to FFFFh Relative port 3 through 65 535
- */
- lun->lun_rtpi = dev->dev_rpti_counter++;
- if (!lun->lun_rtpi)
- goto again;
-
- list_for_each_entry(tmp, &dev->dev_sep_list, lun_dev_link) {
- /*
- * Make sure RELATIVE TARGET PORT IDENTIFIER is unique
- * for 16-bit wrap..
- */
- if (lun->lun_rtpi == tmp->lun_rtpi)
- goto again;
- }
- spin_unlock(&dev->se_port_lock);
-
- return 0;
-}
-
static void se_release_vpd_for_dev(struct se_device *dev)
{
struct t10_vpd *vpd, *vpd_tmp;
diff --git a/drivers/target/target_core_internal.h b/drivers/target/target_core_internal.h
index 82fd5768a662..9c3bca552bb9 100644
--- a/drivers/target/target_core_internal.h
+++ b/drivers/target/target_core_internal.h
@@ -59,7 +59,6 @@ struct target_fabric_configfs {
extern struct t10_alua_lu_gp *default_lu_gp;
/* target_core_device.c */
-int core_alloc_rtpi(struct se_lun *lun, struct se_device *dev);
struct se_dev_entry *core_get_se_deve_from_rtpi(struct se_node_acl *, u16);
void target_pr_kref_release(struct kref *);
void core_free_device_list_for_node(struct se_node_acl *,
diff --git a/drivers/target/target_core_tpg.c b/drivers/target/target_core_tpg.c
index 0de3385b94c5..b1d9383386ec 100644
--- a/drivers/target/target_core_tpg.c
+++ b/drivers/target/target_core_tpg.c
@@ -632,10 +632,6 @@ int core_tpg_add_lun(
if (ret < 0)
goto out;
- ret = core_alloc_rtpi(lun, dev);
- if (ret)
- goto out_kill_ref;
-
if (!(dev->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_ALUA) &&
!(dev->se_hba->hba_flags & HBA_FLAGS_INTERNAL_USE))
target_attach_tg_pt_gp(lun, dev->t10_alua.default_tg_pt_gp);
@@ -659,8 +655,6 @@ int core_tpg_add_lun(
return 0;
-out_kill_ref:
- percpu_ref_exit(&lun->lun_ref);
out:
return ret;
}
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h
index 814edf746395..008e0e4500d1 100644
--- a/include/target/target_core_base.h
+++ b/include/target/target_core_base.h
@@ -735,8 +735,6 @@ struct se_lun {
bool lun_access_ro;
u32 lun_index;
- /* RELATIVE TARGET PORT IDENTIFER */
- u16 lun_rtpi;
atomic_t lun_acl_count;
struct se_device __rcu *lun_se_dev;
@@ -788,8 +786,6 @@ struct se_device_queue {
};
struct se_device {
- /* RELATIVE TARGET PORT IDENTIFER Counter */
- u16 dev_rpti_counter;
/* Used for SAM Task Attribute ordering */
u32 dev_cur_ordered_id;
u32 dev_flags;
--
2.25.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v4 4/4] scsi: target: core: Add RTPI attribute for target port
2023-02-21 16:06 [PATCH v4 0/5] scsi: target: make RTPI an TPG identifier Dmitry Bogdanov
` (2 preceding siblings ...)
2023-02-21 16:06 ` [PATCH v4 3/4] scsi: target: core: Drop device-based RTPI Dmitry Bogdanov
@ 2023-02-21 16:06 ` Dmitry Bogdanov
2023-02-22 21:41 ` Mike Christie
3 siblings, 1 reply; 7+ messages in thread
From: Dmitry Bogdanov @ 2023-02-21 16:06 UTC (permalink / raw)
To: Martin Petersen, target-devel
Cc: Christoph Hellwig, Mike Christie, linux-scsi, linux,
Dmitry Bogdanov, Roman Bolshakov
RELATIVE TARGET PORT IDENTIFIER can be read and configured via configfs:
$ echo 0x10 > $TARGET/tpgt_N/rtpi
RTPI can be changed only on disabled target ports.
Signed-off-by: Roman Bolshakov <r.bolshakov@yadro.com>
Signed-off-by: Dmitry Bogdanov <d.bogdanov@yadro.com>
---
v4:
move rtpi file from tpgt_n/attrib to tpgt_n folder
revert occasional rename of core_tpg_remove_lun
v3:
change core_ prefix to target_
v2:
do not allow to change RTPI on enabled target port
---
drivers/target/target_core_fabric_configfs.c | 39 +++++++++++++++++++-
drivers/target/target_core_tpg.c | 19 ++++++++--
include/target/target_core_base.h | 1 +
3 files changed, 53 insertions(+), 6 deletions(-)
diff --git a/drivers/target/target_core_fabric_configfs.c b/drivers/target/target_core_fabric_configfs.c
index 873da49ab704..a4235309da1d 100644
--- a/drivers/target/target_core_fabric_configfs.c
+++ b/drivers/target/target_core_fabric_configfs.c
@@ -844,15 +844,48 @@ static ssize_t target_fabric_tpg_base_enable_store(struct config_item *item,
return ret;
return count;
}
+static ssize_t target_fabric_tpg_base_rtpi_show(struct config_item *item, char *page)
+{
+ struct se_portal_group *se_tpg = attrib_to_tpg(item);
+
+ return sysfs_emit(page, "%#x\n", se_tpg->tpg_rtpi);
+}
+
+static ssize_t target_fabric_tpg_base_rtpi_store(struct config_item *item,
+ const char *page, size_t count)
+{
+ struct se_portal_group *se_tpg = attrib_to_tpg(item);
+ u16 val;
+ int ret;
+
+ ret = kstrtou16(page, 0, &val);
+ if (ret < 0)
+ return ret;
+ if (val == 0)
+ return -EINVAL;
+
+ if (se_tpg->enabled) {
+ pr_info("%s_TPG[%hu] - Can not change RTPI on enabled TPG",
+ se_tpg->se_tpg_tfo->fabric_name,
+ se_tpg->se_tpg_tfo->tpg_get_tag(se_tpg));
+ return -EINVAL;
+ }
+
+ se_tpg->tpg_rtpi = val;
+ se_tpg->rtpi_manual = true;
+
+ return count;
+}
CONFIGFS_ATTR(target_fabric_tpg_base_, enable);
+CONFIGFS_ATTR(target_fabric_tpg_base_, rtpi);
static int
target_fabric_setup_tpg_base_cit(struct target_fabric_configfs *tf)
{
struct config_item_type *cit = &tf->tf_tpg_base_cit;
struct configfs_attribute **attrs = NULL;
- size_t nr_attrs = 0;
+ size_t nr_attrs = 1;
int i = 0;
if (tf->tf_ops->tfc_tpg_base_attrs)
@@ -875,7 +908,9 @@ target_fabric_setup_tpg_base_cit(struct target_fabric_configfs *tf)
attrs[i] = tf->tf_ops->tfc_tpg_base_attrs[i];
if (tf->tf_ops->fabric_enable_tpg)
- attrs[i] = &target_fabric_tpg_base_attr_enable;
+ attrs[i++] = &target_fabric_tpg_base_attr_enable;
+
+ attrs[i++] = &target_fabric_tpg_base_attr_rtpi;
done:
cit->ct_item_ops = &target_fabric_tpg_base_item_ops;
diff --git a/drivers/target/target_core_tpg.c b/drivers/target/target_core_tpg.c
index b1d9383386ec..2e079c6a8e8c 100644
--- a/drivers/target/target_core_tpg.c
+++ b/drivers/target/target_core_tpg.c
@@ -445,10 +445,21 @@ static int target_tpg_register_rtpi(struct se_portal_group *se_tpg)
u32 val;
int ret;
- ret = xa_alloc(&tpg_xa, &val, se_tpg,
- XA_LIMIT(1, USHRT_MAX), GFP_KERNEL);
- if (!ret)
- se_tpg->tpg_rtpi = val;
+ if (se_tpg->rtpi_manual) {
+ ret = xa_insert(&tpg_xa, se_tpg->tpg_rtpi, se_tpg, GFP_KERNEL);
+ if (ret) {
+ pr_info("%s_TPG[%hu] - Can not set RTPI %#x, it is already busy",
+ se_tpg->se_tpg_tfo->fabric_name,
+ se_tpg->se_tpg_tfo->tpg_get_tag(se_tpg),
+ se_tpg->tpg_rtpi);
+ return -EINVAL;
+ }
+ } else {
+ ret = xa_alloc(&tpg_xa, &val, se_tpg,
+ XA_LIMIT(1, USHRT_MAX), GFP_KERNEL);
+ if (!ret)
+ se_tpg->tpg_rtpi = val;
+ }
return ret;
}
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h
index 008e0e4500d1..e52d0915b3d8 100644
--- a/include/target/target_core_base.h
+++ b/include/target/target_core_base.h
@@ -918,6 +918,7 @@ struct se_portal_group {
bool enabled;
/* RELATIVE TARGET PORT IDENTIFIER */
u16 tpg_rtpi;
+ bool rtpi_manual;
/* Used for PR SPEC_I_PT=1 and REGISTER_AND_MOVE */
atomic_t tpg_pr_ref_count;
/* Spinlock for adding/removing ACLed Nodes */
--
2.25.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v4 4/4] scsi: target: core: Add RTPI attribute for target port
2023-02-21 16:06 ` [PATCH v4 4/4] scsi: target: core: Add RTPI attribute for target port Dmitry Bogdanov
@ 2023-02-22 21:41 ` Mike Christie
2023-03-01 8:32 ` Dmitry Bogdanov
0 siblings, 1 reply; 7+ messages in thread
From: Mike Christie @ 2023-02-22 21:41 UTC (permalink / raw)
To: Dmitry Bogdanov, Martin Petersen, target-devel
Cc: Christoph Hellwig, linux-scsi, linux, Roman Bolshakov
On 2/21/23 10:06 AM, Dmitry Bogdanov wrote:
> +static ssize_t target_fabric_tpg_base_rtpi_show(struct config_item *item, char *page)
> +{
> + struct se_portal_group *se_tpg = attrib_to_tpg(item);
..
> +
> +static ssize_t target_fabric_tpg_base_rtpi_store(struct config_item *item,
> + const char *page, size_t count)
> +{
> + struct se_portal_group *se_tpg = attrib_to_tpg(item);
This interface is nicer. It doesn't work for me though. I think
it's because attrib_to_tpg is returning a bogus pointer. The rtpi
file is not in the attrib group so I think you have to use to_tpg().
Or, put the rtpi file in the attrib group if that's preferred (it
doesn't matter to me).
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v4 4/4] scsi: target: core: Add RTPI attribute for target port
2023-02-22 21:41 ` Mike Christie
@ 2023-03-01 8:32 ` Dmitry Bogdanov
0 siblings, 0 replies; 7+ messages in thread
From: Dmitry Bogdanov @ 2023-03-01 8:32 UTC (permalink / raw)
To: Mike Christie
Cc: Martin Petersen, target-devel, Christoph Hellwig, linux-scsi,
linux, Roman Bolshakov
On Wed, Feb 22, 2023 at 03:41:20PM -0600, Mike Christie wrote:
>
> On 2/21/23 10:06 AM, Dmitry Bogdanov wrote:
> > +static ssize_t target_fabric_tpg_base_rtpi_show(struct config_item *item, char *page)
> > +{
> > + struct se_portal_group *se_tpg = attrib_to_tpg(item);
>
> ..
>
> > +
> > +static ssize_t target_fabric_tpg_base_rtpi_store(struct config_item *item,
> > + const char *page, size_t count)
> > +{
> > + struct se_portal_group *se_tpg = attrib_to_tpg(item);
>
>
> This interface is nicer. It doesn't work for me though. I think
> it's because attrib_to_tpg is returning a bogus pointer. The rtpi
> file is not in the attrib group so I think you have to use to_tpg().
> Or, put the rtpi file in the attrib group if that's preferred (it
> doesn't matter to me).
Yes, I should use to_tpg. Forgot to change it after moving to tpgt_n
folder. Read after write was working for me so I didn't suspect
something was wrong.
^ permalink raw reply [flat|nested] 7+ messages in thread