linux-scsi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/4] target/tcm_qla2xxx: Add TMR_ABORT_TASK support
@ 2012-02-13 11:42 Nicholas A. Bellinger
  2012-02-13 11:42 ` [PATCH 1/4] target: Add SCF_ACK_KREF flag for acknowledgement kref Nicholas A. Bellinger
                   ` (4 more replies)
  0 siblings, 5 replies; 7+ messages in thread
From: Nicholas A. Bellinger @ 2012-02-13 11:42 UTC (permalink / raw)
  To: target-devel, linux-scsi
  Cc: Andrew Vasquez, Giridhar Malavali, Arun Easi, Christoph Hellwig,
	Roland Dreier, Madhuranath Iyengar, Nicholas Bellinger

From: Nicholas Bellinger <nab@linux-iscsi.org>

Hi folks,

The following series adds explict TMR_ABORT_TASK support using session
command list descriptors for target_submit_cmd() fabric module users.

The logic performs explict abort using tmr->ref_task_tag for outstanding
descriptors have not been set CMD_T_COMPLETE in transport_complete_task()
during backend I/O completion.  It also cancels se_cmd->work and wait for
backing I/O to complete before attempting to send SAM_STAT_TASK_ABORTED
and perform necessary target_put_sess_cmd() to drop outstanding cmd_kref
references.

So far this has been tested with tcm_qla2xxx using target-core debug code
to simulate delayed execution of a referenced tag descriptor in the
following locations:

- Before execution of tasks in transport_generic_new_cmd()
- Before completion of tasks in transport_complete_task() 
- After completion of tasks in transport_complete_task()

The code can use some more testing and review, but so far these changes
with simulated I/O delays are generating SAM_STAT_TASK_ABORTED status for
the aborted tag, or failing with TMR_TASK_DOES_NOT_EXIST as expected..

Please have a look,

--nab

Nicholas Bellinger (4):
  target: Add SCF_ACK_KREF flag for acknowledgement kref
  target: Make target_release_cmd_kref release on empty list
  target: Add TMR_ABORT_TASK task management support
  qla_target/tcm_qla2xxx: Fix TMR_ABORT_TASK with target mode usage

 drivers/scsi/qla2xxx/qla_target.c      |   15 +++----
 drivers/scsi/qla2xxx/qla_target.h      |    2 +-
 drivers/scsi/qla2xxx/tcm_qla2xxx.c     |    6 ++-
 drivers/scsi/qla2xxx/tcm_qla2xxx.h     |    3 +-
 drivers/target/target_core_internal.h  |    2 +
 drivers/target/target_core_tmr.c       |   64 ++++++++++++++++++++++++++++++++
 drivers/target/target_core_transport.c |   26 ++++++++----
 include/target/target_core_base.h      |    3 +-
 8 files changed, 100 insertions(+), 21 deletions(-)

-- 
1.7.2.5

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 1/4] target: Add SCF_ACK_KREF flag for acknowledgement kref
  2012-02-13 11:42 [PATCH 0/4] target/tcm_qla2xxx: Add TMR_ABORT_TASK support Nicholas A. Bellinger
@ 2012-02-13 11:42 ` Nicholas A. Bellinger
  2012-02-13 11:42 ` [PATCH 2/4] target: Make target_release_cmd_kref release on empty list Nicholas A. Bellinger
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Nicholas A. Bellinger @ 2012-02-13 11:42 UTC (permalink / raw)
  To: target-devel, linux-scsi
  Cc: Andrew Vasquez, Giridhar Malavali, Arun Easi, Christoph Hellwig,
	Roland Dreier, Madhuranath Iyengar, Nicholas Bellinger

From: Nicholas Bellinger <nab@linux-iscsi.org>

