aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/target/iscsi/iscsi_target_core.h1
-rw-r--r--drivers/target/iscsi/iscsi_target_tmr.c43
-rw-r--r--include/target/target_core_base.h3
3 files changed, 21 insertions, 26 deletions
diff --git a/drivers/target/iscsi/iscsi_target_core.h b/drivers/target/iscsi/iscsi_target_core.h
index 1c70144cdaf1..63a8ed26f119 100644
--- a/drivers/target/iscsi/iscsi_target_core.h
+++ b/drivers/target/iscsi/iscsi_target_core.h
@@ -481,6 +481,7 @@ struct iscsi_tmr_req {
481 bool task_reassign:1; 481 bool task_reassign:1;
482 u32 ref_cmd_sn; 482 u32 ref_cmd_sn;
483 u32 exp_data_sn; 483 u32 exp_data_sn;
484 struct iscsi_cmd *ref_cmd;
484 struct iscsi_conn_recovery *conn_recovery; 485 struct iscsi_conn_recovery *conn_recovery;
485 struct se_tmr_req *se_tmr_req; 486 struct se_tmr_req *se_tmr_req;
486}; 487};
diff --git a/drivers/target/iscsi/iscsi_target_tmr.c b/drivers/target/iscsi/iscsi_target_tmr.c
index f4e640b51fd1..1f7552986168 100644
--- a/drivers/target/iscsi/iscsi_target_tmr.c
+++ b/drivers/target/iscsi/iscsi_target_tmr.c
@@ -19,6 +19,7 @@
19 ******************************************************************************/ 19 ******************************************************************************/
20 20
21#include <asm/unaligned.h> 21#include <asm/unaligned.h>
22#include <scsi/scsi_device.h>
22#include <scsi/iscsi_proto.h> 23#include <scsi/iscsi_proto.h>
23#include <target/target_core_base.h> 24#include <target/target_core_base.h>
24#include <target/target_core_fabric.h> 25#include <target/target_core_fabric.h>
@@ -61,7 +62,7 @@ u8 iscsit_tmr_abort_task(
61 } 62 }
62 63
63 se_tmr->ref_task_tag = hdr->rtt; 64 se_tmr->ref_task_tag = hdr->rtt;
64 se_tmr->ref_cmd = &ref_cmd->se_cmd; 65 tmr_req->ref_cmd = ref_cmd;
65 tmr_req->ref_cmd_sn = hdr->refcmdsn; 66 tmr_req->ref_cmd_sn = hdr->refcmdsn;
66 tmr_req->exp_data_sn = hdr->exp_datasn; 67 tmr_req->exp_data_sn = hdr->exp_datasn;
67 68
@@ -121,7 +122,7 @@ u8 iscsit_tmr_task_reassign(
121 struct iscsi_tmr_req *tmr_req = cmd->tmr_req; 122 struct iscsi_tmr_req *tmr_req = cmd->tmr_req;
122 struct se_tmr_req *se_tmr = cmd->se_cmd.se_tmr_req; 123 struct se_tmr_req *se_tmr = cmd->se_cmd.se_tmr_req;
123 struct iscsi_tm *hdr = (struct iscsi_tm *) buf; 124 struct iscsi_tm *hdr = (struct iscsi_tm *) buf;
124 int ret; 125 int ret, ref_lun;
125 126
126 pr_debug("Got TASK_REASSIGN TMR ITT: 0x%08x," 127 pr_debug("Got TASK_REASSIGN TMR ITT: 0x%08x,"
127 " RefTaskTag: 0x%08x, ExpDataSN: 0x%08x, CID: %hu\n", 128 " RefTaskTag: 0x%08x, ExpDataSN: 0x%08x, CID: %hu\n",
@@ -155,9 +156,16 @@ u8 iscsit_tmr_task_reassign(
155 return ISCSI_TMF_RSP_REJECTED; 156 return ISCSI_TMF_RSP_REJECTED;
156 } 157 }
157 158
159 ref_lun = scsilun_to_int(&hdr->lun);
160 if (ref_lun != ref_cmd->se_cmd.orig_fe_lun) {
161 pr_err("Unable to perform connection recovery for"
162 " differing ref_lun: %d ref_cmd orig_fe_lun: %u\n",
163 ref_lun, ref_cmd->se_cmd.orig_fe_lun);
164 return ISCSI_TMF_RSP_REJECTED;
165 }
166
158 se_tmr->ref_task_tag = hdr->rtt; 167 se_tmr->ref_task_tag = hdr->rtt;
159 se_tmr->ref_cmd = &ref_cmd->se_cmd; 168 tmr_req->ref_cmd = ref_cmd;
160 se_tmr->ref_task_lun = get_unaligned_le64(&hdr->lun);
161 tmr_req->ref_cmd_sn = hdr->refcmdsn; 169 tmr_req->ref_cmd_sn = hdr->refcmdsn;
162 tmr_req->exp_data_sn = hdr->exp_datasn; 170 tmr_req->exp_data_sn = hdr->exp_datasn;
163 tmr_req->conn_recovery = cr; 171 tmr_req->conn_recovery = cr;
@@ -191,9 +199,7 @@ static int iscsit_task_reassign_complete_nop_out(
191 struct iscsi_tmr_req *tmr_req, 199 struct iscsi_tmr_req *tmr_req,
192 struct iscsi_conn *conn) 200 struct iscsi_conn *conn)
193{ 201{
194 struct se_tmr_req *se_tmr = tmr_req->se_tmr_req; 202 struct iscsi_cmd *cmd = tmr_req->ref_cmd;
195 struct se_cmd *se_cmd = se_tmr->ref_cmd;
196 struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);
197 struct iscsi_conn_recovery *cr; 203 struct iscsi_conn_recovery *cr;
198 204
199 if (!cmd->cr) { 205 if (!cmd->cr) {
@@ -360,9 +366,7 @@ static int iscsit_task_reassign_complete_scsi_cmnd(
360 struct iscsi_tmr_req *tmr_req, 366 struct iscsi_tmr_req *tmr_req,
361 struct iscsi_conn *conn) 367 struct iscsi_conn *conn)
362{ 368{
363 struct se_tmr_req *se_tmr = tmr_req->se_tmr_req; 369 struct iscsi_cmd *cmd = tmr_req->ref_cmd;
364 struct se_cmd *se_cmd = se_tmr->ref_cmd;
365 struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);
366 struct iscsi_conn_recovery *cr; 370 struct iscsi_conn_recovery *cr;
367 371
368 if (!cmd->cr) { 372 if (!cmd->cr) {
@@ -385,7 +389,7 @@ static int iscsit_task_reassign_complete_scsi_cmnd(
385 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); 389 list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list);
386 spin_unlock_bh(&conn->cmd_lock); 390 spin_unlock_bh(&conn->cmd_lock);
387 391
388 if (se_cmd->se_cmd_flags & SCF_SENT_CHECK_CONDITION) { 392 if (cmd->se_cmd.se_cmd_flags & SCF_SENT_CHECK_CONDITION) {
389 cmd->i_state = ISTATE_SEND_STATUS; 393 cmd->i_state = ISTATE_SEND_STATUS;
390 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); 394 iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state);
391 return 0; 395 return 0;
@@ -411,17 +415,14 @@ static int iscsit_task_reassign_complete(
411 struct iscsi_tmr_req *tmr_req, 415 struct iscsi_tmr_req *tmr_req,
412 struct iscsi_conn *conn) 416 struct iscsi_conn *conn)
413{ 417{
414 struct se_tmr_req *se_tmr = tmr_req->se_tmr_req;
415 struct se_cmd *se_cmd;
416 struct iscsi_cmd *cmd; 418 struct iscsi_cmd *cmd;
417 int ret = 0; 419 int ret = 0;
418 420
419 if (!se_tmr->ref_cmd) { 421 if (!tmr_req->ref_cmd) {
420 pr_err("TMR Request is missing a RefCmd struct iscsi_cmd.\n"); 422 pr_err("TMR Request is missing a RefCmd struct iscsi_cmd.\n");
421 return -1; 423 return -1;
422 } 424 }
423 se_cmd = se_tmr->ref_cmd; 425 cmd = tmr_req->ref_cmd;
424 cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);
425 426
426 cmd->conn = conn; 427 cmd->conn = conn;
427 428
@@ -547,9 +548,7 @@ int iscsit_task_reassign_prepare_write(
547 struct iscsi_tmr_req *tmr_req, 548 struct iscsi_tmr_req *tmr_req,
548 struct iscsi_conn *conn) 549 struct iscsi_conn *conn)
549{ 550{
550 struct se_tmr_req *se_tmr = tmr_req->se_tmr_req; 551 struct iscsi_cmd *cmd = tmr_req->ref_cmd;
551 struct se_cmd *se_cmd = se_tmr->ref_cmd;
552 struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);
553 struct iscsi_pdu *pdu = NULL; 552 struct iscsi_pdu *pdu = NULL;
554 struct iscsi_r2t *r2t = NULL, *r2t_tmp; 553 struct iscsi_r2t *r2t = NULL, *r2t_tmp;
555 int first_incomplete_r2t = 1, i = 0; 554 int first_incomplete_r2t = 1, i = 0;
@@ -782,14 +781,12 @@ int iscsit_check_task_reassign_expdatasn(
782 struct iscsi_tmr_req *tmr_req, 781 struct iscsi_tmr_req *tmr_req,
783 struct iscsi_conn *conn) 782 struct iscsi_conn *conn)
784{ 783{
785 struct se_tmr_req *se_tmr = tmr_req->se_tmr_req; 784 struct iscsi_cmd *ref_cmd = tmr_req->ref_cmd;
786 struct se_cmd *se_cmd = se_tmr->ref_cmd;
787 struct iscsi_cmd *ref_cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);
788 785
789 if (ref_cmd->iscsi_opcode != ISCSI_OP_SCSI_CMD) 786 if (ref_cmd->iscsi_opcode != ISCSI_OP_SCSI_CMD)
790 return 0; 787 return 0;
791 788
792 if (se_cmd->se_cmd_flags & SCF_SENT_CHECK_CONDITION) 789 if (ref_cmd->se_cmd.se_cmd_flags & SCF_SENT_CHECK_CONDITION)
793 return 0; 790 return 0;
794 791
795 if (ref_cmd->data_direction == DMA_NONE) 792 if (ref_cmd->data_direction == DMA_NONE)
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h
index 6e99dc5a5f6b..15039dd9de18 100644
--- a/include/target/target_core_base.h
+++ b/include/target/target_core_base.h
@@ -483,11 +483,8 @@ struct se_tmr_req {
483 int call_transport; 483 int call_transport;
484 /* Reference to ITT that Task Mgmt should be performed */ 484 /* Reference to ITT that Task Mgmt should be performed */
485 u32 ref_task_tag; 485 u32 ref_task_tag;
486 /* 64-bit encoded SAM LUN from $FABRIC_MOD TMR header */
487 u64 ref_task_lun;
488 void *fabric_tmr_ptr; 486 void *fabric_tmr_ptr;
489 struct se_cmd *task_cmd; 487 struct se_cmd *task_cmd;
490 struct se_cmd *ref_cmd;
491 struct se_device *tmr_dev; 488 struct se_device *tmr_dev;
492 struct se_lun *tmr_lun; 489 struct se_lun *tmr_lun;
493 struct list_head tmr_list; 490 struct list_head tmr_list;