From: Nicholas Bellinger <n...@linux-iscsi.org>

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 <sa...@mellanox.com>
Reported-by: Slava Shwartsman <valyush...@gmail.com>
Signed-off-by: Nicholas Bellinger <n...@linux-iscsi.org>
---
 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

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to