When TARGET_SCF_ACK_KREF is in use with target_submit_cmd() for
setting the extra acknowledgement reference to se_cmd->cmd_kref,
go ahead and set SCF_ACK_KREF in order to be used later by
abort task.

Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
---
 drivers/target/target_core_transport.c |    4 +++-
 include/target/target_core_base.h      |    3 ++-
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
index 1fe946c..4a6ece1 100644
--- a/drivers/target/target_core_transport.c
+++ b/drivers/target/target_core_transport.c
@@ -4035,8 +4035,10 @@ void target_get_sess_cmd(struct se_session *se_sess, struct se_cmd *se_cmd,
 	 * fabric acknowledgement that requires two target_put_sess_cmd()
 	 * invocations before se_cmd descriptor release.
 	 */
-	if (ack_kref == true)
+	if (ack_kref == true) {
 		kref_get(&se_cmd->cmd_kref);
+		se_cmd->se_cmd_flags |= SCF_ACK_KREF;
+	}
 
 	spin_lock_irqsave(&se_sess->sess_cmd_lock, flags);
 	list_add_tail(&se_cmd->se_cmd_list, &se_sess->sess_cmd_list);
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h
index 870768c..2d3d79a 100644
--- a/include/target/target_core_base.h
+++ b/include/target/target_core_base.h
@@ -183,7 +183,8 @@ enum se_cmd_flags_table {
 	SCF_ALUA_NON_OPTIMIZED		= 0x00040000,
 	SCF_DELAYED_CMD_FROM_SAM_ATTR	= 0x00080000,
 	SCF_UNUSED			= 0x00100000,
-	SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC = 0x00400000,
+	SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC = 0x00200000,
+	SCF_ACK_KREF			= 0x00400000,
 };
 
 /* struct se_dev_entry->lun_flags and struct se_lun->lun_access */
-- 
1.7.2.5

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 2/4] target: Make target_release_cmd_kref release on empty list
  2012-02-13 11:42 [PATCH 0/4] target/tcm_qla2xxx: Add TMR_ABORT_TASK support Nicholas A. Bellinger
  2012-02-13 11:42 ` [PATCH 1/4] target: Add SCF_ACK_KREF flag for acknowledgement kref Nicholas A. Bellinger
@ 2012-02-13 11:42 ` Nicholas A. Bellinger
  2012-02-13 11:42 ` [PATCH 3/4] target: Add TMR_ABORT_TASK task management support Nicholas A. Bellinger
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Nicholas A. Bellinger @ 2012-02-13 11:42 UTC (permalink / raw)
  To: target-devel, linux-scsi
  Cc: Andrew Vasquez, Giridhar Malavali, Arun Easi, Christoph Hellwig,
	Roland Dreier, Madhuranath Iyengar, Nicholas Bellinger

From: Nicholas Bellinger <nab@linux-iscsi.org>

This patch changes target_release_cmd_kref() to make TFO->release_cmd()
call when list_empty(&se_cmd->se_cmd_list) is TRUE.  This is required
for TMR_ABORT_TASK operation where the referenced tag descriptor may
have already been pulled of the session command list.

Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
---
 drivers/target/target_core_transport.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
index 4a6ece1..17183da 100644
--- a/drivers/target/target_core_transport.c
+++ b/drivers/target/target_core_transport.c
@@ -4056,7 +4056,7 @@ static void target_release_cmd_kref(struct kref *kref)
 	spin_lock_irqsave(&se_sess->sess_cmd_lock, flags);
 	if (list_empty(&se_cmd->se_cmd_list)) {
 		spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags);
-		WARN_ON(1);
+		se_cmd->se_tfo->release_cmd(se_cmd);
 		return;
 	}
 	if (se_sess->sess_tearing_down && se_cmd->cmd_wait_set) {
-- 
1.7.2.5

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 3/4] target: Add TMR_ABORT_TASK task management support
  2012-02-13 11:42 [PATCH 0/4] target/tcm_qla2xxx: Add TMR_ABORT_TASK support Nicholas A. Bellinger
  2012-02-13 11:42 ` [PATCH 1/4] target: Add SCF_ACK_KREF flag for acknowledgement kref Nicholas A. Bellinger
  2012-02-13 11:42 ` [PATCH 2/4] target: Make target_release_cmd_kref release on empty list Nicholas A. Bellinger
@ 2012-02-13 11:42 ` Nicholas A. Bellinger
  2012-02-13 11:42 ` [PATCH 4/4] qla_target/tcm_qla2xxx: Fix TMR_ABORT_TASK with target mode usage Nicholas A. Bellinger
  2012-02-17  1:35 ` [PATCH 0/4] target/tcm_qla2xxx: Add TMR_ABORT_TASK support Andy Grover
  4 siblings, 0 replies; 7+ messages in thread
From: Nicholas A. Bellinger @ 2012-02-13 11:42 UTC (permalink / raw)
  To: target-devel, linux-scsi
  Cc: Andrew Vasquez, Giridhar Malavali, Arun Easi, Christoph Hellwig,
	Roland Dreier, Madhuranath Iyengar, Nicholas Bellinger

