@@ -1974,7 +1974,8 @@ enum {
Opt_initiator_fabric, Opt_initiator_node, Opt_initiator_sid,
Opt_sa_res_key, Opt_res_holder, Opt_res_type, Opt_res_scope,
Opt_res_all_tg_pt, Opt_mapped_lun, Opt_target_fabric,
- Opt_target_node, Opt_tpgt, Opt_port_rtpi, Opt_target_lun, Opt_err
+ Opt_target_node, Opt_tpgt, Opt_port_rtpi, Opt_target_lun,
+ Opt_proto_id, Opt_err
};
static match_table_t tokens = {
@@ -1992,6 +1993,7 @@ static match_table_t tokens = {
{Opt_tpgt, "tpgt=%d"},
{Opt_port_rtpi, "port_rtpi=%d"},
{Opt_target_lun, "target_lun=%u"},
+ {Opt_proto_id, "proto_id=%u"},
{Opt_err, NULL}
};
@@ -2010,6 +2012,7 @@ static ssize_t target_pr_res_aptpl_metadata_store(struct config_item *item,
u16 tpgt = 0;
u16 rtpi = 0;
u8 type = 0;
+ u8 proto_id = 0;
if (!dev->dev_attrib.emulate_pr ||
(dev->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR))
@@ -2151,6 +2154,12 @@ static ssize_t target_pr_res_aptpl_metadata_store(struct config_item *item,
goto out;
target_lun = (u64)tmp_ll;
break;
+ case Opt_proto_id:
+ ret = match_int(args, &arg);
+ if (ret)
+ goto out;
+ proto_id = (u16)arg;
+ break;
default:
break;
}
@@ -2171,7 +2180,7 @@ static ssize_t target_pr_res_aptpl_metadata_store(struct config_item *item,
ret = core_scsi3_alloc_aptpl_registration(&dev->t10_pr, sa_res_key,
i_port, isid, mapped_lun, rtpi, target_lun,
- res_holder, all_tg_pt, type);
+ res_holder, all_tg_pt, type, proto_id);
out:
kfree(i_fabric);
kfree(i_port);
@@ -842,7 +842,8 @@ int core_scsi3_alloc_aptpl_registration(
u64 target_lun,
int res_holder,
int all_tg_pt,
- u8 type)
+ u8 type,
+ u8 proto_id)
{
struct t10_pr_registration *pr_reg;
@@ -886,6 +887,7 @@ int core_scsi3_alloc_aptpl_registration(
* Copy the i_port information from caller.
*/
snprintf(pr_reg->pr_iport, PR_APTPL_MAX_IPORT_LEN, "%s", i_port);
+ target_gen_pr_transport_id(pr_reg, proto_id, i_port, isid);
/*
* Set pr_res_holder from caller, the pr_reg who is the reservation
* holder will get it's pointer set in core_scsi3_aptpl_reserve() once
@@ -1836,19 +1838,22 @@ static int core_scsi3_update_aptpl_buf(
"sa_res_key=%llu\n"
"res_holder=1\nres_type=%02x\n"
"res_scope=%02x\nres_all_tg_pt=%d\n"
- "mapped_lun=%llu\n", reg_count,
+ "mapped_lun=%llu\nproto_id=%u\n", reg_count,
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);
+ pr_reg->pr_res_mapped_lun,
+ pr_reg->pr_tid[0] & 0xF);
} else {
snprintf(tmp, 512, "PR_REG_START: %d\n"
"initiator_node=%s\n%s"
"sa_res_key=%llu\nres_holder=0\n"
- "res_all_tg_pt=%d\nmapped_lun=%llu\n",
+ "res_all_tg_pt=%d\nmapped_lun=%llu\n"
+ "proto_id=%u\n",
reg_count, pr_reg->pr_iport, isid_buf,
pr_reg->pr_res_key, pr_reg->pr_reg_all_tg_pt,
- pr_reg->pr_res_mapped_lun);
+ pr_reg->pr_res_mapped_lun,
+ pr_reg->pr_tid[0] & 0xF);
}
if ((len + strlen(tmp) >= pr_aptpl_buf_len)) {
@@ -64,7 +64,7 @@ extern sense_reason_t target_scsi2_reservation_reserve(struct se_cmd *);
extern int core_scsi3_alloc_aptpl_registration(
struct t10_reservation *, u64,
unsigned char *, unsigned char *, u64,
- u16, u64, int, int, u8);
+ u16, u64, int, int, u8, u8);
extern int core_scsi3_check_aptpl_registration(struct se_device *,
struct se_portal_group *, struct se_lun *,
struct se_node_acl *, u64);
Store and read proto_id in APTPL to create TransportID. That will allow to report registrations for not yet created TPG/ACL/LUNs Signed-off-by: Dmitry Bogdanov <d.bogdanov@yadro.com> --- drivers/target/target_core_configfs.c | 13 +++++++++++-- drivers/target/target_core_pr.c | 15 ++++++++++----- drivers/target/target_core_pr.h | 2 +- 3 files changed, 22 insertions(+), 8 deletions(-)