From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Nicholas A. Bellinger" Subject: [PATCH 3/3] iser-target: Handle special case for logout during connection failure Date: Sat, 21 Mar 2015 06:16:04 +0000 Message-ID: <1426918564-22581-4-git-send-email-nab@daterainc.com> References: <1426918564-22581-1-git-send-email-nab@daterainc.com> Return-path: In-Reply-To: <1426918564-22581-1-git-send-email-nab@daterainc.com> Sender: target-devel-owner@vger.kernel.org To: target-devel Cc: linux-scsi , Sagi Grimberg , Slava Shwartsman , Nicholas Bellinger List-Id: linux-scsi@vger.kernel.org From: Nicholas Bellinger This patch adds special case handling during ISCSI_OP_LOGIN_RSP ib_wr failure, where isert_cq_comp_err() is responsible for calling the remaining isert_response_completion() -> isert_do_control_comp() -> iscsit_logout_post_handler() to drop the last iscsi_conn reference. It fixes a bug where iscsit_logout_post_handler() would not be called if the outgoing ISCSI_OP_LOGIN_RSP failed during iscsi_conn ib_wr descriptor cleanup. Reported-by: Sagi Grimberg Reported-by: Slava Shwartsman Signed-off-by: Nicholas Bellinger --- drivers/infiniband/ulp/isert/ib_isert.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c index 075b19c..ff0d436 100644 --- a/drivers/infiniband/ulp/isert/ib_isert.c +++ b/drivers/infiniband/ulp/isert/ib_isert.c @@ -1996,10 +1996,20 @@ isert_cq_comp_err(struct isert_conn *isert_conn, struct ib_wc *wc) desc = (struct iser_tx_desc *)(uintptr_t)wc->wr_id; isert_cmd = desc->isert_cmd; - if (!isert_cmd) + if (!isert_cmd) { isert_unmap_tx_desc(desc, ib_dev); - else - isert_completion_put(desc, isert_cmd, ib_dev, true); + } else { + struct isert_device *device = isert_conn->conn_device; + struct iscsi_conn *conn = isert_conn->conn; + struct iscsi_cmd *cmd = isert_cmd->iscsi_cmd; + + if (cmd->i_state == ISTATE_SEND_LOGOUTRSP && + conn->conn_state == TARG_CONN_STATE_IN_LOGOUT) + isert_response_completion(desc, isert_cmd, isert_conn, + device->ib_device); + else + isert_completion_put(desc, isert_cmd, ib_dev, true); + } } else { isert_conn->post_recv_buf_count--; if (!isert_conn->post_recv_buf_count) -- 1.9.1