@@ -1032,6 +1032,26 @@ static void iscsi_initiatorname_tolower(
}
}
+static int iscsi_setup_i_tpid(struct iscsi_session *sess, char *iname)
+{
+ struct t10_transport_id tpid;
+ char isid_buf[13];
+
+ sprintf(isid_buf, "%6phN", sess->isid);
+
+ memset(&tpid, 0, sizeof(tpid));
+ tpid.proto = SCSI_PROTOCOL_ISCSI;
+ tpid.format = 1;
+ tpid.iscsi.name = iname;
+ tpid.iscsi.session_id = isid_buf;
+
+ sess->se_sess->tpid = target_cp_transport_id(&tpid);
+ if (!sess->se_sess->tpid)
+ return -ENOMEM;
+
+ return 0;
+}
+
/*
* Processes the first Login Request..
*/
@@ -1260,11 +1280,21 @@ int iscsi_target_locate_portal(
tag_size = sizeof(struct iscsi_cmd) + conn->conn_transport->priv_size;
ret = transport_alloc_session_tags(sess->se_sess, tag_num, tag_size);
- if (ret < 0) {
- iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
- ISCSI_LOGIN_STATUS_NO_RESOURCES);
- ret = -1;
+ if (ret < 0)
+ goto return_oom;
+
+ if (conn->tpg != iscsit_global->discovery_tpg) {
+ if (iscsi_setup_i_tpid(sess, i_buf))
+ /* tags and nacl released when session is freed */
+ goto return_oom;
}
+
+ goto out;
+
+return_oom:
+ iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
+ ISCSI_LOGIN_STATUS_NO_RESOURCES);
+ ret = -1;
out:
kfree(tmpbuf);
return ret;
The iscsi target does its own session setup. This patch updates the driver so it sets up the transport id. Signed-off-by: Mike Christie <mchristi@redhat.com> --- drivers/target/iscsi/iscsi_target_nego.c | 38 ++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-)