iser-target: Updates for login negotiation multi-plexing support
authorNicholas Bellinger <nab@linux-iscsi.org>
Sun, 18 Aug 2013 23:35:46 +0000 (16:35 -0700)
committerNicholas Bellinger <nab@linux-iscsi.org>
Mon, 9 Sep 2013 21:27:21 +0000 (14:27 -0700)
This patch updates iser-target code to support login negotiation
multi-plexing.  This includes only using isert_conn->conn_login_comp
for the first login request PDU, pushing the subsequent processing
to iscsi_conn->login_work -> iscsi_target_do_login_rx(), and turning
isert_get_login_rx() into a NOP.

v3 changes:
   - Drop unnecessary LOGIN_FLAGS_READ_ACTIVE bit set in
     isert_rx_login_req()

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

index 3f62041..c42748b 100644 (file)
@@ -869,7 +869,11 @@ isert_rx_login_req(struct iser_rx_desc *rx_desc, int rx_buflen,
                 size, rx_buflen, MAX_KEY_VALUE_PAIRS);
        memcpy(login->req_buf, &rx_desc->data[0], size);
 
-       complete(&isert_conn->conn_login_comp);
+       if (login->first_request) {
+               complete(&isert_conn->conn_login_comp);
+               return;
+       }
+       schedule_delayed_work(&conn->login_work, 0);
 }
 
 static void
@@ -2224,6 +2228,14 @@ isert_get_login_rx(struct iscsi_conn *conn, struct iscsi_login *login)
        int ret;
 
        pr_debug("isert_get_login_rx before conn_login_comp conn: %p\n", conn);
+       /*
+        * For login requests after the first PDU, isert_rx_login_req() will
+        * kick schedule_delayed_work(&conn->login_work) as the packet is
+        * received, which turns this callback from iscsi_target_do_login_rx()
+        * into a NOP.
+        */
+       if (!login->first_request)
+               return 0;
 
        ret = wait_for_completion_interruptible(&isert_conn->conn_login_comp);
        if (ret)