From: Nicholas Bellinger <nab@linux-iscsi.org>

This patch adds initial support for TMR_ABORT_TASK ops for se_cmd
descriptors using se_sess->sess_cmd_list and se_cmd->cmd_kref counting.

It will perform an explict abort for all outstanding se_cmd ops based
upon tmr->ref_task_tag that have not been set CMD_T_COMPLETE.
It will cancel se_cmd->work and wait for backing I/O to complete before
attempting to send SAM_STAT_TASK_ABORTED and perform
target_put_sess_cmd() to release the referenced descriptor.

It also adds a CMD_T_ABORTED check into transport_complete_task() to
catch the completion from backend I/O that has been aborted, and
updates transport_wait_for_tasks() to allow CMD_T_ABORTED usage with
core_tmr_abort_task() context.

Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
---
 drivers/target/target_core_internal.h  |    2 +
 drivers/target/target_core_tmr.c       |   64 ++++++++++++++++++++++++++++++++
 drivers/target/target_core_transport.c |   20 ++++++---
 3 files changed, 79 insertions(+), 7 deletions(-)

diff --git a/drivers/target/target_core_internal.h b/drivers/target/target_core_internal.h
index e414c90..88bdb57 100644
--- a/drivers/target/target_core_internal.h
+++ b/drivers/target/target_core_internal.h
@@ -75,6 +75,8 @@ struct se_hba *core_alloc_hba(const char *, u32, u32);
 int	core_delete_hba(struct se_hba *);
 
 /* target_core_tmr.c */
+void	core_tmr_abort_task(struct se_device *, struct se_tmr_req *,
+			struct se_session *);
 int	core_tmr_lun_reset(struct se_device *, struct se_tmr_req *,
 		struct list_head *, struct se_cmd *);
 
diff --git a/drivers/target/target_core_tmr.c b/drivers/target/target_core_tmr.c
index 4c91ad0..eb4ea0c 100644
--- a/drivers/target/target_core_tmr.c
+++ b/drivers/target/target_core_tmr.c
@@ -105,6 +105,70 @@ static int target_check_cdb_and_preempt(struct list_head *list,
 	return 1;
 }
 
+void core_tmr_abort_task(
+	struct se_device *dev,
+	struct se_tmr_req *tmr,
+	struct se_session *se_sess)
+{
+	struct se_cmd *se_cmd, *tmp_cmd;
+	unsigned long flags;
+	int ref_tag;
+
+	spin_lock_irqsave(&se_sess->sess_cmd_lock, flags);
+	list_for_each_entry_safe(se_cmd, tmp_cmd,
+			&se_sess->sess_cmd_list, se_cmd_list) {
+
+		if (dev != se_cmd->se_dev)
+			continue;
+		ref_tag = se_cmd->se_tfo->get_task_tag(se_cmd);
+		if (tmr->ref_task_tag != ref_tag)
+			continue;
+
+		printk("ABORT_TASK: Found referenced %s task_tag: %u\n",
+			se_cmd->se_tfo->get_fabric_name(), ref_tag);
+
+		spin_lock_irq(&se_cmd->t_state_lock);
+		if (se_cmd->transport_state & CMD_T_COMPLETE) {
+			printk("ABORT_TASK: ref_tag: %u already complete, skipping\n", ref_tag);
+			spin_unlock_irq(&se_cmd->t_state_lock);
+			spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags);
+			goto out;
+		}
+		se_cmd->transport_state |= CMD_T_ABORTED;
+		spin_unlock_irq(&se_cmd->t_state_lock);
+
+		list_del_init(&se_cmd->se_cmd_list);
+		kref_get(&se_cmd->cmd_kref);
+		spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags);
+
+		cancel_work_sync(&se_cmd->work);
+		transport_wait_for_tasks(se_cmd);
+		/*
+		 * Now send SAM_STAT_TASK_ABORTED status for the referenced
+		 * se_cmd descriptor..
+		 */
+		transport_send_task_abort(se_cmd);
+		/*
+		 * Also deal with possible extra acknowledge reference..
+		 */
+		if (se_cmd->se_cmd_flags & SCF_ACK_KREF)
+			target_put_sess_cmd(se_sess, se_cmd);
+
+		target_put_sess_cmd(se_sess, se_cmd);
+
+		printk("ABORT_TASK: Sending TMR_FUNCTION_COMPLETE for"
+				" ref_tag: %d\n", ref_tag);
+		tmr->response = TMR_FUNCTION_COMPLETE;
+		return;
+	}
+	spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags);
+
+out:
+	printk("ABORT_TASK: Sending TMR_TASK_DOES_NOT_EXIST for ref_tag: %d\n",
+			tmr->ref_task_tag);
+	tmr->response = TMR_TASK_DOES_NOT_EXIST;
+}
+
 static void core_tmr_drain_tmr_list(
 	struct se_device *dev,
 	struct se_tmr_req *tmr,
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
index 17183da..bba671a 100644
--- a/drivers/target/target_core_transport.c
+++ b/drivers/target/target_core_transport.c
@@ -701,17 +701,24 @@ void transport_complete_task(struct se_task *task, int success)
 		spin_unlock_irqrestore(&cmd->t_state_lock, flags);
 		return;
 	}
