Re: [PATCH 2/2] target: Move task tag into struct se_cmd

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 04/14/2015 01:26 PM, Bart Van Assche wrote:
Simplify target core and target drivers by storing the task tag
a.k.a. command identifier inside struct se_cmd.

Signed-off-by: Bart Van Assche <bart.vanassche@xxxxxxxxxxx>
Cc: Christoph Hellwig <hch@xxxxxx>
Cc: Andy Grover <agrover@xxxxxxxxxx>
Cc: Sagi Grimberg <sagig@xxxxxxxxxxxx>
Cc: <qla2xxx-upstream@xxxxxxxxxx>
Cc: Felipe Balbi <balbi@xxxxxx>
Cc: Michael S. Tsirkin <mst@xxxxxxxxxx>
Cc: Juergen Gross <jgross@xxxxxxxx>

Regarding xen-scsiback.c:

Acked-by: Juergen Gross <jgross@xxxxxxxx>

---
  Documentation/target/tcm_mod_builder.py      |  8 -----
  drivers/infiniband/ulp/srpt/ib_srpt.c        | 35 +++++++------------
  drivers/infiniband/ulp/srpt/ib_srpt.h        |  1 -
  drivers/scsi/qla2xxx/qla_target.c            | 52 ++++++++++++----------------
  drivers/scsi/qla2xxx/qla_target.h            |  1 -
  drivers/scsi/qla2xxx/tcm_qla2xxx.c           | 11 ------
  drivers/target/iscsi/iscsi_target.c          |  1 +
  drivers/target/iscsi/iscsi_target_configfs.c |  9 -----
  drivers/target/loopback/tcm_loop.c           | 10 +-----
  drivers/target/sbp/sbp_target.c              | 12 ++-----
  drivers/target/target_core_configfs.c        |  4 ---
  drivers/target/target_core_tmr.c             |  6 ++--
  drivers/target/target_core_transport.c       | 33 +++++++++---------
  drivers/target/target_core_xcopy.c           |  7 +---
  drivers/target/tcm_fc/tcm_fc.h               |  1 -
  drivers/target/tcm_fc/tfc_cmd.c              | 10 +-----
  drivers/target/tcm_fc/tfc_conf.c             |  1 -
  drivers/usb/gadget/legacy/tcm_usb_gadget.c   | 36 +++++++------------
  drivers/usb/gadget/legacy/tcm_usb_gadget.h   |  1 -
  drivers/vhost/scsi.c                         |  7 +---
  drivers/xen/xen-scsiback.c                   | 10 +-----
  include/target/target_core_base.h            |  1 +
  include/target/target_core_fabric.h          |  1 -
  23 files changed, 76 insertions(+), 182 deletions(-)

diff --git a/Documentation/target/tcm_mod_builder.py b/Documentation/target/tcm_mod_builder.py
index 27afc03..0b79be3 100755
--- a/Documentation/target/tcm_mod_builder.py
+++ b/Documentation/target/tcm_mod_builder.py
@@ -396,7 +396,6 @@ def tcm_mod_build_configfs(proto_ident, fabric_mod_dir_var, fabric_mod_name):
  	buf += "	.write_pending			= " + fabric_mod_name + "_write_pending,\n"
  	buf += "	.write_pending_status		= " + fabric_mod_name + "_write_pending_status,\n"
  	buf += "	.set_default_node_attributes	= " + fabric_mod_name + "_set_default_node_attrs,\n"
-	buf += "	.get_task_tag			= " + fabric_mod_name + "_get_task_tag,\n"
  	buf += "	.get_cmd_state			= " + fabric_mod_name + "_get_cmd_state,\n"
  	buf += "	.queue_data_in			= " + fabric_mod_name + "_queue_data_in,\n"
  	buf += "	.queue_status			= " + fabric_mod_name + "_queue_status,\n"
@@ -790,13 +789,6 @@ def tcm_mod_dump_fabric_ops(proto_ident, fabric_mod_dir_var, fabric_mod_name):
  			buf += "}\n\n"
  			bufi += "void " + fabric_mod_name + "_set_default_node_attrs(struct se_node_acl *);\n"

-		if re.search('get_task_tag\)\(', fo):
-			buf += "u32 " + fabric_mod_name + "_get_task_tag(struct se_cmd *se_cmd)\n"
-			buf += "{\n"
-			buf += "	return 0;\n"
-			buf += "}\n\n"
-			bufi += "u32 " + fabric_mod_name + "_get_task_tag(struct se_cmd *);\n"
-
  		if re.search('get_cmd_state\)\(', fo):
  			buf += "int " + fabric_mod_name + "_get_cmd_state(struct se_cmd *se_cmd)\n"
  			buf += "{\n"
diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c
index 0701538..e45a0c3 100644
--- a/drivers/infiniband/ulp/srpt/ib_srpt.c
+++ b/drivers/infiniband/ulp/srpt/ib_srpt.c
@@ -1339,8 +1339,8 @@ static int srpt_abort_cmd(struct srpt_send_ioctx *ioctx)
  		goto out;
  	}

