commit 7d121d12ad6ba7783308c25ffd338a9fa0cc402b Author: Lee Duncan Date: Tue Sep 25 09:48:53 2018 -0700 Create a new error for "target not connected". The session_logout_qtask() function now recognizes a new state of "target likely not connected" if syncing up, in connection wait state, and re-opening the connection. --- include/iscsi_err.h | 2 ++ usr/initiator.c | 16 +++++++++++++++- usr/iscsi_err.c | 1 + 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/include/iscsi_err.h b/include/iscsi_err.h index 506bd8c9bd27..ed000dd00baf 100644 --- a/include/iscsi_err.h +++ b/include/iscsi_err.h @@ -68,6 +68,8 @@ enum { ISCSI_ERR_UNKNOWN_DISCOVERY_TYPE = 30, /* child process terminated */ ISCSI_ERR_CHILD_TERMINATED = 31, + /* session likely not connected */ + ISCSI_ERR_SESSION_NOT_CONNECTED = 32, /* Always last. Indicates end of error code space */ ISCSI_MAX_ERR_VAL, diff --git a/usr/initiator.c b/usr/initiator.c index a86d1e6dee90..935056a3abde 100644 --- a/usr/initiator.c +++ b/usr/initiator.c @@ -2056,8 +2056,22 @@ int session_logout_task(int sid, queue_task_t *qtask) return ISCSI_ERR_SESS_NOT_FOUND; } conn = &session->conn[0]; + /* - * If syncing up or if this is the initial login and mgmt_ipc + * If syncing up, in XPT_WAIT, and REOPENing, then return + * an informative error, since the target for this session + * is likely not connected + */ + if (session->notify_qtask && + (conn->state == ISCSI_CONN_STATE_XPT_WAIT) && + (session->r_stage == R_STAGE_SESSION_REOPEN)) { + log_warning("session cannot be terminted because it's trying to reconnect: try again later"); + return ISCSI_ERR_SESSION_NOT_CONNECTED; + } + + /* + * If syncing up and not reconnecting, + * or if this is the initial login and mgmt_ipc * has not been notified of that result fail the logout request */ if (session->notify_qtask || diff --git a/usr/iscsi_err.c b/usr/iscsi_err.c index 1ba9e648d7c1..23c61fc3574e 100644 --- a/usr/iscsi_err.c +++ b/usr/iscsi_err.c @@ -54,6 +54,7 @@ static char *iscsi_err_msgs[] = { /* 29 */ "operation failed but retry may succeed", /* 30 */ "unknown discovery type", /* 31 */ "child process terminated", + /* 32 */ "target likely not connected", }; char *iscsi_err_to_str(int err)