-
-	if (cmd->transport_state & CMD_T_FAILED) {
+	/*
+	 * Check for case where an explict ABORT_TASK has been received
+	 * and transport_wait_for_tasks() will be waiting for completion..
+	 */
+	if (cmd->transport_state & CMD_T_ABORTED &&
+	    cmd->transport_state & CMD_T_STOP) {
+		spin_unlock_irqrestore(&cmd->t_state_lock, flags);
+		complete(&cmd->t_transport_stop_comp);
+		return;
+	} else if (cmd->transport_state & CMD_T_FAILED) {
 		cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
 		INIT_WORK(&cmd->work, target_complete_failure_work);
 	} else {
-		cmd->transport_state |= CMD_T_COMPLETE;
 		INIT_WORK(&cmd->work, target_complete_ok_work);
 	}
 
 	cmd->t_state = TRANSPORT_COMPLETE;
-	cmd->transport_state |= CMD_T_ACTIVE;
+	cmd->transport_state |= (CMD_T_COMPLETE | CMD_T_ACTIVE);
 	spin_unlock_irqrestore(&cmd->t_state_lock, flags);
 
 	queue_work(target_completion_wq, &cmd->work);
@@ -4379,8 +4386,7 @@ bool transport_wait_for_tasks(struct se_cmd *cmd)
 		cmd->transport_state &= ~CMD_T_LUN_STOP;
 	}
 