-	pr_debug("Aborting cmd with state %d and tag %lld\n", state,
-		 ioctx->tag);
+	pr_debug("Aborting cmd with state %d and tag %d\n", state,
+		 ioctx->cmd.tag);

  	switch (state) {
  	case SRPT_STATE_NEW:
@@ -1704,7 +1704,7 @@ static int srpt_handle_cmd(struct srpt_rdma_ch *ch,

  	srp_cmd = recv_ioctx->ioctx.buf;
  	cmd = &send_ioctx->cmd;
-	send_ioctx->tag = srp_cmd->tag;
+	cmd->tag = srp_cmd->tag;

  	switch (srp_cmd->task_attr) {
  	case SRP_CMD_SIMPLE_Q:
@@ -1775,7 +1775,7 @@ static int srpt_rx_mgmt_fn_tag(struct srpt_send_ioctx *ioctx, u64 tag)
  	for (i = 0; i < ch->rq_size; ++i) {
  		target = ch->ioctx_ring[i];
  		if (target->cmd.se_lun == ioctx->cmd.se_lun &&
-		    target->tag == tag &&
+		    target->cmd.tag == tag &&
  		    srpt_get_cmd_state(target) != SRPT_STATE_DONE) {
  			ret = 0;
  			/* now let the target core abort &target->cmd; */
@@ -1834,7 +1834,7 @@ static void srpt_handle_tsk_mgmt(struct srpt_rdma_ch *ch,
  		 srp_tsk->task_tag, srp_tsk->tag, ch->cm_id, ch->sess);

  	srpt_set_cmd_state(send_ioctx, SRPT_STATE_MGMT);
-	send_ioctx->tag = srp_tsk->tag;
+	send_ioctx->cmd.tag = srp_tsk->tag;
  	tcm_tmr = srp_tmr_to_tcm(srp_tsk->tsk_mgmt_func);
  	if (tcm_tmr < 0) {
  		send_ioctx->cmd.se_tmr_req->response =
@@ -2983,8 +2983,8 @@ static int srpt_write_pending(struct se_cmd *se_cmd)
  	case CH_DISCONNECTING:
  	case CH_DRAINING:
  	case CH_RELEASING:
-		pr_debug("cmd with tag %lld: channel disconnecting\n",
-			 ioctx->tag);
+		pr_debug("cmd with tag %d: channel disconnecting\n",
+			 ioctx->cmd.tag);
  		srpt_set_cmd_state(ioctx, SRPT_STATE_DATA_IN);
  		ret = -EINVAL;
  		goto out;
@@ -3058,25 +3058,25 @@ static void srpt_queue_response(struct se_cmd *cmd)
  	    !ioctx->queue_status_only) {
  		ret = srpt_xfer_data(ch, ioctx);
  		if (ret) {
-			printk(KERN_ERR "xfer_data failed for tag %llu\n",
-			       ioctx->tag);
+			printk(KERN_ERR "xfer_data failed for tag %u\n",
+			       ioctx->cmd.tag);
  			return;
  		}
  	}

  	if (state != SRPT_STATE_MGMT)
-		resp_len = srpt_build_cmd_rsp(ch, ioctx, ioctx->tag,
+		resp_len = srpt_build_cmd_rsp(ch, ioctx, ioctx->cmd.tag,
  					      cmd->scsi_status);
  	else {
  		srp_tm_status
  			= tcm_to_srp_tsk_mgmt_status(cmd->se_tmr_req->response);
  		resp_len = srpt_build_tskmgmt_rsp(ch, ioctx, srp_tm_status,
-						 ioctx->tag);
+						 ioctx->cmd.tag);
  	}
  	ret = srpt_post_send(ch, ioctx, resp_len);
  	if (ret) {
-		printk(KERN_ERR "sending cmd response failed for tag %llu\n",
-		       ioctx->tag);
+		printk(KERN_ERR "sending cmd response failed for tag %u\n",
+		       ioctx->cmd.tag);
  		srpt_unmap_sg_to_ib_sge(ch, ioctx);
  		srpt_set_cmd_state(ioctx, SRPT_STATE_DONE);
  		target_put_sess_cmd(ioctx->ch->sess, &ioctx->cmd);
@@ -3553,14 +3553,6 @@ static void srpt_set_default_node_attrs(struct se_node_acl *nacl)
  {
  }

-static u32 srpt_get_task_tag(struct se_cmd *se_cmd)
-{
-	struct srpt_send_ioctx *ioctx;
-
-	ioctx = container_of(se_cmd, struct srpt_send_ioctx, cmd);
-	return ioctx->tag;
-}
-
  /* Note: only used from inside debug printk's by the TCM core. */
  static int srpt_get_tcm_cmd_state(struct se_cmd *se_cmd)
  {
@@ -3946,7 +3938,6 @@ static const struct target_core_fabric_ops srpt_template = {
  	.write_pending			= srpt_write_pending,
  	.write_pending_status		= srpt_write_pending_status,
  	.set_default_node_attributes	= srpt_set_default_node_attrs,
-	.get_task_tag			= srpt_get_task_tag,
  	.get_cmd_state			= srpt_get_tcm_cmd_state,
  	.queue_data_in			= srpt_queue_data_in,
  	.queue_status			= srpt_queue_status,
diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.h b/drivers/infiniband/ulp/srpt/ib_srpt.h
index 3dae156..f3b110f 100644
--- a/drivers/infiniband/ulp/srpt/ib_srpt.h
+++ b/drivers/infiniband/ulp/srpt/ib_srpt.h
@@ -238,7 +238,6 @@ struct srpt_send_ioctx {
  	bool			rdma_aborted;
  	struct se_cmd		cmd;
  	struct completion	tx_done;
-	u64			tag;
  	int			sg_cnt;
  	int			mapped_sg_count;
  	u16			n_rdma_ius;
diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c
index fe8a8d1..87f3b84 100644
--- a/drivers/scsi/qla2xxx/qla_target.c
+++ b/drivers/scsi/qla2xxx/qla_target.c
@@ -1191,7 +1191,7 @@ static int __qlt_24xx_handle_abts(struct scsi_qla_host *vha,
  	list_for_each_entry(se_cmd, &se_sess->sess_cmd_list, se_cmd_list) {
  		struct qla_tgt_cmd *cmd =
  			container_of(se_cmd, struct qla_tgt_cmd, se_cmd);
-		if (cmd->tag == abts->exchange_addr_to_abort) {
+		if (se_cmd->tag == abts->exchange_addr_to_abort) {
  			lun = cmd->unpacked_lun;
  			found_lun = true;
  			break;
@@ -1728,9 +1728,8 @@ static int qlt_pre_xmit_response(struct qla_tgt_cmd *cmd,

  	if (unlikely(cmd->aborted)) {
  		ql_dbg(ql_dbg_tgt_mgt, vha, 0xf014,
-		    "qla_target(%d): terminating exchange "
-		    "for aborted cmd=%p (se_cmd=%p, tag=%d)", vha->vp_idx, cmd,
-		    se_cmd, cmd->tag);
+		       "qla_target(%d): terminating exchange for aborted cmd=%p (se_cmd=%p, tag=%d)",
+		       vha->vp_idx, cmd, se_cmd, se_cmd->tag);

  		cmd->state = QLA_TGT_STATE_ABORTED;
  		cmd->cmd_flags |= BIT_6;
@@ -1765,18 +1764,17 @@ static int qlt_pre_xmit_response(struct qla_tgt_cmd *cmd,
  	if (se_cmd->se_cmd_flags & SCF_UNDERFLOW_BIT) {
  		prm->residual = se_cmd->residual_count;
  		ql_dbg(ql_dbg_io + ql_dbg_verbose, vha, 0x305c,
-		    "Residual underflow: %d (tag %d, "
-		    "op %x, bufflen %d, rq_result %x)\n", prm->residual,
-		    cmd->tag, se_cmd->t_task_cdb ? se_cmd->t_task_cdb[0] : 0,
-		    cmd->bufflen, prm->rq_result);
+		    "Residual underflow: %d (tag %d, op %x, bufflen %d, rq_result %x)\n",
+		       prm->residual, se_cmd->tag,
+		       se_cmd->t_task_cdb ? se_cmd->t_task_cdb[0] : 0,
+		       cmd->bufflen, prm->rq_result);
  		prm->rq_result |= SS_RESIDUAL_UNDER;
  	} else if (se_cmd->se_cmd_flags & SCF_OVERFLOW_BIT) {
  		prm->residual = se_cmd->residual_count;
  		ql_dbg(ql_dbg_io, vha, 0x305d,
-		    "Residual overflow: %d (tag %d, "
-		    "op %x, bufflen %d, rq_result %x)\n", prm->residual,
-		    cmd->tag, se_cmd->t_task_cdb ? se_cmd->t_task_cdb[0] : 0,
-		    cmd->bufflen, prm->rq_result);
+		    "Residual overflow: %d (tag %d, op %x, bufflen %d, rq_result %x)\n",
+		       prm->residual, se_cmd->tag, se_cmd->t_task_cdb ?
+		       se_cmd->t_task_cdb[0] : 0, cmd->bufflen, prm->rq_result);
  		prm->rq_result |= SS_RESIDUAL_OVER;
  	}

@@ -1849,7 +1847,7 @@ static void qlt_check_srr_debug(struct qla_tgt_cmd *cmd, int *xmit_type)
  	    == 50) {
  		*xmit_type &= ~QLA_TGT_XMIT_STATUS;
  		ql_dbg(ql_dbg_tgt_mgt, cmd->vha, 0xf015,
-		    "Dropping cmd %p (tag %d) status", cmd, cmd->tag);
+		    "Dropping cmd %p (tag %d) status", cmd, se_cmd->tag);
  	}
  #endif
  	/*
@@ -1873,7 +1871,7 @@ static void qlt_check_srr_debug(struct qla_tgt_cmd *cmd, int *xmit_type)
  		ql_dbg(ql_dbg_tgt_mgt, cmd->vha, 0xf016,
  		    "Cutting cmd %p (tag %d) buffer"
  		    " tail to len %d, sg_cnt %d (cmd->bufflen %d,"
-		    " cmd->sg_cnt %d)", cmd, cmd->tag, tot_len, leave,
+		    " cmd->sg_cnt %d)", cmd, se_cmd->tag, tot_len, leave,
  		    cmd->bufflen, cmd->sg_cnt);

  		cmd->bufflen = tot_len;
@@ -1885,13 +1883,13 @@ static void qlt_check_srr_debug(struct qla_tgt_cmd *cmd, int *xmit_type)

  		ql_dbg(ql_dbg_tgt_mgt, cmd->vha, 0xf017,
  		    "Cutting cmd %p (tag %d) buffer head "
-		    "to offset %d (cmd->bufflen %d)", cmd, cmd->tag, offset,
+		    "to offset %d (cmd->bufflen %d)", cmd, se_cmd->tag, offset,
  		    cmd->bufflen);
  		if (offset == 0)
  			*xmit_type &= ~QLA_TGT_XMIT_DATA;
  		else if (qlt_set_data_offset(cmd, offset)) {
  			ql_dbg(ql_dbg_tgt_mgt, cmd->vha, 0xf018,
-			    "qlt_set_data_offset() failed (tag %d)", cmd->tag);
+			    "qlt_set_data_offset() failed (tag %d)", se_cmd->tag);
  		}
  	}
  }
@@ -3194,7 +3192,7 @@ skip_term:
  		return;
  	} else if (cmd->state == QLA_TGT_STATE_ABORTED) {
  		ql_dbg(ql_dbg_tgt_mgt, vha, 0xf01e,
-		    "Aborted command %p (tag %d) finished\n", cmd, cmd->tag);
+		  "Aborted command %p (tag %d) finished\n", cmd, se_cmd->tag);
  	} else {
  		ql_dbg(ql_dbg_tgt_mgt, vha, 0xf05c,
  		    "qla_target(%d): A command in state (%d) should "
@@ -3266,7 +3264,7 @@ static void __qlt_do_work(struct qla_tgt_cmd *cmd)
  		goto out_term;

  	cdb = &atio->u.isp24.fcp_cmnd.cdb[0];
-	cmd->tag = atio->u.isp24.exchange_addr;
+	cmd->se_cmd.tag = atio->u.isp24.exchange_addr;
  	cmd->unpacked_lun = scsilun_to_int(
  	    (struct scsi_lun *)&atio->u.isp24.fcp_cmnd.lun);

@@ -3891,9 +3889,8 @@ static void qlt_handle_srr(struct scsi_qla_host *vha,
  			resp = 1;
  		} else {
  			ql_dbg(ql_dbg_tgt_mgt, vha, 0xf064,
-			    "qla_target(%d): SRR for in data for cmd "
-			    "without them (tag %d, SCSI status %d), "
-			    "reject", vha->vp_idx, cmd->tag,
+			       "qla_target(%d): SRR for in data for cmd without them (tag %d, SCSI status %d), reject",
+			       vha->vp_idx, se_cmd->tag,
  			    cmd->se_cmd.scsi_status);
  			goto out_reject;
  		}
@@ -3927,10 +3924,8 @@ static void qlt_handle_srr(struct scsi_qla_host *vha,
  			}
  		} else {
  			ql_dbg(ql_dbg_tgt_mgt, vha, 0xf066,
-			    "qla_target(%d): SRR for out data for cmd "
-			    "without them (tag %d, SCSI status %d), "
-			    "reject", vha->vp_idx, cmd->tag,
-			    cmd->se_cmd.scsi_status);
+			    "qla_target(%d): SRR for out data for cmd without them (tag %d, SCSI status %d), reject",
+			       vha->vp_idx, se_cmd->tag, cmd->se_cmd.scsi_status);
  			goto out_reject;
  		}
  		break;
@@ -4051,10 +4046,9 @@ restart:
  		cmd->sg = se_cmd->t_data_sg;

  		ql_dbg(ql_dbg_tgt_mgt, vha, 0xf02c,
-		    "SRR cmd %p (se_cmd %p, tag %d, op %x), "
-		    "sg_cnt=%d, offset=%d", cmd, &cmd->se_cmd, cmd->tag,
-		    se_cmd->t_task_cdb ? se_cmd->t_task_cdb[0] : 0,
-		    cmd->sg_cnt, cmd->offset);
+		       "SRR cmd %p (se_cmd %p, tag %d, op %x), sg_cnt=%d, offset=%d",
+		       cmd, &cmd->se_cmd, se_cmd->tag, se_cmd->t_task_cdb ?
+		       se_cmd->t_task_cdb[0] : 0, cmd->sg_cnt, cmd->offset);

  		qlt_handle_srr(vha, sctio, imm);

diff --git a/drivers/scsi/qla2xxx/qla_target.h b/drivers/scsi/qla2xxx/qla_target.h
index 3320867..985d76d 100644
--- a/drivers/scsi/qla2xxx/qla_target.h
+++ b/drivers/scsi/qla2xxx/qla_target.h
@@ -924,7 +924,6 @@ struct qla_tgt_cmd {
  	int sg_cnt;		/* SG segments count */
  	int bufflen;		/* cmd buffer length */
  	int offset;
-	uint32_t tag;
  	uint32_t unpacked_lun;
  	enum dma_data_direction dma_data_direction;
  	uint32_t reset_count;
diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.c b/drivers/scsi/qla2xxx/tcm_qla2xxx.c
index d5c4982..5877895 100644
--- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c
+++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c
@@ -533,15 +533,6 @@ static void tcm_qla2xxx_set_default_node_attrs(struct se_node_acl *nacl)
  	return;
  }

-static u32 tcm_qla2xxx_get_task_tag(struct se_cmd *se_cmd)
-{
-	struct qla_tgt_cmd *cmd;
-
-	cmd = container_of(se_cmd, struct qla_tgt_cmd, se_cmd);
-
-	return cmd->tag;
-}
-
  static int tcm_qla2xxx_get_cmd_state(struct se_cmd *se_cmd)
  {
  	return 0;
@@ -2014,7 +2005,6 @@ static const struct target_core_fabric_ops tcm_qla2xxx_ops = {
  	.write_pending			= tcm_qla2xxx_write_pending,
  	.write_pending_status		= tcm_qla2xxx_write_pending_status,
  	.set_default_node_attributes	= tcm_qla2xxx_set_default_node_attrs,
-	.get_task_tag			= tcm_qla2xxx_get_task_tag,
  	.get_cmd_state			= tcm_qla2xxx_get_cmd_state,
  	.queue_data_in			= tcm_qla2xxx_queue_data_in,
  	.queue_status			= tcm_qla2xxx_queue_status,
@@ -2070,7 +2060,6 @@ static const struct target_core_fabric_ops tcm_qla2xxx_npiv_ops = {
  	.write_pending			= tcm_qla2xxx_write_pending,
  	.write_pending_status		= tcm_qla2xxx_write_pending_status,
  	.set_default_node_attributes	= tcm_qla2xxx_set_default_node_attrs,
-	.get_task_tag			= tcm_qla2xxx_get_task_tag,
  	.get_cmd_state			= tcm_qla2xxx_get_cmd_state,
  	.queue_data_in			= tcm_qla2xxx_queue_data_in,
  	.queue_status			= tcm_qla2xxx_queue_status,
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c
index 34871a6..9142496 100644
--- a/drivers/target/iscsi/iscsi_target.c
+++ b/drivers/target/iscsi/iscsi_target.c
@@ -1008,6 +1008,7 @@ int iscsit_setup_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
  	if (cmd->sense_reason)
  		goto attach_cmd;

+	cmd->se_cmd.tag = (__force u32)cmd->init_task_tag;
  	cmd->sense_reason = target_setup_cmd_from_cdb(&cmd->se_cmd, hdr->cdb);
  	if (cmd->sense_reason) {
  		if (cmd->sense_reason == TCM_OUT_OF_RESOURCES) {
diff --git a/drivers/target/iscsi/iscsi_target_configfs.c b/drivers/target/iscsi/iscsi_target_configfs.c
index 469fce4..8af7105 100644
--- a/drivers/target/iscsi/iscsi_target_configfs.c
+++ b/drivers/target/iscsi/iscsi_target_configfs.c
@@ -1735,14 +1735,6 @@ static char *iscsi_get_fabric_name(void)
  	return "iSCSI";
  }

-static u32 iscsi_get_task_tag(struct se_cmd *se_cmd)
-{
-	struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);
-
-	/* only used for printks or comparism with ->ref_task_tag */
-	return (__force u32)cmd->init_task_tag;
-}
-
  static int iscsi_get_cmd_state(struct se_cmd *se_cmd)
  {
  	struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);
@@ -2008,7 +2000,6 @@ const struct target_core_fabric_ops iscsi_ops = {
  	.write_pending			= lio_write_pending,
  	.write_pending_status		= lio_write_pending_status,
  	.set_default_node_attributes	= lio_set_default_node_attributes,
-	.get_task_tag			= iscsi_get_task_tag,
  	.get_cmd_state			= iscsi_get_cmd_state,
  	.queue_data_in			= lio_queue_data_in,
  	.queue_status			= lio_queue_status,
diff --git a/drivers/target/loopback/tcm_loop.c b/drivers/target/loopback/tcm_loop.c
index 51f0c89..6ba7b8d 100644
--- a/drivers/target/loopback/tcm_loop.c
+++ b/drivers/target/loopback/tcm_loop.c
@@ -165,6 +165,7 @@ static void tcm_loop_submission_work(struct work_struct *work)
  		transfer_length = scsi_bufflen(sc);
  	}

+	se_cmd->tag = tl_cmd->sc_cmd_tag;
  	rc = target_submit_cmd_map_sgls(se_cmd, tl_nexus->se_sess, sc->cmnd,
  			&tl_cmd->tl_sense_buf[0], tl_cmd->sc->device->lun,
  			transfer_length, TCM_SIMPLE_TAG,
@@ -742,14 +743,6 @@ static void tcm_loop_set_default_node_attributes(struct se_node_acl *se_acl)
  	return;
  }

-static u32 tcm_loop_get_task_tag(struct se_cmd *se_cmd)
-{
-	struct tcm_loop_cmd *tl_cmd = container_of(se_cmd,
-			struct tcm_loop_cmd, tl_se_cmd);
-
-	return tl_cmd->sc_cmd_tag;
-}
-
  static int tcm_loop_get_cmd_state(struct se_cmd *se_cmd)
  {
  	struct tcm_loop_cmd *tl_cmd = container_of(se_cmd,
@@ -1411,7 +1404,6 @@ static const struct target_core_fabric_ops loop_ops = {
  	.write_pending			= tcm_loop_write_pending,
  	.write_pending_status		= tcm_loop_write_pending_status,
  	.set_default_node_attributes	= tcm_loop_set_default_node_attributes,
-	.get_task_tag			= tcm_loop_get_task_tag,
  	.get_cmd_state			= tcm_loop_get_cmd_state,
  	.queue_data_in			= tcm_loop_queue_data_in,
  	.queue_status			= tcm_loop_queue_status,
diff --git a/drivers/target/sbp/sbp_target.c b/drivers/target/sbp/sbp_target.c
index 18b0f97..0f23583 100644
--- a/drivers/target/sbp/sbp_target.c
+++ b/drivers/target/sbp/sbp_target.c
@@ -1234,6 +1234,8 @@ static void sbp_handle_command(struct sbp_target_request *req)
  	pr_debug("sbp_handle_command ORB:0x%llx unpacked_lun:%d data_len:%d data_dir:%d\n",
  			req->orb_pointer, unpacked_lun, data_length, data_dir);

+	/* only used for printk until we do TMRs */
+	req->se_cmd.tag = (u32)req->orb_pointer;
  	if (target_submit_cmd(&req->se_cmd, sess->se_sess, req->cmd_buf,
  			      req->sense_buf, unpacked_lun, data_length,
  			      TCM_SIMPLE_TAG, data_dir, 0))
@@ -1795,15 +1797,6 @@ static void sbp_set_default_node_attrs(struct se_node_acl *nacl)
  	return;
  }

-static u32 sbp_get_task_tag(struct se_cmd *se_cmd)
-{
-	struct sbp_target_request *req = container_of(se_cmd,
-			struct sbp_target_request, se_cmd);
-
-	/* only used for printk until we do TMRs */
-	return (u32)req->orb_pointer;
-}
-
  static int sbp_get_cmd_state(struct se_cmd *se_cmd)
  {
  	return 0;
@@ -2526,7 +2519,6 @@ static const struct target_core_fabric_ops sbp_ops = {
  	.write_pending			= sbp_write_pending,
  	.write_pending_status		= sbp_write_pending_status,
  	.set_default_node_attributes	= sbp_set_default_node_attrs,
-	.get_task_tag			= sbp_get_task_tag,
  	.get_cmd_state			= sbp_get_cmd_state,
  	.queue_data_in			= sbp_queue_data_in,
  	.queue_status			= sbp_queue_status,
diff --git a/drivers/target/target_core_configfs.c b/drivers/target/target_core_configfs.c
index 5a35d3b66..2c35d32 100644
--- a/drivers/target/target_core_configfs.c
+++ b/drivers/target/target_core_configfs.c
@@ -395,10 +395,6 @@ static int target_fabric_tf_ops_check(const struct target_core_fabric_ops *tfo)
  		pr_err("Missing tfo->set_default_node_attributes()\n");
  		return -EINVAL;
  	}
-	if (!tfo->get_task_tag) {
-		pr_err("Missing tfo->get_task_tag()\n");
-		return -EINVAL;
-	}
  	if (!tfo->get_cmd_state) {
  		pr_err("Missing tfo->get_cmd_state()\n");
  		return -EINVAL;
diff --git a/drivers/target/target_core_tmr.c b/drivers/target/target_core_tmr.c
index 315ec34..8a2cc56 100644
--- a/drivers/target/target_core_tmr.c
+++ b/drivers/target/target_core_tmr.c
@@ -129,7 +129,7 @@ void core_tmr_abort_task(
  		if (se_cmd->se_cmd_flags & SCF_SCSI_TMR_CDB)
  			continue;

-		ref_tag = se_cmd->se_tfo->get_task_tag(se_cmd);
+		ref_tag = se_cmd->tag;
  		if (tmr->ref_task_tag != ref_tag)
  			continue;

@@ -292,13 +292,13 @@ static void core_tmr_drain_state_list(
  			" ITT/CmdSN: 0x%08x/0x%08x, i_state: %d, t_state: %d"
  			"cdb: 0x%02x\n",
  			(preempt_and_abort_list) ? "Preempt" : "", cmd,
-			cmd->se_tfo->get_task_tag(cmd), 0,
+			cmd->tag, 0,
  			cmd->se_tfo->get_cmd_state(cmd), cmd->t_state,
  			cmd->t_task_cdb[0]);
  		pr_debug("LUN_RESET: ITT[0x%08x] - pr_res_key: 0x%016Lx"
  			" -- CMD_T_ACTIVE: %d"
  			" CMD_T_STOP: %d CMD_T_SENT: %d\n",
-			cmd->se_tfo->get_task_tag(cmd), cmd->pr_res_key,
+			cmd->tag, cmd->pr_res_key,
  			(cmd->transport_state & CMD_T_ACTIVE) != 0,
  			(cmd->transport_state & CMD_T_STOP) != 0,
  			(cmd->transport_state & CMD_T_SENT) != 0);
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
index 57df213..87c37bc 100644
--- a/drivers/target/target_core_transport.c
+++ b/drivers/target/target_core_transport.c
@@ -593,8 +593,7 @@ static int transport_cmd_check_stop(struct se_cmd *cmd, bool remove_from_lists,
  	 */
  	if (cmd->transport_state & CMD_T_STOP) {
  		pr_debug("%s:%d CMD_T_STOP for ITT: 0x%08x\n",
-			__func__, __LINE__,
-			cmd->se_tfo->get_task_tag(cmd));
+			__func__, __LINE__, cmd->tag);

  		spin_unlock_irqrestore(&cmd->t_state_lock, flags);

@@ -1147,6 +1146,8 @@ target_cmd_size_check(struct se_cmd *cmd, unsigned int size)
  /*
   * Used by fabric modules containing a local struct se_cmd within their
   * fabric dependent per I/O descriptor.
+ *
+ * Preserves the value of @cmd->tag.
   */
  void transport_init_se_cmd(
  	struct se_cmd *cmd,
@@ -1374,6 +1375,8 @@ transport_generic_map_mem_to_cmd(struct se_cmd *cmd, struct scatterlist *sgl,
   * @sgl_prot: struct scatterlist memory protection information
   * @sgl_prot_count: scatterlist count for protection information
   *
+ * Task tags are supported if the caller has set @se_cmd->tag.
+ *
   * Returns non zero to signal active I/O shutdown failure.  All other
   * setup exceptions will be returned as a SCSI CHECK_CONDITION response,
   * but still return zero here.
@@ -1505,6 +1508,8 @@ EXPORT_SYMBOL(target_submit_cmd_map_sgls);
   * @data_dir: DMA data direction
   * @flags: flags for command submission from target_sc_flags_tables
   *
+ * Task tags are supported if the caller has set @se_cmd->tag.
+ *
   * Returns non zero to signal active I/O shutdown failure.  All other
   * setup exceptions will be returned as a SCSI CHECK_CONDITION response,
   * but still return zero here.
@@ -1633,8 +1638,7 @@ void transport_generic_request_failure(struct se_cmd *cmd,
  	int ret = 0;

  	pr_debug("-----[ Storage Engine Exception for cmd: %p ITT: 0x%08x"
-		" CDB: 0x%02x\n", cmd, cmd->se_tfo->get_task_tag(cmd),
-		cmd->t_task_cdb[0]);
+		" CDB: 0x%02x\n", cmd, cmd->tag, cmd->t_task_cdb[0]);
  	pr_debug("-----[ i_state: %d t_state: %d sense_reason: %d\n",
  		cmd->se_tfo->get_cmd_state(cmd),
  		cmd->t_state, sense_reason);
@@ -1843,8 +1847,7 @@ void target_execute_cmd(struct se_cmd *cmd)
  	spin_lock_irq(&cmd->t_state_lock);
  	if (cmd->transport_state & CMD_T_STOP) {
  		pr_debug("%s:%d CMD_T_STOP for ITT: 0x%08x\n",
-			__func__, __LINE__,
-			cmd->se_tfo->get_task_tag(cmd));
+			__func__, __LINE__, cmd->tag);

  		spin_unlock_irq(&cmd->t_state_lock);
  		complete_all(&cmd->t_transport_stop_comp);
@@ -2649,10 +2652,8 @@ bool transport_wait_for_tasks(struct se_cmd *cmd)

  	cmd->transport_state |= CMD_T_STOP;

-	pr_debug("wait_for_tasks: Stopping %p ITT: 0x%08x"
-		" i_state: %d, t_state: %d, CMD_T_STOP\n",
-		cmd, cmd->se_tfo->get_task_tag(cmd),
-		cmd->se_tfo->get_cmd_state(cmd), cmd->t_state);
+	pr_debug("wait_for_tasks: Stopping %p ITT: 0x%08x i_state: %d, t_state: %d, CMD_T_STOP\n",
+		cmd, cmd->tag, cmd->se_tfo->get_cmd_state(cmd), cmd->t_state);

  	spin_unlock_irqrestore(&cmd->t_state_lock, flags);

@@ -2661,9 +2662,8 @@ bool transport_wait_for_tasks(struct se_cmd *cmd)
  	spin_lock_irqsave(&cmd->t_state_lock, flags);
  	cmd->transport_state &= ~(CMD_T_ACTIVE | CMD_T_STOP);

-	pr_debug("wait_for_tasks: Stopped wait_for_completion("
-		"&cmd->t_transport_stop_comp) for ITT: 0x%08x\n",
-		cmd->se_tfo->get_task_tag(cmd));
+	pr_debug("wait_for_tasks: Stopped wait_for_completion(&cmd->t_transport_stop_comp) for ITT: 0x%08x\n",
+		cmd->tag);

  	spin_unlock_irqrestore(&cmd->t_state_lock, flags);

@@ -2966,7 +2966,7 @@ int transport_check_aborted_status(struct se_cmd *cmd, int send_status)
  		return 1;

  	pr_debug("Sending delayed SAM_STAT_TASK_ABORTED status for CDB: 0x%02x ITT: 0x%08x\n",
-		 cmd->t_task_cdb[0], cmd->se_tfo->get_task_tag(cmd));
+		 cmd->t_task_cdb[0], cmd->tag);

  	cmd->se_cmd_flags &= ~SCF_SEND_DELAYED_TAS;
  	cmd->scsi_status = SAM_STAT_TASK_ABORTED;
@@ -3005,9 +3005,8 @@ void transport_send_task_abort(struct se_cmd *cmd)

  	transport_lun_remove_cmd(cmd);

-	pr_debug("Setting SAM_STAT_TASK_ABORTED status for CDB: 0x%02x,"
-		" ITT: 0x%08x\n", cmd->t_task_cdb[0],
-		cmd->se_tfo->get_task_tag(cmd));
+	pr_debug("Setting SAM_STAT_TASK_ABORTED status for CDB: 0x%02x, ITT: 0x%08x\n",
+		 cmd->t_task_cdb[0], cmd->tag);

  	trace_target_cmd_complete(cmd);
  	cmd->se_tfo->queue_status(cmd);
diff --git a/drivers/target/target_core_xcopy.c b/drivers/target/target_core_xcopy.c
index a600ff1..4329d2a 100644
--- a/drivers/target/target_core_xcopy.c
+++ b/drivers/target/target_core_xcopy.c
@@ -361,11 +361,6 @@ static char *xcopy_pt_get_fabric_name(void)
          return "xcopy-pt";
  }

-static u32 xcopy_pt_get_tag(struct se_cmd *se_cmd)
-{
-        return 0;
-}
-
  static int xcopy_pt_get_cmd_state(struct se_cmd *se_cmd)
  {
          return 0;
@@ -427,7 +422,6 @@ static int xcopy_pt_queue_status(struct se_cmd *se_cmd)

  static const struct target_core_fabric_ops xcopy_pt_tfo = {
  	.get_fabric_name	= xcopy_pt_get_fabric_name,
-	.get_task_tag		= xcopy_pt_get_tag,
  	.get_cmd_state		= xcopy_pt_get_cmd_state,
  	.release_cmd		= xcopy_pt_release_cmd,
  	.check_stop_free	= xcopy_pt_check_stop_free,
@@ -578,6 +572,7 @@ static int target_xcopy_setup_pt_cmd(
  	xpt_cmd->xcopy_op = xop;
  	target_xcopy_setup_pt_port(xpt_cmd, xop, remote_port);

+	cmd->tag = 0;
  	sense_rc = target_setup_cmd_from_cdb(cmd, cdb);
  	if (sense_rc) {
  		ret = -EINVAL;
diff --git a/drivers/target/tcm_fc/tcm_fc.h b/drivers/target/tcm_fc/tcm_fc.h
index 881deb3..4e7d0bf 100644
--- a/drivers/target/tcm_fc/tcm_fc.h
+++ b/drivers/target/tcm_fc/tcm_fc.h
@@ -157,7 +157,6 @@ int ft_queue_status(struct se_cmd *);
  int ft_queue_data_in(struct se_cmd *);
  int ft_write_pending(struct se_cmd *);
  int ft_write_pending_status(struct se_cmd *);
-u32 ft_get_task_tag(struct se_cmd *);
  int ft_get_cmd_state(struct se_cmd *);
  void ft_queue_tm_resp(struct se_cmd *);
  void ft_aborted_task(struct se_cmd *);
diff --git a/drivers/target/tcm_fc/tfc_cmd.c b/drivers/target/tcm_fc/tfc_cmd.c
index edcafa4..a8fe6ed 100644
--- a/drivers/target/tcm_fc/tfc_cmd.c
+++ b/drivers/target/tcm_fc/tfc_cmd.c
@@ -247,15 +247,6 @@ int ft_write_pending(struct se_cmd *se_cmd)
  	return 0;
  }

-u32 ft_get_task_tag(struct se_cmd *se_cmd)
-{
-	struct ft_cmd *cmd = container_of(se_cmd, struct ft_cmd, se_cmd);
-
-	if (cmd->aborted)
-		return ~0;
-	return fc_seq_exch(cmd->seq)->rxid;
-}
-
  int ft_get_cmd_state(struct se_cmd *se_cmd)
  {
  	return 0;
@@ -568,6 +559,7 @@ static void ft_send_work(struct work_struct *work)
  	}

  	fc_seq_exch(cmd->seq)->lp->tt.seq_set_resp(cmd->seq, ft_recv_seq, cmd);
+	cmd->se_cmd.tag = fc_seq_exch(cmd->seq)->rxid;
  	/*
  	 * Use a single se_cmd->cmd_kref as we expect to release se_cmd
  	 * directly from ft_check_stop_free callback in response path.
diff --git a/drivers/target/tcm_fc/tfc_conf.c b/drivers/target/tcm_fc/tfc_conf.c
index 65dce13..c0634fa 100644
--- a/drivers/target/tcm_fc/tfc_conf.c
+++ b/drivers/target/tcm_fc/tfc_conf.c
@@ -534,7 +534,6 @@ static const struct target_core_fabric_ops ft_fabric_ops = {
  	.write_pending =		ft_write_pending,
  	.write_pending_status =		ft_write_pending_status,
  	.set_default_node_attributes =	ft_set_default_node_attr,
-	.get_task_tag =			ft_get_task_tag,
  	.get_cmd_state =		ft_get_cmd_state,
  	.queue_data_in =		ft_queue_data_in,
  	.queue_status =			ft_queue_status,
diff --git a/drivers/usb/gadget/legacy/tcm_usb_gadget.c b/drivers/usb/gadget/legacy/tcm_usb_gadget.c
index 8b80add..bbdb28e 100644
--- a/drivers/usb/gadget/legacy/tcm_usb_gadget.c
+++ b/drivers/usb/gadget/legacy/tcm_usb_gadget.c
@@ -560,7 +560,7 @@ static void uasp_prepare_status(struct usbg_cmd *cmd)

  	cmd->state = UASP_QUEUE_COMMAND;
  	iu->iu_id = IU_ID_STATUS;
-	iu->tag = cpu_to_be16(cmd->tag);
+	iu->tag = cpu_to_be16(se_cmd->tag);

  	/*
  	 * iu->status_qual = cpu_to_be16(STATUS QUALIFIER SAM-4. Where R U?);
@@ -630,7 +630,7 @@ static int uasp_send_status_response(struct usbg_cmd *cmd)
  	struct uas_stream *stream = cmd->stream;
  	struct sense_iu *iu = &cmd->sense_iu;

-	iu->tag = cpu_to_be16(cmd->tag);
+	iu->tag = cpu_to_be16(cmd->se_cmd.tag);
  	stream->req_status->complete = uasp_status_data_cmpl;
  	stream->req_status->context = cmd;
  	cmd->fu = fu;
@@ -647,7 +647,7 @@ static int uasp_send_read_response(struct usbg_cmd *cmd)

  	cmd->fu = fu;

-	iu->tag = cpu_to_be16(cmd->tag);
+	iu->tag = cpu_to_be16(cmd->se_cmd.tag);
  	if (fu->flags & USBG_USE_STREAMS) {

  		ret = uasp_prepare_r_request(cmd);
@@ -663,7 +663,7 @@ static int uasp_send_read_response(struct usbg_cmd *cmd)
  	} else {

  		iu->iu_id = IU_ID_READ_READY;
-		iu->tag = cpu_to_be16(cmd->tag);
+		iu->tag = cpu_to_be16(cmd->se_cmd.tag);

  		stream->req_status->complete = uasp_status_data_cmpl;
  		stream->req_status->context = cmd;
@@ -692,7 +692,7 @@ static int uasp_send_write_request(struct usbg_cmd *cmd)
  	init_completion(&cmd->write_complete);
  	cmd->fu = fu;

-	iu->tag = cpu_to_be16(cmd->tag);
+	iu->tag = cpu_to_be16(se_cmd->tag);

  	if (fu->flags & USBG_USE_STREAMS) {

@@ -706,7 +706,7 @@ static int uasp_send_write_request(struct usbg_cmd *cmd)
  	} else {

  		iu->iu_id = IU_ID_WRITE_READY;
-		iu->tag = cpu_to_be16(cmd->tag);
+		iu->tag = cpu_to_be16(se_cmd->tag);

  		stream->req_status->complete = uasp_status_data_cmpl;
  		stream->req_status->context = cmd;
@@ -1065,6 +1065,7 @@ static void usbg_cmd_work(struct work_struct *work)
  		goto out;
  	}

+	se_cmd->tag = 0;
  	if (target_submit_cmd(se_cmd, tv_nexus->tvn_se_sess,
  			cmd->cmd_buf, cmd->sense_iu.sense, cmd->unpacked_lun,
  			0, cmd->prio_attr, dir, TARGET_SCF_UNKNOWN_SIZE) < 0)
@@ -1098,6 +1099,7 @@ static int usbg_submit_command(struct f_uas *fu,
  	if (!cmd)
  		return -ENOMEM;

+	se_cmd = &cmd->se_cmd;
  	cmd->fu = fu;

  	/* XXX until I figure out why I can't free in on complete */
@@ -1111,14 +1113,14 @@ static int usbg_submit_command(struct f_uas *fu,

  	memcpy(cmd->cmd_buf, cmd_iu->cdb, cmd_len);

-	cmd->tag = be16_to_cpup(&cmd_iu->tag);
+	se_cmd->tag = be16_to_cpup(&cmd_iu->tag);
  	if (fu->flags & USBG_USE_STREAMS) {
-		if (cmd->tag > UASP_SS_EP_COMP_NUM_STREAMS)
+		if (se_cmd->tag > UASP_SS_EP_COMP_NUM_STREAMS)
  			goto err;
-		if (!cmd->tag)
+		if (!se_cmd->tag)
  			cmd->stream = &fu->stream[0];
  		else
-			cmd->stream = &fu->stream[cmd->tag - 1];
+			cmd->stream = &fu->stream[se_cmd->tag - 1];
  	} else {
  		cmd->stream = &fu->stream[0];
  	}
@@ -1147,7 +1149,6 @@ static int usbg_submit_command(struct f_uas *fu,
  		break;
  	}

-	se_cmd = &cmd->se_cmd;
  	cmd->unpacked_lun = scsilun_to_int(&cmd_iu->lun);

  	INIT_WORK(&cmd->work, usbg_cmd_work);
@@ -1448,18 +1449,6 @@ static void usbg_set_default_node_attrs(struct se_node_acl *nacl)
  	return;
  }

-static u32 usbg_get_task_tag(struct se_cmd *se_cmd)
-{
-	struct usbg_cmd *cmd = container_of(se_cmd, struct usbg_cmd,
-			se_cmd);
-	struct f_uas *fu = cmd->fu;
-
-	if (fu->flags & USBG_IS_BOT)
-		return le32_to_cpu(cmd->bot_tag);
-	else
-		return cmd->tag;
-}
-
  static int usbg_get_cmd_state(struct se_cmd *se_cmd)
  {
  	return 0;
@@ -1889,7 +1878,6 @@ static const struct target_core_fabric_ops usbg_ops = {
  	.write_pending			= usbg_send_write_request,
  	.write_pending_status		= usbg_write_pending_status,
  	.set_default_node_attributes	= usbg_set_default_node_attrs,
-	.get_task_tag			= usbg_get_task_tag,
  	.get_cmd_state			= usbg_get_cmd_state,
  	.queue_data_in			= usbg_send_read_response,
  	.queue_status			= usbg_send_status_response,
diff --git a/drivers/usb/gadget/legacy/tcm_usb_gadget.h b/drivers/usb/gadget/legacy/tcm_usb_gadget.h
index 8289219..4f53db6 100644
--- a/drivers/usb/gadget/legacy/tcm_usb_gadget.h
+++ b/drivers/usb/gadget/legacy/tcm_usb_gadget.h
@@ -84,7 +84,6 @@ struct usbg_cmd {
  	struct kref ref;

  	/* UAS only */
-	u16 tag;
  	u16 prio_attr;
  	struct sense_iu sense_iu;
  	enum uas_state state;
diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c
index 5e19bb5..c629681 100644
--- a/drivers/vhost/scsi.c
+++ b/drivers/vhost/scsi.c
@@ -519,11 +519,6 @@ static void vhost_scsi_set_default_node_attrs(struct se_node_acl *nacl)
  	return;
  }

-static u32 vhost_scsi_get_task_tag(struct se_cmd *se_cmd)
-{
-	return 0;
-}
-
  static int vhost_scsi_get_cmd_state(struct se_cmd *se_cmd)
  {
  	return 0;
@@ -968,6 +963,7 @@ static void vhost_scsi_submission_work(struct work_struct *work)
  	}
  	tv_nexus = cmd->tvc_nexus;

+	se_cmd->tag = 0;
  	rc = target_submit_cmd_map_sgls(se_cmd, tv_nexus->tvn_se_sess,
  			cmd->tvc_cdb, &cmd->tvc_sense_buf[0],
  			cmd->tvc_lun, cmd->tvc_exp_data_len,
@@ -2351,7 +2347,6 @@ static struct target_core_fabric_ops vhost_scsi_ops = {
  	.write_pending			= vhost_scsi_write_pending,
  	.write_pending_status		= vhost_scsi_write_pending_status,
  	.set_default_node_attributes	= vhost_scsi_set_default_node_attrs,
-	.get_task_tag			= vhost_scsi_get_task_tag,
  	.get_cmd_state			= vhost_scsi_get_cmd_state,
  	.queue_data_in			= vhost_scsi_queue_data_in,
  	.queue_status			= vhost_scsi_queue_status,
diff --git a/drivers/xen/xen-scsiback.c b/drivers/xen/xen-scsiback.c
index ea3102f..b9f421d 100644
--- a/drivers/xen/xen-scsiback.c
+++ b/drivers/xen/xen-scsiback.c
@@ -401,6 +401,7 @@ static void scsiback_cmd_exec(struct vscsibk_pend *pending_req)
  	memset(se_cmd, 0, sizeof(*se_cmd));

  	scsiback_get(pending_req->info);
+	se_cmd->tag = pending_req->rqid;
  	rc = target_submit_cmd_map_sgls(se_cmd, sess, pending_req->cmnd,
  			pending_req->sense_buffer, pending_req->v2p->lun,
  			pending_req->data_len, 0,
@@ -1519,14 +1520,6 @@ static void scsiback_set_default_node_attrs(struct se_node_acl *nacl)
  {
  }

-static u32 scsiback_get_task_tag(struct se_cmd *se_cmd)
-{
-	struct vscsibk_pend *pending_req = container_of(se_cmd,
-				struct vscsibk_pend, se_cmd);
-
-	return pending_req->rqid;
-}
-
  static int scsiback_get_cmd_state(struct se_cmd *se_cmd)
  {
  	return 0;
@@ -1965,7 +1958,6 @@ static const struct target_core_fabric_ops scsiback_ops = {
  	.write_pending			= scsiback_write_pending,
  	.write_pending_status		= scsiback_write_pending_status,
  	.set_default_node_attributes	= scsiback_set_default_node_attrs,
-	.get_task_tag			= scsiback_get_task_tag,
  	.get_cmd_state			= scsiback_get_cmd_state,
  	.queue_data_in			= scsiback_queue_data_in,
  	.queue_status			= scsiback_queue_status,
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h
index e1de142..1800c6d 100644
--- a/include/target/target_core_base.h
+++ b/include/target/target_core_base.h
@@ -484,6 +484,7 @@ struct se_cmd {
  	u8			scsi_asc;
  	u8			scsi_ascq;
  	u16			scsi_sense_length;
+	u32			tag; /* SAM command identifier aka task tag */
  	/* Delay for ALUA Active/NonOptimized state access in milliseconds */
  	int			alua_nonop_delay;
  	/* See include/linux/dma-mapping.h */
diff --git a/include/target/target_core_fabric.h b/include/target/target_core_fabric.h
index 17c7f5a..f1bb5a4 100644
--- a/include/target/target_core_fabric.h
+++ b/include/target/target_core_fabric.h
@@ -67,7 +67,6 @@ struct target_core_fabric_ops {
  	int (*write_pending)(struct se_cmd *);
  	int (*write_pending_status)(struct se_cmd *);
  	void (*set_default_node_attributes)(struct se_node_acl *);
-	u32 (*get_task_tag)(struct se_cmd *);
  	int (*get_cmd_state)(struct se_cmd *);
  	int (*queue_data_in)(struct se_cmd *);
  	int (*queue_status)(struct se_cmd *);


--
To unsubscribe from this list: send the line "unsubscribe target-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux SCSI]     [Kernel Newbies]     [Linux SCSI Target Infrastructure]     [Share Photos]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Device Mapper]

  Powered by Linux