|
@@ -802,58 +802,48 @@ static struct configfs_attribute *tcm_loop_tpg_attrib_attrs[] = {
|
|
|
|
|
|
/* Start items for tcm_loop_nexus_cit */
|
|
/* Start items for tcm_loop_nexus_cit */
|
|
|
|
|
|
|
|
+static int tcm_loop_alloc_sess_cb(struct se_portal_group *se_tpg,
|
|
|
|
+ struct se_session *se_sess, void *p)
|
|
|
|
+{
|
|
|
|
+ struct tcm_loop_tpg *tl_tpg = container_of(se_tpg,
|
|
|
|
+ struct tcm_loop_tpg, tl_se_tpg);
|
|
|
|
+
|
|
|
|
+ tl_tpg->tl_nexus = p;
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
static int tcm_loop_make_nexus(
|
|
static int tcm_loop_make_nexus(
|
|
struct tcm_loop_tpg *tl_tpg,
|
|
struct tcm_loop_tpg *tl_tpg,
|
|
const char *name)
|
|
const char *name)
|
|
{
|
|
{
|
|
- struct se_portal_group *se_tpg;
|
|
|
|
struct tcm_loop_hba *tl_hba = tl_tpg->tl_hba;
|
|
struct tcm_loop_hba *tl_hba = tl_tpg->tl_hba;
|
|
struct tcm_loop_nexus *tl_nexus;
|
|
struct tcm_loop_nexus *tl_nexus;
|
|
- int ret = -ENOMEM;
|
|
|
|
|
|
+ int ret;
|
|
|
|
|
|
if (tl_tpg->tl_nexus) {
|
|
if (tl_tpg->tl_nexus) {
|
|
pr_debug("tl_tpg->tl_nexus already exists\n");
|
|
pr_debug("tl_tpg->tl_nexus already exists\n");
|
|
return -EEXIST;
|
|
return -EEXIST;
|
|
}
|
|
}
|
|
- se_tpg = &tl_tpg->tl_se_tpg;
|
|
|
|
|
|
|
|
tl_nexus = kzalloc(sizeof(struct tcm_loop_nexus), GFP_KERNEL);
|
|
tl_nexus = kzalloc(sizeof(struct tcm_loop_nexus), GFP_KERNEL);
|
|
if (!tl_nexus) {
|
|
if (!tl_nexus) {
|
|
pr_err("Unable to allocate struct tcm_loop_nexus\n");
|
|
pr_err("Unable to allocate struct tcm_loop_nexus\n");
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
}
|
|
}
|
|
- /*
|
|
|
|
- * Initialize the struct se_session pointer
|
|
|
|
- */
|
|
|
|
- tl_nexus->se_sess = transport_init_session(
|
|
|
|
- TARGET_PROT_DIN_PASS | TARGET_PROT_DOUT_PASS);
|
|
|
|
|
|
+
|
|
|
|
+ tl_nexus->se_sess = target_alloc_session(&tl_tpg->tl_se_tpg, 0, 0,
|
|
|
|
+ TARGET_PROT_DIN_PASS | TARGET_PROT_DOUT_PASS,
|
|
|
|
+ name, tl_nexus, tcm_loop_alloc_sess_cb);
|
|
if (IS_ERR(tl_nexus->se_sess)) {
|
|
if (IS_ERR(tl_nexus->se_sess)) {
|
|
ret = PTR_ERR(tl_nexus->se_sess);
|
|
ret = PTR_ERR(tl_nexus->se_sess);
|
|
- goto out;
|
|
|
|
- }
|
|
|
|
- /*
|
|
|
|
- * Since we are running in 'demo mode' this call with generate a
|
|
|
|
- * struct se_node_acl for the tcm_loop struct se_portal_group with the SCSI
|
|
|
|
- * Initiator port name of the passed configfs group 'name'.
|
|
|
|
- */
|
|
|
|
- tl_nexus->se_sess->se_node_acl = core_tpg_check_initiator_node_acl(
|
|
|
|
- se_tpg, (unsigned char *)name);
|
|
|
|
- if (!tl_nexus->se_sess->se_node_acl) {
|
|
|
|
- transport_free_session(tl_nexus->se_sess);
|
|
|
|
- goto out;
|
|
|
|
|
|
+ kfree(tl_nexus);
|
|
|
|
+ return ret;
|
|
}
|
|
}
|
|
- /* Now, register the I_T Nexus as active. */
|
|
|
|
- transport_register_session(se_tpg, tl_nexus->se_sess->se_node_acl,
|
|
|
|
- tl_nexus->se_sess, tl_nexus);
|
|
|
|
- tl_tpg->tl_nexus = tl_nexus;
|
|
|
|
|
|
+
|
|
pr_debug("TCM_Loop_ConfigFS: Established I_T Nexus to emulated"
|
|
pr_debug("TCM_Loop_ConfigFS: Established I_T Nexus to emulated"
|
|
" %s Initiator Port: %s\n", tcm_loop_dump_proto_id(tl_hba),
|
|
" %s Initiator Port: %s\n", tcm_loop_dump_proto_id(tl_hba),
|
|
name);
|
|
name);
|
|
return 0;
|
|
return 0;
|
|
-
|
|
|
|
-out:
|
|
|
|
- kfree(tl_nexus);
|
|
|
|
- return ret;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
static int tcm_loop_drop_nexus(
|
|
static int tcm_loop_drop_nexus(
|