-	if (!(cmd->transport_state & CMD_T_ACTIVE) ||
-	     (cmd->transport_state & CMD_T_ABORTED)) {
+	if (!(cmd->transport_state & CMD_T_ACTIVE)) {
 		spin_unlock_irqrestore(&cmd->t_state_lock, flags);
 		return false;
 	}
@@ -4686,7 +4692,7 @@ static int transport_generic_do_tmr(struct se_cmd *cmd)
 
 	switch (tmr->function) {
 	case TMR_ABORT_TASK:
-		tmr->response = TMR_FUNCTION_REJECTED;
+		core_tmr_abort_task(dev, tmr, cmd->se_sess);
 		break;
 	case TMR_ABORT_TASK_SET:
 	case TMR_CLEAR_ACA:
-- 
1.7.2.5


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 4/4] qla_target/tcm_qla2xxx: Fix TMR_ABORT_TASK with target mode usage
  2012-02-13 11:42 [PATCH 0/4] target/tcm_qla2xxx: Add TMR_ABORT_TASK support Nicholas A. Bellinger
                   ` (2 preceding siblings ...)
  2012-02-13 11:42 ` [PATCH 3/4] target: Add TMR_ABORT_TASK task management support Nicholas A. Bellinger
@ 2012-02-13 11:42 ` Nicholas A. Bellinger
  2012-02-17  1:35 ` [PATCH 0/4] target/tcm_qla2xxx: Add TMR_ABORT_TASK support Andy Grover
  4 siblings, 0 replies; 7+ messages in thread
From: Nicholas A. Bellinger @ 2012-02-13 11:42 UTC (permalink / raw)
  To: target-devel, linux-scsi
  Cc: Andrew Vasquez, Giridhar Malavali, Arun Easi, Christoph Hellwig,
	Roland Dreier, Madhuranath Iyengar, Nicholas Bellinger

From: Nicholas Bellinger <nab@linux-iscsi.org>

This patch fixes qla_target.c code use the proper TMR_ABORT_TASK
that target-core is expecting, instead of the incorrect ABORT_TASK
message code usage from include/scsi/scsi.h.

It also changes tgt_ops->handle_tmr() -> tcm_qla2xxx_handle_tmr()
to accept referenced tag for TMR_ABORT_TASK that is setup to
se_tmr_req->ref_task_tag.

Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
---
 drivers/scsi/qla2xxx/qla_target.c  |   15 +++++++--------
 drivers/scsi/qla2xxx/qla_target.h  |    2 +-
 drivers/scsi/qla2xxx/tcm_qla2xxx.c |    6 +++++-
 drivers/scsi/qla2xxx/tcm_qla2xxx.h |    3 ++-
 4 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c
index 4b24457..ac203ef 100644
--- a/drivers/scsi/qla2xxx/qla_target.c
+++ b/drivers/scsi/qla2xxx/qla_target.c
@@ -1304,7 +1304,8 @@ static int __qla_tgt_24xx_handle_abts(struct scsi_qla_host *vha,
 	mcmd->sess = sess;
 	memcpy(&mcmd->orig_iocb.abts, abts, sizeof(mcmd->orig_iocb.abts));
 
-	rc = ha->tgt_ops->handle_tmr(mcmd, 0, ABORT_TASK);
+	rc = ha->tgt_ops->handle_tmr(mcmd, 0, TMR_ABORT_TASK,
+				abts->exchange_addr_to_abort);
 	if (rc != 0) {
 		printk(KERN_ERR "qla_target(%d):  tgt_ops->handle_tmr()"
 				" failed: %d", vha->vp_idx, rc);
@@ -1428,7 +1429,7 @@ void qla_tgt_xmit_tm_rsp(struct qla_tgt_mgmt_cmd *mcmd)
 	unsigned long flags;
 
 	ql_dbg(ql_dbg_tgt_mgt, vha, 0xe116, "TM response mcmd"
-		" (%p) status %#x state %#x", mcmd, mcmd->se_tmr_req->response,
+		" (%p) status %#x state %#x", mcmd, mcmd->fc_tm_rsp,
 		mcmd->flags);
 
 	spin_lock_irqsave(&ha->hardware_lock, flags);
@@ -1436,7 +1437,7 @@ void qla_tgt_xmit_tm_rsp(struct qla_tgt_mgmt_cmd *mcmd)
 		qla_tgt_send_notify_ack(vha, &mcmd->orig_iocb.imm_ntfy,
 			0, 0, 0, 0, 0, 0);
 	else {
-		if (mcmd->se_tmr_req->function == ABORT_TASK)
+		if (mcmd->se_tmr_req->function == TMR_ABORT_TASK)
 			qla_tgt_24xx_send_abts_resp(vha, &mcmd->orig_iocb.abts,
 				mcmd->fc_tm_rsp, false);
 		else
@@ -2804,7 +2805,7 @@ static int qla_tgt_issue_task_mgmt(struct qla_tgt_sess *sess, uint32_t lun,
 		return -ENOSYS;
 	}
 
-	res = ha->tgt_ops->handle_tmr(mcmd, lun, tmr_func);
+	res = ha->tgt_ops->handle_tmr(mcmd, lun, tmr_func, 0);
 	if (res != 0) {
 		printk(KERN_ERR "qla_target(%d): tgt_ops->handle_tmr() failed: %d\n",
 			    sess->vha->vp_idx, res);
@@ -2857,7 +2858,6 @@ static int __qla_tgt_abort_task(struct scsi_qla_host *vha,
 	struct qla_tgt_mgmt_cmd *mcmd;
 	uint32_t lun, unpacked_lun;
 	int rc;
-	uint16_t tag;
 
 	mcmd = mempool_alloc(qla_tgt_mgmt_cmd_mempool, GFP_ATOMIC);
 	if (mcmd == NULL) {
@@ -2870,12 +2870,11 @@ static int __qla_tgt_abort_task(struct scsi_qla_host *vha,
 	mcmd->sess = sess;
 	memcpy(&mcmd->orig_iocb.imm_ntfy, iocb, sizeof(mcmd->orig_iocb.imm_ntfy));
 
-	tag = le16_to_cpu(iocb->u.isp2x.seq_id);
-
 	lun = a->u.isp24.fcp_cmnd.lun;
 	unpacked_lun = scsilun_to_int((struct scsi_lun *)&lun);
 
-	rc = ha->tgt_ops->handle_tmr(mcmd, unpacked_lun, ABORT_TASK);
+	rc = ha->tgt_ops->handle_tmr(mcmd, unpacked_lun, TMR_ABORT_TASK,
+				le16_to_cpu(iocb->u.isp2x.seq_id));
 	if (rc != 0) {
 		printk(KERN_ERR "qla_target(%d): tgt_ops->handle_tmr()"
 			" failed: %d\n", vha->vp_idx, rc);
diff --git a/drivers/scsi/qla2xxx/qla_target.h b/drivers/scsi/qla2xxx/qla_target.h
index b98b923..935ea32 100644
--- a/drivers/scsi/qla2xxx/qla_target.h
+++ b/drivers/scsi/qla2xxx/qla_target.h
@@ -634,7 +634,7 @@ struct qla_tgt_func_tmpl {
 	int (*handle_cmd)(struct scsi_qla_host *, struct qla_tgt_cmd *,
 			unsigned char *, uint32_t, int, int, int);
 	int (*handle_data)(struct qla_tgt_cmd *);
-	int (*handle_tmr)(struct qla_tgt_mgmt_cmd *, uint32_t, uint8_t);
+	int (*handle_tmr)(struct qla_tgt_mgmt_cmd *, uint32_t, uint8_t, uint32_t);
 	void (*free_cmd)(struct qla_tgt_cmd *);
 	void (*free_session)(struct qla_tgt_sess *);
 
diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.c b/drivers/scsi/qla2xxx/tcm_qla2xxx.c
index 71de7a6..5456af2 100644
--- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c
+++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c
@@ -668,7 +668,8 @@ int tcm_qla2xxx_handle_data(struct qla_tgt_cmd *cmd)
 /*
  * Called from qla_target.c:qla_tgt_issue_task_mgmt()
  */
-int tcm_qla2xxx_handle_tmr(struct qla_tgt_mgmt_cmd *mcmd, uint32_t lun, uint8_t tmr_func)
+int tcm_qla2xxx_handle_tmr(struct qla_tgt_mgmt_cmd *mcmd, uint32_t lun,
+			uint8_t tmr_func, uint32_t tag)
 {
 	struct qla_tgt_sess *sess = mcmd->sess;
 	struct se_session *se_sess = sess->se_sess;
@@ -688,6 +689,9 @@ int tcm_qla2xxx_handle_tmr(struct qla_tgt_mgmt_cmd *mcmd, uint32_t lun, uint8_t
 	 * Save the se_tmr_req for qla_tgt_xmit_tm_rsp() callback into LLD code
 	 */
 	mcmd->se_tmr_req = &se_cmd->se_tmr_req;
+
+	if (tmr_func == TMR_ABORT_TASK)
+		mcmd->se_tmr_req->ref_task_tag = tag;
 	/*
 	 * Locate the underlying TCM struct se_lun from sc->device->lun
 	 */
diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.h b/drivers/scsi/qla2xxx/tcm_qla2xxx.h
index 9dbac00..e700c15 100644
--- a/drivers/scsi/qla2xxx/tcm_qla2xxx.h
+++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.h
@@ -139,7 +139,8 @@ extern int tcm_qla2xxx_handle_cmd(struct scsi_qla_host *, struct qla_tgt_cmd *,
 			unsigned char *, uint32_t, int, int, int);
 extern int tcm_qla2xxx_new_cmd_map(struct se_cmd *);
 extern int tcm_qla2xxx_handle_data(struct qla_tgt_cmd *);
-extern int tcm_qla2xxx_handle_tmr(struct qla_tgt_mgmt_cmd *, uint32_t, uint8_t);
+extern int tcm_qla2xxx_handle_tmr(struct qla_tgt_mgmt_cmd *, uint32_t,
+				uint8_t, uint32_t);
 extern int tcm_qla2xxx_queue_data_in(struct se_cmd *);
 extern int tcm_qla2xxx_queue_status(struct se_cmd *);
 extern int tcm_qla2xxx_queue_tm_rsp(struct se_cmd *);
-- 
1.7.2.5

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH 0/4] target/tcm_qla2xxx: Add TMR_ABORT_TASK support
  2012-02-13 11:42 [PATCH 0/4] target/tcm_qla2xxx: Add TMR_ABORT_TASK support Nicholas A. Bellinger
                   ` (3 preceding siblings ...)
  2012-02-13 11:42 ` [PATCH 4/4] qla_target/tcm_qla2xxx: Fix TMR_ABORT_TASK with target mode usage Nicholas A. Bellinger
@ 2012-02-17  1:35 ` Andy Grover
  2012-02-17  8:13   ` Nicholas A. Bellinger
  4 siblings, 1 reply; 7+ messages in thread
From: Andy Grover @ 2012-02-17  1:35 UTC (permalink / raw)
  To: Nicholas A. Bellinger
  Cc: target-devel, linux-scsi, Andrew Vasquez, Giridhar Malavali,
	Arun Easi, Christoph Hellwig, Roland Dreier, Madhuranath Iyengar

On 02/13/2012 03:42 AM, Nicholas A. Bellinger wrote:
> The following series adds explict TMR_ABORT_TASK support using session
> command list descriptors for target_submit_cmd() fabric module users.

<snip>

> The code can use some more testing and review, but so far these changes
> with simulated I/O delays are generating SAM_STAT_TASK_ABORTED status for
> the aborted tag, or failing with TMR_TASK_DOES_NOT_EXIST as expected..
> 
> Please have a look,

Reviewed, looks good.

Do you have plans to implement ABORT_TASK_SET as well?

Regards -- Andy

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 0/4] target/tcm_qla2xxx: Add TMR_ABORT_TASK support
  2012-02-17  1:35 ` [PATCH 0/4] target/tcm_qla2xxx: Add TMR_ABORT_TASK support Andy Grover
@ 2012-02-17  8:13   ` Nicholas A. Bellinger
  0 siblings, 0 replies; 7+ messages in thread
From: Nicholas A. Bellinger @ 2012-02-17  8:13 UTC (permalink / raw)
  To: Andy Grover
  Cc: target-devel, linux-scsi, Andrew Vasquez, Giridhar Malavali,
	Arun Easi, Christoph Hellwig, Roland Dreier, Madhuranath Iyengar

On Thu, 2012-02-16 at 17:35 -0800, Andy Grover wrote:
> On 02/13/2012 03:42 AM, Nicholas A. Bellinger wrote:
> > The following series adds explict TMR_ABORT_TASK support using session
> > command list descriptors for target_submit_cmd() fabric module users.
> 
> <snip>
> 
> > The code can use some more testing and review, but so far these changes
> > with simulated I/O delays are generating SAM_STAT_TASK_ABORTED status for
> > the aborted tag, or failing with TMR_TASK_DOES_NOT_EXIST as expected..
> > 
> > Please have a look,
> 
> Reviewed, looks good.
> 
> Do you have plans to implement ABORT_TASK_SET as well?
> 

Hi Andy,

At some point, I'd like to add generic support for ABORT_TASK_SET into
target-core.

The conversion of iscsi-target to use per session cmd list probably
needs to happen so that ABORT_TASK + ABORT_TASK_SET can be properly
supported there first.

Also, I'm not currently aware of a method to generate ABORT_TASK_SET for
testing using simulated failures with qla2xxx (other than an FC
jammer..?), and current libiscsi clients do not generate ABORT_TASK_SET.

I imagine it would be easier to test ABORT_TASK_SET if libscsi could
generate this TMR for testing purposes (via SG ioctl perhaps..?) 

--nab




^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2012-02-17  8:13 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-02-13 11:42 [PATCH 0/4] target/tcm_qla2xxx: Add TMR_ABORT_TASK support Nicholas A. Bellinger
2012-02-13 11:42 ` [PATCH 1/4] target: Add SCF_ACK_KREF flag for acknowledgement kref Nicholas A. Bellinger
2012-02-13 11:42 ` [PATCH 2/4] target: Make target_release_cmd_kref release on empty list Nicholas A. Bellinger
2012-02-13 11:42 ` [PATCH 3/4] target: Add TMR_ABORT_TASK task management support Nicholas A. Bellinger
2012-02-13 11:42 ` [PATCH 4/4] qla_target/tcm_qla2xxx: Fix TMR_ABORT_TASK with target mode usage Nicholas A. Bellinger
2012-02-17  1:35 ` [PATCH 0/4] target/tcm_qla2xxx: Add TMR_ABORT_TASK support Andy Grover
2012-02-17  8:13   ` Nicholas A. Bellinger

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).