Target/iscsi: Fix sendtargets response pdu for iser transport
authorSagi Grimberg <sagig@mellanox.com>
Tue, 10 Jun 2014 15:27:59 +0000 (18:27 +0300)
committerNicholas Bellinger <nab@linux-iscsi.org>
Wed, 11 Jun 2014 18:52:39 +0000 (11:52 -0700)
In case the transport is iser we should not include the
iscsi target info in the sendtargets text response pdu.
This causes sendtargets response to include the target
info twice.

Modify iscsit_build_sendtargets_response to filter
transport types that don't match.

Signed-off-by: Sagi Grimberg <sagig@mellanox.com>
Reported-by: Slava Shwartsman <valyushash@gmail.com>
Cc: stable@vger.kernel.org # 3.11+
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
drivers/infiniband/ulp/isert/ib_isert.c
drivers/target/iscsi/iscsi_target.c
include/target/iscsi/iscsi_transport.h

index 647a5e2beee43acecbb4cdc4199a03f7c976107e..ba619fa846626e6b2227585b09b362186c0fc84a 100644 (file)
@@ -2318,7 +2318,7 @@ isert_put_text_rsp(struct iscsi_cmd *cmd, struct iscsi_conn *conn)
        int rc;
 
        isert_create_send_desc(isert_conn, isert_cmd, &isert_cmd->tx_desc);
-       rc = iscsit_build_text_rsp(cmd, conn, hdr);
+       rc = iscsit_build_text_rsp(cmd, conn, hdr, ISCSI_INFINIBAND);
        if (rc < 0)
                return rc;
 
index e0d98344e4bd66ce5194166e0835d6b7f05d8e98..b87721a01b7464a17ca44f9212489cd6e46dc8ac 100644 (file)
@@ -3389,7 +3389,9 @@ static bool iscsit_check_inaddr_any(struct iscsi_np *np)
 
 #define SENDTARGETS_BUF_LIMIT 32768U
 
-static int iscsit_build_sendtargets_response(struct iscsi_cmd *cmd)
+static int
+iscsit_build_sendtargets_response(struct iscsi_cmd *cmd,
+                                 enum iscsit_transport_type network_transport)
 {
        char *payload = NULL;
        struct iscsi_conn *conn = cmd->conn;
@@ -3466,6 +3468,9 @@ static int iscsit_build_sendtargets_response(struct iscsi_cmd *cmd)
                                struct iscsi_np *np = tpg_np->tpg_np;
                                bool inaddr_any = iscsit_check_inaddr_any(np);
 
+                               if (np->np_network_transport != network_transport)
+                                       continue;
+
                                if (!target_name_printed) {
                                        len = sprintf(buf, "TargetName=%s",
                                                      tiqn->tiqn);
@@ -3517,11 +3522,12 @@ eob:
 
 int
 iscsit_build_text_rsp(struct iscsi_cmd *cmd, struct iscsi_conn *conn,
-                     struct iscsi_text_rsp *hdr)
+                     struct iscsi_text_rsp *hdr,
+                     enum iscsit_transport_type network_transport)
 {
        int text_length, padding;
 
-       text_length = iscsit_build_sendtargets_response(cmd);
+       text_length = iscsit_build_sendtargets_response(cmd, network_transport);
        if (text_length < 0)
                return text_length;
 
@@ -3559,7 +3565,7 @@ static int iscsit_send_text_rsp(
        u32 tx_size = 0;
        int text_length, iov_count = 0, rc;
 
-       rc = iscsit_build_text_rsp(cmd, conn, hdr);
+       rc = iscsit_build_text_rsp(cmd, conn, hdr, ISCSI_TCP);
        if (rc < 0)
                return rc;
 
index 33b487b5da92dc76f549df5d09a3852518c14159..daef9daa500c11f0ff7d92151fafbf9080a80e02 100644 (file)
@@ -70,7 +70,8 @@ extern void iscsit_build_nopin_rsp(struct iscsi_cmd *, struct iscsi_conn *,
 extern void iscsit_build_task_mgt_rsp(struct iscsi_cmd *, struct iscsi_conn *,
                                struct iscsi_tm_rsp *);
 extern int iscsit_build_text_rsp(struct iscsi_cmd *, struct iscsi_conn *,
-                               struct iscsi_text_rsp *);
+                               struct iscsi_text_rsp *,
+                               enum iscsit_transport_type);
 extern void iscsit_build_reject(struct iscsi_cmd *, struct iscsi_conn *,
                                struct iscsi_reject *);
 extern int iscsit_build_logout_rsp(struct iscsi_cmd *, struct iscsi_conn *,