iscsi,iser-target: Expose supported protection ops according to t10_pi
authorSagi Grimberg <sagig@mellanox.com>
Tue, 2 Dec 2014 14:57:35 +0000 (16:57 +0200)
committerNicholas Bellinger <nab@linux-iscsi.org>
Sat, 13 Dec 2014 07:32:26 +0000 (23:32 -0800)
iSER will report supported protection operations based on
the tpg attribute t10_pi settings and HCA PI offload capabilities.
If the HCA does not support PI offload or tpg attribute t10_pi is
not set, we fall to SW PI mode.

In order to do that, we move iscsit_get_sup_prot_ops after connection
tpg assignment.

Signed-off-by: Sagi Grimberg <sagig@mellanox.com>
Cc: <stable@vger.kernel.org> # v3.14+
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
drivers/infiniband/ulp/isert/ib_isert.c
drivers/infiniband/ulp/isert/ib_isert.h
drivers/target/iscsi/iscsi_target_login.c

index 618c81576b056a96d4cf474f909429a90187ee76..a6daabc70425dac11b0d422c815771fa6b2494c9 100644 (file)
@@ -64,7 +64,7 @@ struct rdma_cm_id *isert_setup_id(struct isert_np *isert_np);
 static inline bool
 isert_prot_cmd(struct isert_conn *conn, struct se_cmd *cmd)
 {
-       return (conn->conn_device->pi_capable &&
+       return (conn->pi_support &&
                cmd->prot_op != TARGET_PROT_NORMAL);
 }
 
@@ -2324,8 +2324,16 @@ isert_get_sup_prot_ops(struct iscsi_conn *conn)
        struct isert_conn *isert_conn = (struct isert_conn *)conn->context;
        struct isert_device *device = isert_conn->conn_device;
 
-       if (device->pi_capable)
-               return TARGET_PROT_ALL;
+       if (conn->tpg->tpg_attrib.t10_pi) {
+               if (device->pi_capable) {
+                       pr_info("conn %p PI offload enabled\n", isert_conn);
+                       isert_conn->pi_support = true;
+                       return TARGET_PROT_ALL;
+               }
+       }
+
+       pr_info("conn %p PI offload disabled\n", isert_conn);
+       isert_conn->pi_support = false;
 
        return TARGET_PROT_NORMAL;
 }
index 2e7868c5ad14f3aee06c64da0ab8952697256632..141905f446ddd8a6049ff64c916aff530d97c158 100644 (file)
@@ -128,6 +128,7 @@ struct isert_conn {
        atomic_t                post_send_buf_count;
        u32                     responder_resources;
        u32                     initiator_depth;
+       bool                    pi_support;
        u32                     max_sge;
        char                    *login_buf;
        char                    *login_req_buf;
index 05ad5c7128f291bc286b74d0413d5d802ee25614..18e2601527dfb028687482f3d900aeef69ded94f 100644 (file)
@@ -281,7 +281,6 @@ static int iscsi_login_zero_tsih_s1(
 {
        struct iscsi_session *sess = NULL;
        struct iscsi_login_req *pdu = (struct iscsi_login_req *)buf;
-       enum target_prot_op sup_pro_ops;
        int ret;
 
        sess = kzalloc(sizeof(struct iscsi_session), GFP_KERNEL);
@@ -343,9 +342,8 @@ static int iscsi_login_zero_tsih_s1(
                kfree(sess);
                return -ENOMEM;
        }
-       sup_pro_ops = conn->conn_transport->iscsit_get_sup_prot_ops(conn);
 
-       sess->se_sess = transport_init_session(sup_pro_ops);
+       sess->se_sess = transport_init_session(TARGET_PROT_NORMAL);
        if (IS_ERR(sess->se_sess)) {
                iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
                                ISCSI_LOGIN_STATUS_NO_RESOURCES);
@@ -1367,6 +1365,9 @@ static int __iscsi_target_login_thread(struct iscsi_np *np)
        }
        login->zero_tsih = zero_tsih;
 
+       conn->sess->se_sess->sup_prot_ops =
+               conn->conn_transport->iscsit_get_sup_prot_ops(conn);
+
        tpg = conn->tpg;
        if (!tpg) {
                pr_err("Unable to locate struct iscsi_conn->tpg\n");