target: move ref_cmd from the generic se_tmr_req into iscsi code

Also remove the unused ref_task_lun field in struct se_tmr_req.

(nab: Add missing TASK_REASSIGN ref_lun vs. ref_cmd orig_fe_lun checks
      in iscsit_tmr_task_reassign)

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
Christoph Hellwig 2012-05-20 14:35:02 -04:00 committed by Nicholas Bellinger
parent 5f41a31d0a
commit 9f3eb93eaf
3 changed files with 21 additions and 26 deletions

View File

@ -481,6 +481,7 @@ struct iscsi_tmr_req {
bool task_reassign:1; bool task_reassign:1;
u32 ref_cmd_sn; u32 ref_cmd_sn;
u32 exp_data_sn; u32 exp_data_sn;
struct iscsi_cmd *ref_cmd;
struct iscsi_conn_recovery *conn_recovery; struct iscsi_conn_recovery *conn_recovery;
struct se_tmr_req *se_tmr_req; struct se_tmr_req *se_tmr_req;
}; };

View File

@ -19,6 +19,7 @@
******************************************************************************/ ******************************************************************************/
#include <asm/unaligned.h> #include <asm/unaligned.h>
#include <scsi/scsi_device.h>
#include <scsi/iscsi_proto.h> #include <scsi/iscsi_proto.h>
#include <target/target_core_base.h> #include <target/target_core_base.h>
#include <target/target_core_fabric.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_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->ref_cmd_sn = hdr->refcmdsn;
tmr_req->exp_data_sn = hdr->exp_datasn; 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 iscsi_tmr_req *tmr_req = cmd->tmr_req;
struct se_tmr_req *se_tmr = cmd->se_cmd.se_tmr_req; struct se_tmr_req *se_tmr = cmd->se_cmd.se_tmr_req;
struct iscsi_tm *hdr = (struct iscsi_tm *) buf; struct iscsi_tm *hdr = (struct iscsi_tm *) buf;
int ret; int ret, ref_lun;
pr_debug("Got TASK_REASSIGN TMR ITT: 0x%08x," pr_debug("Got TASK_REASSIGN TMR ITT: 0x%08x,"
" RefTaskTag: 0x%08x, ExpDataSN: 0x%08x, CID: %hu\n", " RefTaskTag: 0x%08x, ExpDataSN: 0x%08x, CID: %hu\n",
@ -155,9 +156,16 @@ u8 iscsit_tmr_task_reassign(
return ISCSI_TMF_RSP_REJECTED; 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_task_tag = hdr->rtt;
se_tmr->ref_cmd = &ref_cmd->se_cmd; tmr_req->ref_cmd = ref_cmd;
se_tmr->ref_task_lun = get_unaligned_le64(&hdr->lun);
tmr_req->ref_cmd_sn = hdr->refcmdsn; tmr_req->ref_cmd_sn = hdr->refcmdsn;
tmr_req->exp_data_sn = hdr->exp_datasn; tmr_req->exp_data_sn = hdr->exp_datasn;
tmr_req->conn_recovery = cr; 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_tmr_req *tmr_req,
struct iscsi_conn *conn) struct iscsi_conn *conn)
{ {
struct se_tmr_req *se_tmr = tmr_req->se_tmr_req; struct iscsi_cmd *cmd = tmr_req->ref_cmd;
struct se_cmd *se_cmd = se_tmr->ref_cmd;
struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);
struct iscsi_conn_recovery *cr; struct iscsi_conn_recovery *cr;
if (!cmd->cr) { if (!cmd->cr) {
@ -360,9 +366,7 @@ static int iscsit_task_reassign_complete_scsi_cmnd(
struct iscsi_tmr_req *tmr_req, struct iscsi_tmr_req *tmr_req,
struct iscsi_conn *conn) struct iscsi_conn *conn)
{ {
struct se_tmr_req *se_tmr = tmr_req->se_tmr_req; struct iscsi_cmd *cmd = tmr_req->ref_cmd;
struct se_cmd *se_cmd = se_tmr->ref_cmd;
struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);
struct iscsi_conn_recovery *cr; struct iscsi_conn_recovery *cr;
if (!cmd->cr) { if (!cmd->cr) {
@ -385,7 +389,7 @@ static int iscsit_task_reassign_complete_scsi_cmnd(
list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list);
spin_unlock_bh(&conn->cmd_lock); 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; cmd->i_state = ISTATE_SEND_STATUS;
iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state); iscsit_add_cmd_to_response_queue(cmd, conn, cmd->i_state);
return 0; return 0;
@ -411,17 +415,14 @@ static int iscsit_task_reassign_complete(
struct iscsi_tmr_req *tmr_req, struct iscsi_tmr_req *tmr_req,
struct iscsi_conn *conn) struct iscsi_conn *conn)
{ {
struct se_tmr_req *se_tmr = tmr_req->se_tmr_req;
struct se_cmd *se_cmd;
struct iscsi_cmd *cmd; struct iscsi_cmd *cmd;
int ret = 0; 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"); pr_err("TMR Request is missing a RefCmd struct iscsi_cmd.\n");
return -1; return -1;
} }
se_cmd = se_tmr->ref_cmd; cmd = tmr_req->ref_cmd;
cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);
cmd->conn = conn; cmd->conn = conn;
@ -547,9 +548,7 @@ int iscsit_task_reassign_prepare_write(
struct iscsi_tmr_req *tmr_req, struct iscsi_tmr_req *tmr_req,
struct iscsi_conn *conn) struct iscsi_conn *conn)
{ {
struct se_tmr_req *se_tmr = tmr_req->se_tmr_req; struct iscsi_cmd *cmd = tmr_req->ref_cmd;
struct se_cmd *se_cmd = se_tmr->ref_cmd;
struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);
struct iscsi_pdu *pdu = NULL; struct iscsi_pdu *pdu = NULL;
struct iscsi_r2t *r2t = NULL, *r2t_tmp; struct iscsi_r2t *r2t = NULL, *r2t_tmp;
int first_incomplete_r2t = 1, i = 0; int first_incomplete_r2t = 1, i = 0;
@ -782,14 +781,12 @@ int iscsit_check_task_reassign_expdatasn(
struct iscsi_tmr_req *tmr_req, struct iscsi_tmr_req *tmr_req,
struct iscsi_conn *conn) struct iscsi_conn *conn)
{ {
struct se_tmr_req *se_tmr = tmr_req->se_tmr_req; struct iscsi_cmd *ref_cmd = tmr_req->ref_cmd;
struct se_cmd *se_cmd = se_tmr->ref_cmd;
struct iscsi_cmd *ref_cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);
if (ref_cmd->iscsi_opcode != ISCSI_OP_SCSI_CMD) if (ref_cmd->iscsi_opcode != ISCSI_OP_SCSI_CMD)
return 0; 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; return 0;
if (ref_cmd->data_direction == DMA_NONE) if (ref_cmd->data_direction == DMA_NONE)

View File

@ -483,11 +483,8 @@ struct se_tmr_req {
int call_transport; int call_transport;
/* Reference to ITT that Task Mgmt should be performed */ /* Reference to ITT that Task Mgmt should be performed */
u32 ref_task_tag; u32 ref_task_tag;
/* 64-bit encoded SAM LUN from $FABRIC_MOD TMR header */
u64 ref_task_lun;
void *fabric_tmr_ptr; void *fabric_tmr_ptr;
struct se_cmd *task_cmd; struct se_cmd *task_cmd;
struct se_cmd *ref_cmd;
struct se_device *tmr_dev; struct se_device *tmr_dev;
struct se_lun *tmr_lun; struct se_lun *tmr_lun;
struct list_head tmr_list; struct list_head tmr_list;