Re: [RFC PATCH 02/12] target: separate acl name from port ids

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 04/21/2020 09:49 AM, Bodo Stroesser wrote:
> I'm wondering, whether the 'format' element of the new t10_transport_id
> structure is useful:
> 
> - It is used for iSCSI only, but is a common field for all protocols.
> 
> - In iSCSI, if format is 0 then session_id is NULL, and if format is
>   not 0 then session_id is not NULL. So session_id can be used for the
>   same purpose.
> 
> - I think it is a bug that tcm_loop and vhost claim to run iSCSI
>   protocol, but don't deliver an ISID. They e.g. could use the "Random"
>   format for the ISID, which starts with byte 0x80 followed by 3 random
>   bytes and 2 further bytes denoting the session.
> 
> Removing the format element would of course mean to not add the "format"
> session attribute later. (The "session_id" attribute doesn't even check
> format, but uses session_id as argument to "%s" in snprintf even if it
> is NULL).

Yeah, I was just letting it print "NULL" like the other stat file we
have that prints out the isid.

I can just drop format and it will print out "" like the ACL file.

> 
> 
> On 04/20/20 21:14, Mike Christie wrote:
>> To handle features like PGRs in userspace we need the entire iniaitor
>> port id. For iscsi that is defined as the initiator name plus the
>> session identifier. The session id is hidden from users, because
>> its internal to the drivers, so this patch separates the acl name
>> from the SCSI port ids.
>>
>> This will then allow other drivers like SRP to use different values
>> like the port id or src address for the ACL, but then use the port
>> id for transport ID checks in target_core_fabric.c.
>>
>> This will also be used to export the initiator info in the session's
>> sysfs dir in the last patches, so tools like tcmu-runner can rebuild
>> its session state used when handling PGR commands.
>>
>> Signed-off-by: Mike Christie <mchristi@xxxxxxxxxx>
>> ---
>>   drivers/infiniband/ulp/srpt/ib_srpt.c    | 13 +++--
>>   drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c |  9 +++-
>>   drivers/scsi/qla2xxx/tcm_qla2xxx.c       |  8 ++-
>>   drivers/target/loopback/tcm_loop.c       | 24 ++++++++-
>>   drivers/target/sbp/sbp_target.c          |  9 +++-
>>   drivers/target/target_core_fabric_lib.c  | 87
>> ++++++++++++++++++++++++++++++++
>>   drivers/target/target_core_internal.h    |  1 +
>>   drivers/target/target_core_transport.c   | 22 +++++---
>>   drivers/target/tcm_fc/tfc_sess.c         | 10 +++-
>>   drivers/usb/gadget/function/f_tcm.c      | 11 +++-
>>   drivers/vhost/scsi.c                     | 25 +++++++--
>>   drivers/xen/xen-scsiback.c               | 28 ++++++++--
>>   include/target/target_core_base.h        | 24 +++++++++
>>   include/target/target_core_fabric.h      |  3 +-
>>   14 files changed, 245 insertions(+), 29 deletions(-)
>>
>> diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c
>> b/drivers/infiniband/ulp/srpt/ib_srpt.c
>> index 9855274..caeb32e 100644
>> --- a/drivers/infiniband/ulp/srpt/ib_srpt.c
>> +++ b/drivers/infiniband/ulp/srpt/ib_srpt.c
>> @@ -2144,6 +2144,7 @@ static int srpt_cm_req_recv(struct srpt_device
>> *const sdev,
>>                   const char *src_addr)
>>   {
>>       struct srpt_port *sport = &sdev->port[port_num - 1];
>> +    struct t10_transport_id tpid;
>>       struct srpt_nexus *nexus;
>>       struct srp_login_rsp *rsp = NULL;
>>       struct srp_login_rej *rej = NULL;
>> @@ -2314,13 +2315,17 @@ static int srpt_cm_req_recv(struct srpt_device
>> *const sdev,
>>       tag_num = ch->rq_size;
>>       tag_size = 1; /* ib_srpt does not use se_sess->sess_cmd_map */
>>   +    memset(&tpid, 0, sizeof(tpid));
>> +    tpid.proto = SCSI_PROTOCOL_SRP;
>> +    tpid.srp.port_id = i_port_id + 2;
>> +
>>       mutex_lock(&sport->port_guid_id.mutex);
>>       list_for_each_entry(stpg, &sport->port_guid_id.tpg_list, entry) {
>>           if (!IS_ERR_OR_NULL(ch->sess))
>>               break;
>>           ch->sess = target_setup_session(&stpg->tpg, tag_num,
>>                           tag_size, TARGET_PROT_NORMAL,
>> -                        ch->sess_name, ch, NULL);
>> +                        &tpid, ch->sess_name, ch, NULL);
>>       }
>>       mutex_unlock(&sport->port_guid_id.mutex);
>>   @@ -2329,14 +2334,14 @@ static int srpt_cm_req_recv(struct
>> srpt_device *const sdev,
>>           if (!IS_ERR_OR_NULL(ch->sess))
>>               break;
>>           ch->sess = target_setup_session(&stpg->tpg, tag_num,
>> -                    tag_size, TARGET_PROT_NORMAL, i_port_id,
>> -                    ch, NULL);
>> +                    tag_size, TARGET_PROT_NORMAL, &tpid,
>> +                    i_port_id, ch, NULL);
>>           if (!IS_ERR_OR_NULL(ch->sess))
>>               break;
>>           /* Retry without leading "0x" */
>>           ch->sess = target_setup_session(&stpg->tpg, tag_num,
>>                           tag_size, TARGET_PROT_NORMAL,
>> -                        i_port_id + 2, ch, NULL);
>> +                        &tpid, i_port_id + 2, ch, NULL);
>>       }
>>       mutex_unlock(&sport->port_gid_id.mutex);
>>   diff --git a/drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c
>> b/drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c
>> index d9e94e8..dba9ec0 100644
>> --- a/drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c
>> +++ b/drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c
>> @@ -2208,6 +2208,7 @@ static int ibmvscsis_make_nexus(struct
>> ibmvscsis_tport *tport)
>>   {
>>       char *name = tport->tport_name;
>>       struct ibmvscsis_nexus *nexus;
>> +    struct t10_transport_id tpid;
>>       struct scsi_info *vscsi = container_of(tport, struct scsi_info,
>> tport);
>>       int rc;
>>   @@ -2222,9 +2223,13 @@ static int ibmvscsis_make_nexus(struct
>> ibmvscsis_tport *tport)
>>           return -ENOMEM;
>>       }
>>   +    memset(&tpid, 0, sizeof(tpid));
>> +    tpid.proto = SCSI_PROTOCOL_SRP;
>> +    tpid.srp.port_id = name;
>> +
>>       nexus->se_sess = target_setup_session(&tport->se_tpg, 0, 0,
>> -                          TARGET_PROT_NORMAL, name, nexus,
>> -                          NULL);
>> +                          TARGET_PROT_NORMAL, &tpid, name,
>> +                          nexus, NULL);
>>       if (IS_ERR(nexus->se_sess)) {
>>           rc = PTR_ERR(nexus->se_sess);
>>           goto transport_init_fail;
>> diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.c
>> b/drivers/scsi/qla2xxx/tcm_qla2xxx.c
>> index abe7f79..42a4025 100644
>> --- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c
>> +++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c
>> @@ -1428,6 +1428,7 @@ static int tcm_qla2xxx_check_initiator_node_acl(
>>   {
>>       struct qla_hw_data *ha = vha->hw;
>>       struct tcm_qla2xxx_lport *lport;
>> +    struct t10_transport_id tpid;
>>       struct tcm_qla2xxx_tpg *tpg;
>>       struct se_session *se_sess;
>>       unsigned char port_name[36];
>> @@ -1454,13 +1455,18 @@ static int tcm_qla2xxx_check_initiator_node_acl(
>>        */
>>       memset(&port_name, 0, 36);
>>       snprintf(port_name, sizeof(port_name), "%8phC", fc_wwpn);
>> +
>> +    memset(&tpid, 0, sizeof(tpid));
>> +    tpid.proto = SCSI_PROTOCOL_FCP;
>> +    tpid.fcp.port_name = port_name;
>> +
>>       /*
>>        * Locate our struct se_node_acl either from an explict NodeACL
>> created
>>        * via ConfigFS, or via running in TPG demo mode.
>>        */
>>       se_sess = target_setup_session(&tpg->se_tpg, num_tags,
>>                          sizeof(struct qla_tgt_cmd),
>> -                       TARGET_PROT_ALL, port_name,
>> +                       TARGET_PROT_ALL, &tpid, port_name,
>>                          qlat_sess, tcm_qla2xxx_session_cb);
>>       if (IS_ERR(se_sess))
>>           return PTR_ERR(se_sess);
>> diff --git a/drivers/target/loopback/tcm_loop.c
>> b/drivers/target/loopback/tcm_loop.c
>> index 3305b47..7593a53 100644
>> --- a/drivers/target/loopback/tcm_loop.c
>> +++ b/drivers/target/loopback/tcm_loop.c
>> @@ -725,10 +725,11 @@ static int tcm_loop_alloc_sess_cb(struct
>> se_portal_group *se_tpg,
>>     static int tcm_loop_make_nexus(
>>       struct tcm_loop_tpg *tl_tpg,
>> -    const char *name)
>> +    char *name)
>>   {
>>       struct tcm_loop_hba *tl_hba = tl_tpg->tl_hba;
>>       struct tcm_loop_nexus *tl_nexus;
>> +    struct t10_transport_id tpid;
>>       int ret;
>>         if (tl_tpg->tl_nexus) {
>> @@ -736,13 +737,32 @@ static int tcm_loop_make_nexus(
>>           return -EEXIST;
>>       }
>>   +    memset(&tpid, 0, sizeof(tpid));
>> +    tpid.proto = tl_hba->tl_proto_id;
>> +
>> +    switch (tpid.proto) {
>> +    case SCSI_PROTOCOL_SAS:
>> +        tpid.sas.addr = name;
>> +        break;
>> +    case SCSI_PROTOCOL_FCP:
>> +        tpid.fcp.port_name = name;
>> +        break;
>> +    case SCSI_PROTOCOL_ISCSI:
>> +        /* we only support format=0 */
>> +        tpid.iscsi.name = name;
>> +        break;
>> +    default:
>> +        return -EINVAL;
>> +    }
>> +
>>       tl_nexus = kzalloc(sizeof(*tl_nexus), GFP_KERNEL);
>>       if (!tl_nexus)
>>           return -ENOMEM;
>>         tl_nexus->se_sess = target_setup_session(&tl_tpg->tl_se_tpg,
>> 0, 0,
>>                       TARGET_PROT_DIN_PASS | TARGET_PROT_DOUT_PASS,
>> -                    name, tl_nexus, tcm_loop_alloc_sess_cb);
>> +                    &tpid, name, tl_nexus,
>> +                    tcm_loop_alloc_sess_cb);
>>       if (IS_ERR(tl_nexus->se_sess)) {
>>           ret = PTR_ERR(tl_nexus->se_sess);
>>           kfree(tl_nexus);
>> diff --git a/drivers/target/sbp/sbp_target.c
>> b/drivers/target/sbp/sbp_target.c
>> index e4a9b9f..9a3121d 100644
>> --- a/drivers/target/sbp/sbp_target.c
>> +++ b/drivers/target/sbp/sbp_target.c
>> @@ -181,6 +181,7 @@ static struct sbp_session *sbp_session_create(
>>           struct sbp_tpg *tpg,
>>           u64 guid)
>>   {
>> +    struct t10_transport_id tpid;
>>       struct sbp_session *sess;
>>       int ret;
>>       char guid_str[17];
>> @@ -196,10 +197,14 @@ static struct sbp_session *sbp_session_create(
>>       INIT_DELAYED_WORK(&sess->maint_work, session_maintenance_work);
>>       sess->guid = guid;
>>   +    memset(&tpid, 0, sizeof(tpid));
>> +    tpid.proto = SCSI_PROTOCOL_SBP;
>> +    tpid.sbp.name = guid_str;
>> +
>>       sess->se_sess = target_setup_session(&tpg->se_tpg, 128,
>>                            sizeof(struct sbp_target_request),
>> -                         TARGET_PROT_NORMAL, guid_str,
>> -                         sess, NULL);
>> +                         TARGET_PROT_NORMAL, &tpid,
>> +                         guid_str, sess, NULL);
>>       if (IS_ERR(sess->se_sess)) {
>>           pr_err("failed to init se_session\n");
>>           ret = PTR_ERR(sess->se_sess);
>> diff --git a/drivers/target/target_core_fabric_lib.c
>> b/drivers/target/target_core_fabric_lib.c
>> index 6b4b354..39b0e5e 100644
>> --- a/drivers/target/target_core_fabric_lib.c
>> +++ b/drivers/target/target_core_fabric_lib.c
>> @@ -421,3 +421,90 @@ const char
>> *target_parse_pr_out_transport_id(struct se_portal_group *tpg,
>>       *out_tid_len = 24;
>>       return buf + offset;
>>   }
>> +
>> +struct t10_transport_id *target_cp_transport_id(struct
>> t10_transport_id *src)
>> +{
>> +    struct t10_transport_id *dst;
>> +
>> +    dst = kzalloc(sizeof(*dst), GFP_KERNEL);
>> +    if (!dst)
>> +        return NULL;
>> +    dst->format = src->format;
>> +    dst->proto = src->proto;
>> +
>> +    switch (src->proto) {
>> +    case SCSI_PROTOCOL_FCP:
>> +        dst->fcp.port_name = kstrdup(src->fcp.port_name, GFP_KERNEL);
>> +        if (!dst->fcp.port_name)
>> +            goto free_tpid;
>> +        break;
>> +    case SCSI_PROTOCOL_SBP:
>> +        dst->sbp.name = kstrdup(src->sbp.name, GFP_KERNEL);
>> +        if (!dst->sbp.name)
>> +            goto free_tpid;
>> +        break;
>> +    case SCSI_PROTOCOL_SRP:
>> +        dst->srp.port_id = kstrdup(src->srp.port_id, GFP_KERNEL);
>> +        if (!dst->srp.port_id)
>> +            goto free_tpid;
>> +        break;
>> +    case SCSI_PROTOCOL_SAS:
>> +        dst->sas.addr = kstrdup(src->sas.addr, GFP_KERNEL);
>> +        if (!dst->sas.addr)
>> +            goto free_tpid;
>> +        break;
>> +    case SCSI_PROTOCOL_ISCSI:
>> +        dst->iscsi.name = kstrdup(src->iscsi.name, GFP_KERNEL);
>> +        if (!dst->iscsi.name)
>> +            goto free_tpid;
>> +
>> +        if (src->format) {
>> +            dst->iscsi.session_id = kstrdup(src->iscsi.session_id,
>> +                            GFP_KERNEL);
>> +            if (!dst->iscsi.session_id) {
>> +                kfree(dst->iscsi.name);
>> +                goto free_tpid;
>> +            }
>> +        }
>> +        break;
>> +    default:
>> +        pr_err("Unknown proto_id: 0x%02x\n", src->proto);
>> +        return NULL;
>> +    }
>> +
>> +    return dst;
>> +
>> +free_tpid:
>> +    kfree(dst);
>> +    return NULL;
>> +}
>> +EXPORT_SYMBOL(target_cp_transport_id);
>> +
>> +void target_free_transport_id(struct t10_transport_id *tpid)
>> +{
>> +    if (!tpid)
>> +        return;
>> +
>> +    switch (tpid->proto) {
>> +    case SCSI_PROTOCOL_FCP:
>> +        kfree(tpid->fcp.port_name);
>> +        break;
>> +    case SCSI_PROTOCOL_SBP:
>> +        kfree(tpid->sbp.name);
>> +        break;
>> +    case SCSI_PROTOCOL_SRP:
>> +        kfree(tpid->srp.port_id);
>> +        break;
>> +    case SCSI_PROTOCOL_SAS:
>> +        kfree(tpid->sas.addr);
>> +        break;
>> +    case SCSI_PROTOCOL_ISCSI:
>> +        kfree(tpid->iscsi.name);
>> +        kfree(tpid->iscsi.session_id);
>> +        break;
>> +    default:
>> +        pr_err("Unknown proto_id: 0x%02x\n", tpid->proto);
>> +        return;
>> +    }
>> +    kfree(tpid);
>> +}
>> diff --git a/drivers/target/target_core_internal.h
>> b/drivers/target/target_core_internal.h
>> index 8533444..5e016aa 100644
>> --- a/drivers/target/target_core_internal.h
>> +++ b/drivers/target/target_core_internal.h
>> @@ -104,6 +104,7 @@ int    target_get_pr_transport_id(struct
>> se_node_acl *nacl,
>>           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);
>> +void target_free_transport_id(struct t10_transport_id *tpid);
>>     /* target_core_hba.c */
>>   struct se_hba *core_alloc_hba(const char *, u32, u32);
>> diff --git a/drivers/target/target_core_transport.c
>> b/drivers/target/target_core_transport.c
>> index 0ae9e60..adf4a84 100644
>> --- a/drivers/target/target_core_transport.c
>> +++ b/drivers/target/target_core_transport.c
>> @@ -416,12 +416,13 @@ void transport_register_session(
>>   struct se_session *
>>   target_setup_session(struct se_portal_group *tpg,
>>                unsigned int tag_num, unsigned int tag_size,
>> -             enum target_prot_op prot_op,
>> +             enum target_prot_op prot_op, struct t10_transport_id *tpid,
>>                const char *initiatorname, void *private,
>>                int (*callback)(struct se_portal_group *,
>>                        struct se_session *, void *))
>>   {
>>       struct se_session *sess;
>> +    int rc;
>>         /*
>>        * If the fabric driver is using percpu-ida based pre allocation
>> @@ -435,6 +436,12 @@ struct se_session *
>>       if (IS_ERR(sess))
>>           return sess;
>>   +    sess->tpid = target_cp_transport_id(tpid);
>> +    if (!sess->tpid) {
>> +        rc = -ENOMEM;
>> +        goto free_sess;
>> +    }
>> +
>>       sess->se_node_acl = core_tpg_check_initiator_node_acl(tpg,
>>                       (unsigned char *)initiatorname);
>>       if (!sess->se_node_acl) {
>> @@ -446,15 +453,17 @@ struct se_session *
>>        * required before transport_register_session().
>>        */
>>       if (callback != NULL) {
>> -        int rc = callback(tpg, sess, private);
>> -        if (rc) {
>> -            transport_free_session(sess);
>> -            return ERR_PTR(rc);
>> -        }
>> +        rc = callback(tpg, sess, private);
>> +        if (rc)
>> +            goto free_sess;
>>       }
>>         transport_register_session(tpg, sess->se_node_acl, sess,
>> private);
>>       return sess;
>> +
>> +free_sess:
>> +    transport_free_session(sess);
>> +    return ERR_PTR(rc);
>>   }
>>   EXPORT_SYMBOL(target_setup_session);
>>   @@ -579,6 +588,7 @@ void transport_free_session(struct se_session
>> *se_sess)
>>           sbitmap_queue_free(&se_sess->sess_tag_pool);
>>           kvfree(se_sess->sess_cmd_map);
>>       }
>> +    target_free_transport_id(se_sess->tpid);
>>       percpu_ref_exit(&se_sess->cmd_count);
>>       kmem_cache_free(se_sess_cache, se_sess);
>>   }
>> diff --git a/drivers/target/tcm_fc/tfc_sess.c
>> b/drivers/target/tcm_fc/tfc_sess.c
>> index 4fd6a1d..f261756 100644
>> --- a/drivers/target/tcm_fc/tfc_sess.c
>> +++ b/drivers/target/tcm_fc/tfc_sess.c
>> @@ -208,6 +208,7 @@ static struct ft_sess *ft_sess_create(struct
>> ft_tport *tport, u32 port_id,
>>                         struct fc_rport_priv *rdata)
>>   {
>>       struct se_portal_group *se_tpg = &tport->tpg->se_tpg;
>> +    struct t10_transport_id tpid;
>>       struct ft_sess *sess;
>>       struct hlist_head *head;
>>       unsigned char initiatorname[TRANSPORT_IQN_LEN];
>> @@ -227,10 +228,15 @@ static struct ft_sess *ft_sess_create(struct
>> ft_tport *tport, u32 port_id,
>>       sess->tport = tport;
>>       sess->port_id = port_id;
>>   +    memset(&tpid, 0, sizeof(tpid));
>> +    tpid.proto = SCSI_PROTOCOL_FCP;
>> +    tpid.fcp.port_name = &initiatorname[0];
>> +
>>       sess->se_sess = target_setup_session(se_tpg, TCM_FC_DEFAULT_TAGS,
>>                            sizeof(struct ft_cmd),
>> -                         TARGET_PROT_NORMAL, &initiatorname[0],
>> -                         sess, ft_sess_alloc_cb);
>> +                         TARGET_PROT_NORMAL, &tpid,
>> +                         &initiatorname[0], sess,
>> +                         ft_sess_alloc_cb);
>>       if (IS_ERR(sess->se_sess)) {
>>           int rc = PTR_ERR(sess->se_sess);
>>           kfree(sess);
>> diff --git a/drivers/usb/gadget/function/f_tcm.c
>> b/drivers/usb/gadget/function/f_tcm.c
>> index 3650493..e282eb9 100644
>> --- a/drivers/usb/gadget/function/f_tcm.c
>> +++ b/drivers/usb/gadget/function/f_tcm.c
>> @@ -1564,6 +1564,7 @@ static int usbg_alloc_sess_cb(struct
>> se_portal_group *se_tpg,
>>   static int tcm_usbg_make_nexus(struct usbg_tpg *tpg, char *name)
>>   {
>>       struct tcm_usbg_nexus *tv_nexus;
>> +    struct t10_transport_id tpid;
>>       int ret = 0;
>>         mutex_lock(&tpg->tpg_mutex);
>> @@ -1579,11 +1580,17 @@ static int tcm_usbg_make_nexus(struct usbg_tpg
>> *tpg, char *name)
>>           goto out_unlock;
>>       }
>>   +    memset(&tpid, 0, sizeof(tpid));
>> +    tpid.proto = tpg->se_tpg.proto_id;
>> +    /* SPC does not assign a proto id for USB-SCSI so we use SAS
>> naming */
>> +    tpid.sas.addr = name;
>> +
>>       tv_nexus->tvn_se_sess = target_setup_session(&tpg->se_tpg,
>>                                USB_G_DEFAULT_SESSION_TAGS,
>>                                sizeof(struct usbg_cmd),
>> -                             TARGET_PROT_NORMAL, name,
>> -                             tv_nexus, usbg_alloc_sess_cb);
>> +                             TARGET_PROT_NORMAL, &tpid,
>> +                             name, tv_nexus,
>> +                             usbg_alloc_sess_cb);
>>       if (IS_ERR(tv_nexus->tvn_se_sess)) {
>>   #define MAKE_NEXUS_MSG "core_tpg_check_initiator_node_acl() failed
>> for %s\n"
>>           pr_debug(MAKE_NEXUS_MSG, name);
>> diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c
>> index 0b949a1..bc377ee 100644
>> --- a/drivers/vhost/scsi.c
>> +++ b/drivers/vhost/scsi.c
>> @@ -1937,10 +1937,10 @@ static int vhost_scsi_nexus_cb(struct
>> se_portal_group *se_tpg,
>>       return -ENOMEM;
>>   }
>>   -static int vhost_scsi_make_nexus(struct vhost_scsi_tpg *tpg,
>> -                const char *name)
>> +static int vhost_scsi_make_nexus(struct vhost_scsi_tpg *tpg, char *name)
>>   {
>>       struct vhost_scsi_nexus *tv_nexus;
>> +    struct t10_transport_id tpid;
>>         mutex_lock(&tpg->tv_tpg_mutex);
>>       if (tpg->tpg_nexus) {
>> @@ -1949,6 +1949,25 @@ static int vhost_scsi_make_nexus(struct
>> vhost_scsi_tpg *tpg,
>>           return -EEXIST;
>>       }
>>   +    memset(&tpid, 0, sizeof(tpid));
>> +    tpid.proto = tpg->se_tpg.proto_id;
>> +
>> +    switch (tpid.proto) {
>> +    case SCSI_PROTOCOL_SAS:
>> +        tpid.sas.addr = name;
>> +        break;
>> +    case SCSI_PROTOCOL_FCP:
>> +        tpid.fcp.port_name = name;
>> +        break;
>> +    case SCSI_PROTOCOL_ISCSI:
>> +        /* we only support format=0 */
>> +        tpid.iscsi.name = name;
>> +        break;
>> +    default:
>> +        mutex_unlock(&tpg->tv_tpg_mutex);
>> +        return -EINVAL;
>> +    }
>> +
>>       tv_nexus = kzalloc(sizeof(*tv_nexus), GFP_KERNEL);
>>       if (!tv_nexus) {
>>           mutex_unlock(&tpg->tv_tpg_mutex);
>> @@ -1964,7 +1983,7 @@ static int vhost_scsi_make_nexus(struct
>> vhost_scsi_tpg *tpg,
>>                       VHOST_SCSI_DEFAULT_TAGS,
>>                       sizeof(struct vhost_scsi_cmd),
>>                       TARGET_PROT_DIN_PASS | TARGET_PROT_DOUT_PASS,
>> -                    (unsigned char *)name, tv_nexus,
>> +                    &tpid, (unsigned char *)name, tv_nexus,
>>                       vhost_scsi_nexus_cb);
>>       if (IS_ERR(tv_nexus->tvn_se_sess)) {
>>           mutex_unlock(&tpg->tv_tpg_mutex);
>> diff --git a/drivers/xen/xen-scsiback.c b/drivers/xen/xen-scsiback.c
>> index ba0942e..0855a77f 100644
>> --- a/drivers/xen/xen-scsiback.c
>> +++ b/drivers/xen/xen-scsiback.c
>> @@ -1507,10 +1507,10 @@ static int scsiback_alloc_sess_cb(struct
>> se_portal_group *se_tpg,
>>       return 0;
>>   }
>>   -static int scsiback_make_nexus(struct scsiback_tpg *tpg,
>> -                const char *name)
>> +static int scsiback_make_nexus(struct scsiback_tpg *tpg, char *name)
>>   {
>>       struct scsiback_nexus *tv_nexus;
>> +    struct t10_transport_id tpid;
>>       int ret = 0;
>>         mutex_lock(&tpg->tv_tpg_mutex);
>> @@ -1520,6 +1520,25 @@ static int scsiback_make_nexus(struct
>> scsiback_tpg *tpg,
>>           goto out_unlock;
>>       }
>>   +    memset(&tpid, 0, sizeof(tpid));
>> +    tpid.proto = tpg->se_tpg.proto_id;
>> +
>> +    switch (tpid.proto) {
>> +    case SCSI_PROTOCOL_SAS:
>> +        tpid.sas.addr = name;
>> +        break;
>> +    case SCSI_PROTOCOL_FCP:
>> +        tpid.fcp.port_name = name;
>> +        break;
>> +    case SCSI_PROTOCOL_ISCSI:
>> +        /* we only support format=0 */
>> +        tpid.iscsi.name = name;
>> +        break;
>> +    default:
>> +        ret =-EINVAL;
>> +        goto out_unlock;
>> +    }
>> +
>>       tv_nexus = kzalloc(sizeof(struct scsiback_nexus), GFP_KERNEL);
>>       if (!tv_nexus) {
>>           ret = -ENOMEM;
>> @@ -1529,8 +1548,9 @@ static int scsiback_make_nexus(struct
>> scsiback_tpg *tpg,
>>       tv_nexus->tvn_se_sess = target_setup_session(&tpg->se_tpg,
>>                                VSCSI_DEFAULT_SESSION_TAGS,
>>                                sizeof(struct vscsibk_pend),
>> -                             TARGET_PROT_NORMAL, name,
>> -                             tv_nexus, scsiback_alloc_sess_cb);
>> +                             TARGET_PROT_NORMAL, &tpid,
>> +                             name, tv_nexus,
>> +                             scsiback_alloc_sess_cb);
>>       if (IS_ERR(tv_nexus->tvn_se_sess)) {
>>           kfree(tv_nexus);
>>           ret = -ENOMEM;
>> diff --git a/include/target/target_core_base.h
>> b/include/target/target_core_base.h
>> index 1728e88..cd440ea 100644
>> --- a/include/target/target_core_base.h
>> +++ b/include/target/target_core_base.h
>> @@ -333,6 +333,29 @@ struct t10_wwn {
>>       struct list_head t10_vpd_list;
>>   };
>>   +struct t10_transport_id {
>> +    union {
>> +        struct {
>> +            char *port_name;
>> +        } fcp;
>> +        struct {
>> +            char *addr;
>> +        } sas;
>> +        struct {
>> +            char *name;
>> +        } sbp;
>> +        struct {
>> +            char *port_id;
>> +        } srp;
>> +        struct {
>> +            char *name;
>> +            char *session_id;
>> +        } iscsi;
>> +    };
>> +    u8 format;
>> +    u8 proto;
>> +};
>> +
>>   struct t10_pr_registration {
>>       /* Used for fabrics that contain WWN+ISID */
>>   #define PR_REG_ISID_LEN                16
>> @@ -605,6 +628,7 @@ static inline struct se_node_acl
>> *fabric_stat_to_nacl(struct config_item *item)
>>   struct se_session {
>>       unsigned        sess_tearing_down:1;
>>       u64            sess_bin_isid;
>> +    struct t10_transport_id    *tpid;
>>       enum target_prot_op    sup_prot_ops;
>>       enum target_prot_type    sess_prot_type;
>>       struct se_node_acl    *se_node_acl;
>> diff --git a/include/target/target_core_fabric.h
>> b/include/target/target_core_fabric.h
>> index 063f133..6b8a6bc 100644
>> --- a/include/target/target_core_fabric.h
>> +++ b/include/target/target_core_fabric.h
>> @@ -125,9 +125,10 @@ struct target_core_fabric_ops {
>>   int target_depend_item(struct config_item *item);
>>   void target_undepend_item(struct config_item *item);
>>   +struct t10_transport_id *target_cp_transport_id(struct
>> t10_transport_id *);
>>   struct se_session *target_setup_session(struct se_portal_group *,
>>           unsigned int, unsigned int, enum target_prot_op prot_op,
>> -        const char *, void *,
>> +        struct t10_transport_id *, const char *, void *,
>>           int (*callback)(struct se_portal_group *,
>>                   struct se_session *, void *));
>>   void target_remove_session(struct se_session *);
>>
> 




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux