Commit 991bb764 authored by Sagi Grimberg's avatar Sagi Grimberg Committed by Nicholas Bellinger

iser-target: Fix logout sequence

We don't want to wait for conn_logout_comp from isert_comp_wq
context as this blocks further completions from being processed.
Instead we wait for it conditionally (if logout response was
actually posted) in wait_conn. This wait should normally happen
immediately as it occurs after we consumed all the completions
(including flush errors) and conn_logout_comp should have been
completed.
Signed-off-by: default avatarSagi Grimberg <sagig@mellanox.com>
Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
parent c7e160ee
...@@ -1426,10 +1426,6 @@ isert_rx_opcode(struct isert_conn *isert_conn, struct iser_rx_desc *rx_desc, ...@@ -1426,10 +1426,6 @@ isert_rx_opcode(struct isert_conn *isert_conn, struct iser_rx_desc *rx_desc,
break; break;
ret = iscsit_handle_logout_cmd(conn, cmd, (unsigned char *)hdr); ret = iscsit_handle_logout_cmd(conn, cmd, (unsigned char *)hdr);
if (ret > 0)
wait_for_completion_timeout(&conn->conn_logout_comp,
SECONDS_FOR_LOGOUT_COMP *
HZ);
break; break;
case ISCSI_OP_TEXT: case ISCSI_OP_TEXT:
cmd = isert_allocate_cmd(conn); cmd = isert_allocate_cmd(conn);
...@@ -2922,15 +2918,14 @@ isert_immediate_queue(struct iscsi_conn *conn, struct iscsi_cmd *cmd, int state) ...@@ -2922,15 +2918,14 @@ isert_immediate_queue(struct iscsi_conn *conn, struct iscsi_cmd *cmd, int state)
static int static int
isert_response_queue(struct iscsi_conn *conn, struct iscsi_cmd *cmd, int state) isert_response_queue(struct iscsi_conn *conn, struct iscsi_cmd *cmd, int state)
{ {
struct isert_conn *isert_conn = conn->context;
int ret; int ret;
switch (state) { switch (state) {
case ISTATE_SEND_LOGOUTRSP: case ISTATE_SEND_LOGOUTRSP:
ret = isert_put_logout_rsp(cmd, conn); ret = isert_put_logout_rsp(cmd, conn);
if (!ret) { if (!ret)
pr_debug("Returning iSER Logout -EAGAIN\n"); isert_conn->logout_posted = true;
ret = -EAGAIN;
}
break; break;
case ISTATE_SEND_NOPIN: case ISTATE_SEND_NOPIN:
ret = isert_put_nopin(cmd, conn, true); ret = isert_put_nopin(cmd, conn, true);
...@@ -3235,6 +3230,18 @@ static void isert_release_work(struct work_struct *work) ...@@ -3235,6 +3230,18 @@ static void isert_release_work(struct work_struct *work)
isert_put_conn(isert_conn); isert_put_conn(isert_conn);
} }
static void
isert_wait4logout(struct isert_conn *isert_conn)
{
struct iscsi_conn *conn = isert_conn->conn;
if (isert_conn->logout_posted) {
pr_info("conn %p wait for conn_logout_comp\n", isert_conn);
wait_for_completion_timeout(&conn->conn_logout_comp,
SECONDS_FOR_LOGOUT_COMP * HZ);
}
}
static void static void
isert_wait4cmds(struct iscsi_conn *conn) isert_wait4cmds(struct iscsi_conn *conn)
{ {
...@@ -3280,6 +3287,7 @@ static void isert_wait_conn(struct iscsi_conn *conn) ...@@ -3280,6 +3287,7 @@ static void isert_wait_conn(struct iscsi_conn *conn)
isert_wait4cmds(conn); isert_wait4cmds(conn);
isert_wait4flush(isert_conn); isert_wait4flush(isert_conn);
isert_wait4logout(isert_conn);
INIT_WORK(&isert_conn->release_work, isert_release_work); INIT_WORK(&isert_conn->release_work, isert_release_work);
queue_work(isert_release_wq, &isert_conn->release_work); queue_work(isert_release_wq, &isert_conn->release_work);
......
...@@ -156,6 +156,7 @@ struct isert_conn { ...@@ -156,6 +156,7 @@ struct isert_conn {
spinlock_t conn_lock; spinlock_t conn_lock;
struct work_struct release_work; struct work_struct release_work;
struct ib_recv_wr beacon; struct ib_recv_wr beacon;
bool logout_posted;
}; };
#define ISERT_MAX_CQ 64 #define ISERT_MAX_CQ 64
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment