aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/target/iscsi
diff options
context:
space:
mode:
authorNicholas Bellinger <nab@linux-iscsi.org>2014-04-02 15:52:38 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2014-04-07 04:48:54 -0400
commite70beee783d6977d80eede88a3394f02eabddad1 (patch)
tree225d10e36bf031e9c4eab3de537699b60bb48f1b /drivers/target/iscsi
parentd84287bcfe624697cd4f3c1df746beb53b86d9c4 (diff)
target: Pass in transport supported PI at session initialization
In order to support local WRITE_INSERT + READ_STRIP operations for non PI enabled fabrics, the fabric driver needs to be able signal what protection offload operations are supported. This is done at session initialization time so the modes can be signaled by individual se_wwn + se_portal_group endpoints, as well as optionally across different transports on the same endpoint. For iser-target, set TARGET_PROT_ALL if the underlying ib_device has already signaled PI offload support, and allow this to be exposed via a new iscsit_transport->iscsit_get_sup_prot_ops() callback. For loopback, set TARGET_PROT_ALL to signal SCSI initiator mode operation. For all other drivers, set TARGET_PROT_NORMAL to disable fabric level PI. Cc: Martin K. Petersen <martin.petersen@oracle.com> Cc: Sagi Grimberg <sagig@mellanox.com> Cc: Or Gerlitz <ogerlitz@mellanox.com> Cc: Quinn Tran <quinn.tran@qlogic.com> Cc: Giridhar Malavali <giridhar.malavali@qlogic.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target/iscsi')
-rw-r--r--drivers/target/iscsi/iscsi_target.c6
-rw-r--r--drivers/target/iscsi/iscsi_target_login.c4
2 files changed, 9 insertions, 1 deletions
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c
index 96aee439c9fd..78cab13bbb1b 100644
--- a/drivers/target/iscsi/iscsi_target.c
+++ b/drivers/target/iscsi/iscsi_target.c
@@ -511,6 +511,11 @@ static void iscsit_aborted_task(struct iscsi_conn *conn, struct iscsi_cmd *cmd)
511 __iscsit_free_cmd(cmd, scsi_cmd, true); 511 __iscsit_free_cmd(cmd, scsi_cmd, true);
512} 512}
513 513
514static enum target_prot_op iscsit_get_sup_prot_ops(struct iscsi_conn *conn)
515{
516 return TARGET_PROT_NORMAL;
517}
518
514static struct iscsit_transport iscsi_target_transport = { 519static struct iscsit_transport iscsi_target_transport = {
515 .name = "iSCSI/TCP", 520 .name = "iSCSI/TCP",
516 .transport_type = ISCSI_TCP, 521 .transport_type = ISCSI_TCP,
@@ -526,6 +531,7 @@ static struct iscsit_transport iscsi_target_transport = {
526 .iscsit_queue_data_in = iscsit_queue_rsp, 531 .iscsit_queue_data_in = iscsit_queue_rsp,
527 .iscsit_queue_status = iscsit_queue_rsp, 532 .iscsit_queue_status = iscsit_queue_rsp,
528 .iscsit_aborted_task = iscsit_aborted_task, 533 .iscsit_aborted_task = iscsit_aborted_task,
534 .iscsit_get_sup_prot_ops = iscsit_get_sup_prot_ops,
529}; 535};
530 536
531static int __init iscsi_target_init_module(void) 537static int __init iscsi_target_init_module(void)
diff --git a/drivers/target/iscsi/iscsi_target_login.c b/drivers/target/iscsi/iscsi_target_login.c
index e29279e6b577..8739b98f6f93 100644
--- a/drivers/target/iscsi/iscsi_target_login.c
+++ b/drivers/target/iscsi/iscsi_target_login.c
@@ -259,6 +259,7 @@ static int iscsi_login_zero_tsih_s1(
259{ 259{
260 struct iscsi_session *sess = NULL; 260 struct iscsi_session *sess = NULL;
261 struct iscsi_login_req *pdu = (struct iscsi_login_req *)buf; 261 struct iscsi_login_req *pdu = (struct iscsi_login_req *)buf;
262 enum target_prot_op sup_pro_ops;
262 int ret; 263 int ret;
263 264
264 sess = kzalloc(sizeof(struct iscsi_session), GFP_KERNEL); 265 sess = kzalloc(sizeof(struct iscsi_session), GFP_KERNEL);
@@ -320,8 +321,9 @@ static int iscsi_login_zero_tsih_s1(
320 kfree(sess); 321 kfree(sess);
321 return -ENOMEM; 322 return -ENOMEM;
322 } 323 }
324 sup_pro_ops = conn->conn_transport->iscsit_get_sup_prot_ops(conn);
323 325
324 sess->se_sess = transport_init_session(); 326 sess->se_sess = transport_init_session(sup_pro_ops);
325 if (IS_ERR(sess->se_sess)) { 327 if (IS_ERR(sess->se_sess)) {
326 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR, 328 iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
327 ISCSI_LOGIN_STATUS_NO_RESOURCES); 329 ISCSI_LOGIN_STATUS_NO_RESOURCES);