From 860e10c739b21c7b624800a1c2db0c50d56693b9 Mon Sep 17 00:00:00 2001 From: Chris Leech Date: Feb 18 2014 06:48:06 +0000 Subject: Fix broken discovery sessions over iser Resolves: #1059332 Signed-off-by: Chris Leech --- diff --git a/0070-iscsi-tools-set-non-negotiated-params-early.patch b/0070-iscsi-tools-set-non-negotiated-params-early.patch new file mode 100644 index 0000000..2815696 --- /dev/null +++ b/0070-iscsi-tools-set-non-negotiated-params-early.patch @@ -0,0 +1,236 @@ +From ea05be3ff043efd44256283d968fa1bb9a371568 Mon Sep 17 00:00:00 2001 +From: Mike Christie +Date: Thu, 13 Feb 2014 12:37:09 -0600 +Subject: [PATCH] iscsi tools: set non negotiated params early. + +This patch has the iscsi tools pass down the non-negotiated +iscsi settings before doing iscsi login. This allows the +drivers to get info that might be neede to setup the session +early. + +This patch also adds the missing discovery_sess param to +the non negotiated params. +--- + usr/discovery.c | 15 +++++++++-- + usr/initiator.c | 22 +++++++++++----- + usr/initiator.h | 1 + + usr/initiator_common.c | 69 ++++++++++++++++++++++++++++++++++++++++++++------ + 4 files changed, 91 insertions(+), 16 deletions(-) + +diff --git a/usr/discovery.c b/usr/discovery.c +index afce6c0..635ec8d 100644 +--- a/usr/discovery.c ++++ b/usr/discovery.c +@@ -1403,6 +1403,17 @@ redirect_reconnect: + iscsi_copy_operational_params(&session->conn[0], &config->session_conf, + &config->conn_conf); + ++ if (t->caps & CAP_TEXT_NEGO) { ++ log_debug(2, "%s discovery set params\n", __FUNCTION__); ++ rc = iscsi_session_set_params(conn); ++ if (rc) { ++ log_error("Could not set iscsi params for conn %d:%d " ++ "(err %d)\n", session->id, conn->id, rc); ++ rc = ISCSI_ERR_INTERNAL; ++ goto login_failed; ++ } ++ } ++ + if ((session->t->caps & CAP_LOGIN_OFFLOAD)) + goto start_conn; + +@@ -1509,8 +1520,8 @@ redirect_reconnect: + return 0; + + start_conn: +- log_debug(2, "%s discovery set params\n", __FUNCTION__); +- rc = iscsi_session_set_params(conn); ++ log_debug(2, "%s discovery set neg params\n", __FUNCTION__); ++ rc = iscsi_session_set_neg_params(conn); + if (rc) { + log_error("Could not set iscsi params for conn %d:%d (err " + "%d)\n", session->id, conn->id, rc); +diff --git a/usr/initiator.c b/usr/initiator.c +index 79d1779..05a5b19 100644 +--- a/usr/initiator.c ++++ b/usr/initiator.c +@@ -1048,12 +1048,7 @@ setup_full_feature_phase(iscsi_conn_t *conn) + + actor_delete(&conn->login_timer); + +- if (iscsi_session_set_params(conn)) { +- iscsi_login_eh(conn, c->qtask, ISCSI_ERR_LOGIN); +- return; +- } +- +- if (iscsi_host_set_params(session)) { ++ if (iscsi_session_set_neg_params(conn)) { + iscsi_login_eh(conn, c->qtask, ISCSI_ERR_LOGIN); + return; + } +@@ -1507,6 +1502,11 @@ static void setup_offload_login_phase(iscsi_conn_t *conn) + return; + } + ++ if (iscsi_session_set_neg_params(conn)) { ++ iscsi_login_eh(conn, c->qtask, ISCSI_ERR_LOGIN); ++ return; ++ } ++ + if (iscsi_host_set_params(session)) { + iscsi_login_eh(conn, c->qtask, ISCSI_ERR_LOGIN); + return; +@@ -1618,6 +1618,16 @@ static void session_conn_poll(void *data) + return; + } + ++ if (iscsi_session_set_params(conn)) { ++ iscsi_login_eh(conn, qtask, ISCSI_ERR_LOGIN); ++ return; ++ } ++ ++ if (iscsi_host_set_params(session)) { ++ iscsi_login_eh(conn, qtask, ISCSI_ERR_LOGIN); ++ return; ++ } ++ + if (iscsi_login_begin(session, c)) { + iscsi_login_eh(conn, qtask, ISCSI_ERR_LOGIN); + return; +diff --git a/usr/initiator.h b/usr/initiator.h +index 680640c..c34625b 100644 +--- a/usr/initiator.h ++++ b/usr/initiator.h +@@ -344,6 +344,7 @@ extern void free_initiator(void); + extern void iscsi_initiator_init(void); + + /* initiator code common to discovery and normal sessions */ ++extern int iscsi_session_set_neg_params(struct iscsi_conn *conn); + extern int iscsi_session_set_params(struct iscsi_conn *conn); + extern int iscsi_host_set_params(struct iscsi_session *session); + extern int iscsi_host_set_net_params(struct iface_rec *iface, +diff --git a/usr/initiator_common.c b/usr/initiator_common.c +index e2e87a1..109e8d7 100644 +--- a/usr/initiator_common.c ++++ b/usr/initiator_common.c +@@ -345,9 +345,9 @@ void iscsi_session_init_params(struct iscsi_session *session) + } + } + +-#define MAX_SESSION_PARAMS 35 ++#define MAX_SESSION_NEG_PARAMS 16 + +-int iscsi_session_set_params(struct iscsi_conn *conn) ++int iscsi_session_set_neg_params(struct iscsi_conn *conn) + { + struct iscsi_session *session = conn->session; + int i, rc; +@@ -357,7 +357,7 @@ int iscsi_session_set_params(struct iscsi_conn *conn) + int type; + void *value; + int conn_only; +- } conntbl[MAX_SESSION_PARAMS] = { ++ } conntbl[MAX_SESSION_NEG_PARAMS] = { + { + .param = ISCSI_PARAM_MAX_RECV_DLENGTH, + .value = &conn->max_recv_dlength, +@@ -434,15 +434,58 @@ int iscsi_session_set_params(struct iscsi_conn *conn) + .type = ISCSI_INT, + .conn_only = 1, + }, { +- .param = ISCSI_PARAM_TARGET_NAME, +- .conn_only = 0, +- .type = ISCSI_STRING, +- .value = session->target_name, +- }, { + .param = ISCSI_PARAM_TPGT, + .value = &session->portal_group_tag, + .type = ISCSI_INT, + .conn_only = 0, ++ }, ++ }; ++ ++ iscsi_session_init_params(session); ++ ++ /* Entered full-feature phase! */ ++ for (i = 0; i < MAX_SESSION_NEG_PARAMS; i++) { ++ if (conn->id != 0 && !conntbl[i].conn_only) ++ continue; ++ ++ if (!(session->param_mask & (1ULL << conntbl[i].param))) ++ continue; ++ ++ rc = ipc->set_param(session->t->handle, session->id, ++ conn->id, conntbl[i].param, conntbl[i].value, ++ conntbl[i].type); ++ if (rc && rc != -ENOSYS) { ++ log_error("can't set operational parameter %d for " ++ "connection %d:%d, retcode %d (%d)", ++ conntbl[i].param, session->id, conn->id, ++ rc, errno); ++ return EPERM; ++ } ++ ++ print_param_value(conntbl[i].param, conntbl[i].value, ++ conntbl[i].type); ++ } ++ ++ return 0; ++} ++ ++#define MAX_SESSION_PARAMS 20 ++ ++int iscsi_session_set_params(struct iscsi_conn *conn) ++{ ++ struct iscsi_session *session = conn->session; ++ int i, rc; ++ struct connparam { ++ int param; ++ int type; ++ void *value; ++ int conn_only; ++ } conntbl[MAX_SESSION_PARAMS] = { ++ { ++ .param = ISCSI_PARAM_TARGET_NAME, ++ .conn_only = 0, ++ .type = ISCSI_STRING, ++ .value = session->target_name, + }, { + .param = ISCSI_PARAM_PERSISTENT_ADDRESS, + .value = session->nrec.conn[conn->id].address, +@@ -512,22 +555,32 @@ int iscsi_session_set_params(struct iscsi_conn *conn) + .param = ISCSI_PARAM_IFACE_NAME, + .value = session->nrec.iface.name, + .type = ISCSI_STRING, ++ .conn_only = 0, + }, { + .param = ISCSI_PARAM_INITIATOR_NAME, + .value = session->initiator_name, + .type = ISCSI_STRING, ++ .conn_only = 0, + }, { + .param = ISCSI_PARAM_BOOT_ROOT, + .value = session->nrec.session.boot_root, + .type = ISCSI_STRING, ++ .conn_only = 0, + }, { + .param = ISCSI_PARAM_BOOT_NIC, + .value = session->nrec.session.boot_nic, + .type = ISCSI_STRING, ++ .conn_only = 0, + }, { + .param = ISCSI_PARAM_BOOT_TARGET, + .value = session->nrec.session.boot_target, + .type = ISCSI_STRING, ++ .conn_only = 0, ++ }, { ++ .param = ISCSI_PARAM_DISCOVERY_SESS, ++ .value = &session->type, ++ .type = ISCSI_INT, ++ .conn_only = 0, + }, + }; + +-- +1.8.3.1 + diff --git a/iscsi-initiator-utils.spec b/iscsi-initiator-utils.spec index 8f1f929..67ace22 100644 --- a/iscsi-initiator-utils.spec +++ b/iscsi-initiator-utils.spec @@ -80,6 +80,7 @@ Patch63: 0063-ISCSIUIO-Updated-the-configure-file-to-reflect-the-n.patch Patch64: 0064-ISCSIUIO-Removed-the-auto-generated-COPYING-file.patch Patch68: 0068-iscsiuio-fix-compilation.patch Patch69: 0069-Add-missing-DESTDIR.patch +Patch70: 0070-iscsi-tools-set-non-negotiated-params-early.patch # not (yet) upstream merged Patch143: 0143-idmb_rec_write-check-for-tpgt-first.patch @@ -199,6 +200,7 @@ developing applications that use %{name}. %patch64 -p1 %patch68 -p1 %patch69 -p1 +%patch70 -p1 # pending upstream merge %patch143 -p1 %patch145 -p1 @@ -378,6 +380,7 @@ fi - 948134 extend support to set additional parameters for network configuration - 1049710 update open-iscsi to support host statistics - 1043019 iscsiuio fix for arp cache flush issue +- 1059332 Fix broken discovery sessions over iser * Fri Jan 24 2014 Daniel Mach - 6.2.0.873-18 - Mass rebuild 2014-01-24