* [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).