diff options
Diffstat (limited to 'drivers/target/iscsi/iscsi_target_tmr.c')
| -rw-r--r-- | drivers/target/iscsi/iscsi_target_tmr.c | 46 | 
1 files changed, 22 insertions, 24 deletions
diff --git a/drivers/target/iscsi/iscsi_target_tmr.c b/drivers/target/iscsi/iscsi_target_tmr.c index f4e640b51fd..f62fe123d90 100644 --- a/drivers/target/iscsi/iscsi_target_tmr.c +++ b/drivers/target/iscsi/iscsi_target_tmr.c @@ -19,6 +19,7 @@   ******************************************************************************/  #include <asm/unaligned.h> +#include <scsi/scsi_device.h>  #include <scsi/iscsi_proto.h>  #include <target/target_core_base.h>  #include <target/target_core_fabric.h> @@ -61,7 +62,7 @@ u8 iscsit_tmr_abort_task(  	}  	se_tmr->ref_task_tag		= hdr->rtt; -	se_tmr->ref_cmd			= &ref_cmd->se_cmd; +	tmr_req->ref_cmd		= ref_cmd;  	tmr_req->ref_cmd_sn		= hdr->refcmdsn;  	tmr_req->exp_data_sn		= hdr->exp_datasn; @@ -121,7 +122,7 @@ u8 iscsit_tmr_task_reassign(  	struct iscsi_tmr_req *tmr_req = cmd->tmr_req;  	struct se_tmr_req *se_tmr = cmd->se_cmd.se_tmr_req;  	struct iscsi_tm *hdr = (struct iscsi_tm *) buf; -	int ret; +	int ret, ref_lun;  	pr_debug("Got TASK_REASSIGN TMR ITT: 0x%08x,"  		" RefTaskTag: 0x%08x, ExpDataSN: 0x%08x, CID: %hu\n", @@ -155,9 +156,16 @@ u8 iscsit_tmr_task_reassign(  		return ISCSI_TMF_RSP_REJECTED;  	} +	ref_lun = scsilun_to_int(&hdr->lun); +	if (ref_lun != ref_cmd->se_cmd.orig_fe_lun) { +		pr_err("Unable to perform connection recovery for" +			" differing ref_lun: %d ref_cmd orig_fe_lun: %u\n", +			ref_lun, ref_cmd->se_cmd.orig_fe_lun); +		return ISCSI_TMF_RSP_REJECTED; +	} +  	se_tmr->ref_task_tag		= hdr->rtt; -	se_tmr->ref_cmd			= &ref_cmd->se_cmd; -	se_tmr->ref_task_lun		= get_unaligned_le64(&hdr->lun); +	tmr_req->ref_cmd		= ref_cmd;  	tmr_req->ref_cmd_sn		= hdr->refcmdsn;  	tmr_req->exp_data_sn		= hdr->exp_datasn;  	tmr_req->conn_recovery		= cr; @@ -191,9 +199,7 @@ static int iscsit_task_reassign_complete_nop_out(  	struct iscsi_tmr_req *tmr_req,  	struct iscsi_conn *conn)  { -	struct se_tmr_req *se_tmr = tmr_req->se_tmr_req; -	struct se_cmd *se_cmd = se_tmr->ref_cmd; -	struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd); +	struct iscsi_cmd *cmd = tmr_req->ref_cmd;  	struct iscsi_conn_recovery *cr;  	if (!cmd->cr) { @@ -251,7 +257,8 @@ static int iscsit_task_reassign_complete_write(  			pr_debug("WRITE ITT: 0x%08x: t_state: %d"  				" never sent to transport\n",  				cmd->init_task_tag, cmd->se_cmd.t_state); -			return transport_generic_handle_data(se_cmd); +			target_execute_cmd(se_cmd); +			return 0;  		}  		cmd->i_state = ISTATE_SEND_STATUS; @@ -360,9 +367,7 @@ static int iscsit_task_reassign_complete_scsi_cmnd(  	struct iscsi_tmr_req *tmr_req,  	struct iscsi_conn *conn)  { -	struct se_tmr_req *se_tmr = tmr_req->se_tmr_req; -	struct se_cmd *se_cmd = se_tmr->ref_cmd; -	struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd); +	struct iscsi_cmd *cmd = tmr_req->ref_cmd;  	struct iscsi_conn_recovery *cr;  	if (!cmd->cr) { @@ -385,7 +390,7 @@ static int iscsit_task_reassign_complete_scsi_cmnd(  	list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list);  	spin_unlock_bh(&conn->cmd_lock); -	if (se_cmd->se_cmd_flags & SCF_SENT_CHECK_CONDITION) { +	if (cmd->se_cmd.se_cmd_flags & SCF_SENT_CHECK_CONDITION) {  		cmd->i_state = ISTATE_SEND_STATUS;  		iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state);  		return 0; @@ -411,17 +416,14 @@ static int iscsit_task_reassign_complete(  	struct iscsi_tmr_req *tmr_req,  	struct iscsi_conn *conn)  { -	struct se_tmr_req *se_tmr = tmr_req->se_tmr_req; -	struct se_cmd *se_cmd;  	struct iscsi_cmd *cmd;  	int ret = 0; -	if (!se_tmr->ref_cmd) { +	if (!tmr_req->ref_cmd) {  		pr_err("TMR Request is missing a RefCmd struct iscsi_cmd.\n");  		return -1;  	} -	se_cmd = se_tmr->ref_cmd; -	cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd); +	cmd = tmr_req->ref_cmd;  	cmd->conn = conn; @@ -547,9 +549,7 @@ int iscsit_task_reassign_prepare_write(  	struct iscsi_tmr_req *tmr_req,  	struct iscsi_conn *conn)  { -	struct se_tmr_req *se_tmr = tmr_req->se_tmr_req; -	struct se_cmd *se_cmd = se_tmr->ref_cmd; -	struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd); +	struct iscsi_cmd *cmd = tmr_req->ref_cmd;  	struct iscsi_pdu *pdu = NULL;  	struct iscsi_r2t *r2t = NULL, *r2t_tmp;  	int first_incomplete_r2t = 1, i = 0; @@ -782,14 +782,12 @@ int iscsit_check_task_reassign_expdatasn(  	struct iscsi_tmr_req *tmr_req,  	struct iscsi_conn *conn)  { -	struct se_tmr_req *se_tmr = tmr_req->se_tmr_req; -	struct se_cmd *se_cmd = se_tmr->ref_cmd; -	struct iscsi_cmd *ref_cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd); +	struct iscsi_cmd *ref_cmd = tmr_req->ref_cmd;  	if (ref_cmd->iscsi_opcode != ISCSI_OP_SCSI_CMD)  		return 0; -	if (se_cmd->se_cmd_flags & SCF_SENT_CHECK_CONDITION) +	if (ref_cmd->se_cmd.se_cmd_flags & SCF_SENT_CHECK_CONDITION)  		return 0;  	if (ref_cmd->data_direction == DMA_NONE)  |