| From 23a548ee656c8ba6da8cb2412070edcd62e2ac5d Mon Sep 17 00:00:00 2001 |
| From: Sagi Grimberg <sagig@mellanox.com> |
| Date: Tue, 2 Dec 2014 16:57:35 +0200 |
| Subject: iscsi,iser-target: Expose supported protection ops according to t10_pi |
| |
| From: Sagi Grimberg <sagig@mellanox.com> |
| |
| commit 23a548ee656c8ba6da8cb2412070edcd62e2ac5d upstream. |
| |
| 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> |
| Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/infiniband/ulp/isert/ib_isert.c | 14 +++++++++++--- |
| drivers/infiniband/ulp/isert/ib_isert.h | 1 + |
| drivers/target/iscsi/iscsi_target_login.c | 7 ++++--- |
| 3 files changed, 16 insertions(+), 6 deletions(-) |
| |
| --- a/drivers/infiniband/ulp/isert/ib_isert.c |
| +++ b/drivers/infiniband/ulp/isert/ib_isert.c |
| @@ -64,7 +64,7 @@ struct rdma_cm_id *isert_setup_id(struct |
| 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 |
| 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; |
| } |
| --- a/drivers/infiniband/ulp/isert/ib_isert.h |
| +++ b/drivers/infiniband/ulp/isert/ib_isert.h |
| @@ -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; |
| --- a/drivers/target/iscsi/iscsi_target_login.c |
| +++ b/drivers/target/iscsi/iscsi_target_login.c |
| @@ -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(s |
| } |
| 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"); |