aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/target
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
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')
-rw-r--r--drivers/target/iscsi/iscsi_target.c6
-rw-r--r--drivers/target/iscsi/iscsi_target_login.c4
-rw-r--r--drivers/target/loopback/tcm_loop.c2
-rw-r--r--drivers/target/sbp/sbp_target.c2
-rw-r--r--drivers/target/target_core_transport.c8
-rw-r--r--drivers/target/tcm_fc/tfc_sess.c3
6 files changed, 18 insertions, 7 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);
diff --git a/drivers/target/loopback/tcm_loop.c b/drivers/target/loopback/tcm_loop.c
index bdc1ad82d293..c886ad1c39fb 100644
--- a/drivers/target/loopback/tcm_loop.c
+++ b/drivers/target/loopback/tcm_loop.c
@@ -1018,7 +1018,7 @@ static int tcm_loop_make_nexus(
1018 /* 1018 /*
1019 * Initialize the struct se_session pointer 1019 * Initialize the struct se_session pointer
1020 */ 1020 */
1021 tl_nexus->se_sess = transport_init_session(); 1021 tl_nexus->se_sess = transport_init_session(TARGET_PROT_ALL);
1022 if (IS_ERR(tl_nexus->se_sess)) { 1022 if (IS_ERR(tl_nexus->se_sess)) {
1023 ret = PTR_ERR(tl_nexus->se_sess); 1023 ret = PTR_ERR(tl_nexus->se_sess);
1024 goto out; 1024 goto out;
diff --git a/drivers/target/sbp/sbp_target.c b/drivers/target/sbp/sbp_target.c
index ad04ea928e4f..e7e93727553c 100644
--- a/drivers/target/sbp/sbp_target.c
+++ b/drivers/target/sbp/sbp_target.c
@@ -210,7 +210,7 @@ static struct sbp_session *sbp_session_create(
210 return ERR_PTR(-ENOMEM); 210 return ERR_PTR(-ENOMEM);
211 } 211 }
212 212
213 sess->se_sess = transport_init_session(); 213 sess->se_sess = transport_init_session(TARGET_PROT_NORMAL);
214 if (IS_ERR(sess->se_sess)) { 214 if (IS_ERR(sess->se_sess)) {
215 pr_err("failed to init se_session\n"); 215 pr_err("failed to init se_session\n");
216 216
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
index 9393544fb471..9c820ba5ae82 100644
--- a/drivers/target/target_core_transport.c
+++ b/drivers/target/target_core_transport.c
@@ -235,7 +235,7 @@ void transport_subsystem_check_init(void)
235 sub_api_initialized = 1; 235 sub_api_initialized = 1;
236} 236}
237 237
238struct se_session *transport_init_session(void) 238struct se_session *transport_init_session(enum target_prot_op sup_prot_ops)
239{ 239{
240 struct se_session *se_sess; 240 struct se_session *se_sess;
241 241
@@ -251,6 +251,7 @@ struct se_session *transport_init_session(void)
251 INIT_LIST_HEAD(&se_sess->sess_wait_list); 251 INIT_LIST_HEAD(&se_sess->sess_wait_list);
252 spin_lock_init(&se_sess->sess_cmd_lock); 252 spin_lock_init(&se_sess->sess_cmd_lock);
253 kref_init(&se_sess->sess_kref); 253 kref_init(&se_sess->sess_kref);
254 se_sess->sup_prot_ops = sup_prot_ops;
254 255
255 return se_sess; 256 return se_sess;
256} 257}
@@ -288,12 +289,13 @@ int transport_alloc_session_tags(struct se_session *se_sess,
288EXPORT_SYMBOL(transport_alloc_session_tags); 289EXPORT_SYMBOL(transport_alloc_session_tags);
289 290
290struct se_session *transport_init_session_tags(unsigned int tag_num, 291struct se_session *transport_init_session_tags(unsigned int tag_num,
291 unsigned int tag_size) 292 unsigned int tag_size,
293 enum target_prot_op sup_prot_ops)
292{ 294{
293 struct se_session *se_sess; 295 struct se_session *se_sess;
294 int rc; 296 int rc;
295 297
296 se_sess = transport_init_session(); 298 se_sess = transport_init_session(sup_prot_ops);
297 if (IS_ERR(se_sess)) 299 if (IS_ERR(se_sess))
298 return se_sess; 300 return se_sess;
299 301
diff --git a/drivers/target/tcm_fc/tfc_sess.c b/drivers/target/tcm_fc/tfc_sess.c
index ae52c08dad09..04751422178c 100644
--- a/drivers/target/tcm_fc/tfc_sess.c
+++ b/drivers/target/tcm_fc/tfc_sess.c
@@ -211,7 +211,8 @@ static struct ft_sess *ft_sess_create(struct ft_tport *tport, u32 port_id,
211 return NULL; 211 return NULL;
212 212
213 sess->se_sess = transport_init_session_tags(TCM_FC_DEFAULT_TAGS, 213 sess->se_sess = transport_init_session_tags(TCM_FC_DEFAULT_TAGS,
214 sizeof(struct ft_cmd)); 214 sizeof(struct ft_cmd),
215 TARGET_PROT_NORMAL);
215 if (IS_ERR(sess->se_sess)) { 216 if (IS_ERR(sess->se_sess)) {
216 kfree(sess); 217 kfree(sess);
217 return NULL; 218 return NULL;