iscsi,iser-target: Expose supported protection ops according to t10_pi
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>
This commit is contained in:
parent
302cc7c3ca
commit
23a548ee65
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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");
|
||||
|
|
Loading…
Reference in New Issue