iser-target: Don't wait for session commands from completion context
authorSagi Grimberg <sagig@mellanox.com>
Tue, 2 Dec 2014 14:57:46 +0000 (16:57 +0200)
committerNicholas Bellinger <nab@linux-iscsi.org>
Sat, 13 Dec 2014 07:32:32 +0000 (23:32 -0800)
Might result in a deadlock where completion context waits for
session commands release where the later might need a final
completion for it.

Signed-off-by: Sagi Grimberg <sagig@mellanox.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
drivers/infiniband/ulp/isert/ib_isert.c

index 276054b65b988d397c21a0c1e71a57fda2efb5b9..fc4641e5fd1e702102238dd85418bff1dab2ebe8 100644 (file)
@@ -1984,13 +1984,6 @@ static void
 isert_cq_comp_err(struct isert_conn *isert_conn, struct ib_wc *wc)
 {
        if (wc->wr_id == ISER_BEACON_WRID) {
-               struct iscsi_conn *conn = isert_conn->conn;
-
-               if (conn->sess) {
-                       target_sess_cmd_list_set_waiting(conn->sess->se_sess);
-                       target_wait_for_sess_cmds(conn->sess->se_sess);
-               }
-
                pr_info("conn %p completing conn_wait_comp_err\n",
                           isert_conn);
                complete(&isert_conn->conn_wait_comp_err);
@@ -3242,6 +3235,15 @@ static void isert_release_work(struct work_struct *work)
        isert_put_conn(isert_conn);
 }
 
+static void
+isert_wait4cmds(struct iscsi_conn *conn)
+{
+       if (conn->sess) {
+               target_sess_cmd_list_set_waiting(conn->sess->se_sess);
+               target_wait_for_sess_cmds(conn->sess->se_sess);
+       }
+}
+
 static void
 isert_wait4flush(struct isert_conn *isert_conn)
 {
@@ -3276,6 +3278,7 @@ static void isert_wait_conn(struct iscsi_conn *conn)
        isert_conn_terminate(isert_conn);
        mutex_unlock(&isert_conn->conn_mutex);
 
+       isert_wait4cmds(conn);
        isert_wait4flush(isert_conn);
 
        INIT_WORK(&isert_conn->release_work, isert_release_work);