Commit 23a548ee authored by Sagi Grimberg's avatar Sagi Grimberg Committed by Nicholas Bellinger
Browse files

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: default avatarSagi Grimberg <sagig@mellanox.com>
Cc: <stable@vger.kernel.org> # v3.14+
Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
parent 302cc7c3
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -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)
	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;
}
+1 −0
Original line number Diff line number Diff line
@@ -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;
+4 −3
Original line number Diff line number Diff line
@@ -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");