aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQuinn Tran <quinn.tran@qlogic.com>2015-12-17 14:57:03 -0500
committerNicholas Bellinger <nab@linux-iscsi.org>2016-01-07 16:57:45 -0500
commit193b50b9d54a4fcb723a8005b29d8dd5518e3ae2 (patch)
tree47fea09224a9449bf9b6bb6182e6bb0172c517ab
parentb7bd104e6f1c3be2bf881dc1ca7db40da3ee65fd (diff)
qla2xxx: Replace QLA_TGT_STATE_ABORTED with a bit.
Replace QLA_TGT_STATE_ABORTED state with a bit because the current state of the command is lost when an abort is requested by upper layer. Signed-off-by: Quinn Tran <quinn.tran@qlogic.com> Signed-off-by: Himanshu Madhani <himanshu.madhani@qlogic.com> Reviewed-by: Hannes Reinecke <hare@suse.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
-rw-r--r--drivers/scsi/qla2xxx/qla_target.c23
-rw-r--r--drivers/scsi/qla2xxx/qla_target.h3
2 files changed, 12 insertions, 14 deletions
diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c
index 2b218b6e9268..104d129d9e11 100644
--- a/drivers/scsi/qla2xxx/qla_target.c
+++ b/drivers/scsi/qla2xxx/qla_target.c
@@ -1469,7 +1469,7 @@ static int abort_cmd_for_tag(struct scsi_qla_host *vha, uint32_t tag)
1469 1469
1470 list_for_each_entry(cmd, &vha->qla_cmd_list, cmd_list) { 1470 list_for_each_entry(cmd, &vha->qla_cmd_list, cmd_list) {
1471 if (tag == cmd->atio.u.isp24.exchange_addr) { 1471 if (tag == cmd->atio.u.isp24.exchange_addr) {
1472 cmd->state = QLA_TGT_STATE_ABORTED; 1472 cmd->aborted = 1;
1473 spin_unlock(&vha->cmd_list_lock); 1473 spin_unlock(&vha->cmd_list_lock);
1474 return 1; 1474 return 1;
1475 } 1475 }
@@ -1511,7 +1511,7 @@ static void abort_cmds_for_lun(struct scsi_qla_host *vha,
1511 cmd_lun = scsilun_to_int( 1511 cmd_lun = scsilun_to_int(
1512 (struct scsi_lun *)&cmd->atio.u.isp24.fcp_cmnd.lun); 1512 (struct scsi_lun *)&cmd->atio.u.isp24.fcp_cmnd.lun);
1513 if (cmd_key == key && cmd_lun == lun) 1513 if (cmd_key == key && cmd_lun == lun)
1514 cmd->state = QLA_TGT_STATE_ABORTED; 1514 cmd->aborted = 1;
1515 } 1515 }
1516 spin_unlock(&vha->cmd_list_lock); 1516 spin_unlock(&vha->cmd_list_lock);
1517} 1517}
@@ -3175,7 +3175,7 @@ static void qlt_send_term_exchange(struct scsi_qla_host *vha,
3175 qlt_alloc_qfull_cmd(vha, atio, 0, 0); 3175 qlt_alloc_qfull_cmd(vha, atio, 0, 0);
3176 3176
3177done: 3177done:
3178 if (cmd && ((cmd->state != QLA_TGT_STATE_ABORTED) || 3178 if (cmd && (!cmd->aborted ||
3179 !cmd->cmd_sent_to_fw)) { 3179 !cmd->cmd_sent_to_fw)) {
3180 if (cmd->sg_mapped) 3180 if (cmd->sg_mapped)
3181 qlt_unmap_sg(vha, cmd); 3181 qlt_unmap_sg(vha, cmd);
@@ -3246,7 +3246,7 @@ void qlt_abort_cmd(struct qla_tgt_cmd *cmd)
3246 "(se_cmd=%p, tag=%llu)", vha->vp_idx, cmd, &cmd->se_cmd, 3246 "(se_cmd=%p, tag=%llu)", vha->vp_idx, cmd, &cmd->se_cmd,
3247 se_cmd->tag); 3247 se_cmd->tag);
3248 3248
3249 cmd->state = QLA_TGT_STATE_ABORTED; 3249 cmd->aborted = 1;
3250 cmd->cmd_flags |= BIT_6; 3250 cmd->cmd_flags |= BIT_6;
3251 3251
3252 qlt_send_term_exchange(vha, cmd, &cmd->atio, 0); 3252 qlt_send_term_exchange(vha, cmd, &cmd->atio, 0);
@@ -3466,9 +3466,6 @@ qlt_abort_cmd_on_host_reset(struct scsi_qla_host *vha, struct qla_tgt_cmd *cmd)
3466 3466
3467 ha->tgt.tgt_ops->handle_data(cmd); 3467 ha->tgt.tgt_ops->handle_data(cmd);
3468 return; 3468 return;
3469 } else if (cmd->state == QLA_TGT_STATE_ABORTED) {
3470 ql_dbg(ql_dbg_io, vha, 0xff02,
3471 "HOST-ABORT: handle=%d, state=ABORTED.\n", handle);
3472 } else { 3469 } else {
3473 ql_dbg(ql_dbg_io, vha, 0xff03, 3470 ql_dbg(ql_dbg_io, vha, 0xff03,
3474 "HOST-ABORT: handle=%d, state=BAD(%d).\n", handle, 3471 "HOST-ABORT: handle=%d, state=BAD(%d).\n", handle,
@@ -3633,14 +3630,14 @@ static void qlt_do_ctio_completion(struct scsi_qla_host *vha, uint32_t handle,
3633 } 3630 }
3634 3631
3635 3632
3636 /* "cmd->state == QLA_TGT_STATE_ABORTED" means 3633 /* "cmd->aborted" means
3637 * cmd is already aborted/terminated, we don't 3634 * cmd is already aborted/terminated, we don't
3638 * need to terminate again. The exchange is already 3635 * need to terminate again. The exchange is already
3639 * cleaned up/freed at FW level. Just cleanup at driver 3636 * cleaned up/freed at FW level. Just cleanup at driver
3640 * level. 3637 * level.
3641 */ 3638 */
3642 if ((cmd->state != QLA_TGT_STATE_NEED_DATA) && 3639 if ((cmd->state != QLA_TGT_STATE_NEED_DATA) &&
3643 (cmd->state != QLA_TGT_STATE_ABORTED)) { 3640 (!cmd->aborted)) {
3644 cmd->cmd_flags |= BIT_13; 3641 cmd->cmd_flags |= BIT_13;
3645 if (qlt_term_ctio_exchange(vha, ctio, cmd, status)) 3642 if (qlt_term_ctio_exchange(vha, ctio, cmd, status))
3646 return; 3643 return;
@@ -3658,7 +3655,7 @@ skip_term:
3658 3655
3659 ha->tgt.tgt_ops->handle_data(cmd); 3656 ha->tgt.tgt_ops->handle_data(cmd);
3660 return; 3657 return;
3661 } else if (cmd->state == QLA_TGT_STATE_ABORTED) { 3658 } else if (cmd->aborted) {
3662 cmd->cmd_flags |= BIT_18; 3659 cmd->cmd_flags |= BIT_18;
3663 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf01e, 3660 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf01e,
3664 "Aborted command %p (tag %lld) finished\n", cmd, se_cmd->tag); 3661 "Aborted command %p (tag %lld) finished\n", cmd, se_cmd->tag);
@@ -3670,7 +3667,7 @@ skip_term:
3670 } 3667 }
3671 3668
3672 if (unlikely(status != CTIO_SUCCESS) && 3669 if (unlikely(status != CTIO_SUCCESS) &&
3673 (cmd->state != QLA_TGT_STATE_ABORTED)) { 3670 !cmd->aborted) {
3674 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf01f, "Finishing failed CTIO\n"); 3671 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf01f, "Finishing failed CTIO\n");
3675 dump_stack(); 3672 dump_stack();
3676 } 3673 }
@@ -3732,7 +3729,7 @@ static void __qlt_do_work(struct qla_tgt_cmd *cmd)
3732 if (tgt->tgt_stop) 3729 if (tgt->tgt_stop)
3733 goto out_term; 3730 goto out_term;
3734 3731
3735 if (cmd->state == QLA_TGT_STATE_ABORTED) { 3732 if (cmd->aborted) {
3736 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf082, 3733 ql_dbg(ql_dbg_tgt_mgt, vha, 0xf082,
3737 "cmd with tag %u is aborted\n", 3734 "cmd with tag %u is aborted\n",
3738 cmd->atio.u.isp24.exchange_addr); 3735 cmd->atio.u.isp24.exchange_addr);
@@ -4290,7 +4287,7 @@ static int abort_cmds_for_s_id(struct scsi_qla_host *vha, port_id_t *s_id)
4290 list_for_each_entry(cmd, &vha->qla_cmd_list, cmd_list) { 4287 list_for_each_entry(cmd, &vha->qla_cmd_list, cmd_list) {
4291 uint32_t cmd_key = sid_to_key(cmd->atio.u.isp24.fcp_hdr.s_id); 4288 uint32_t cmd_key = sid_to_key(cmd->atio.u.isp24.fcp_hdr.s_id);
4292 if (cmd_key == key) { 4289 if (cmd_key == key) {
4293 cmd->state = QLA_TGT_STATE_ABORTED; 4290 cmd->aborted = 1;
4294 count++; 4291 count++;
4295 } 4292 }
4296 } 4293 }
diff --git a/drivers/scsi/qla2xxx/qla_target.h b/drivers/scsi/qla2xxx/qla_target.h
index 0a7854568f97..f5dbeabefcb7 100644
--- a/drivers/scsi/qla2xxx/qla_target.h
+++ b/drivers/scsi/qla2xxx/qla_target.h
@@ -787,7 +787,7 @@ int qla2x00_wait_for_hba_online(struct scsi_qla_host *);
787#define QLA_TGT_STATE_NEED_DATA 1 /* target needs data to continue */ 787#define QLA_TGT_STATE_NEED_DATA 1 /* target needs data to continue */
788#define QLA_TGT_STATE_DATA_IN 2 /* Data arrived + target processing */ 788#define QLA_TGT_STATE_DATA_IN 2 /* Data arrived + target processing */
789#define QLA_TGT_STATE_PROCESSED 3 /* target done processing */ 789#define QLA_TGT_STATE_PROCESSED 3 /* target done processing */
790#define QLA_TGT_STATE_ABORTED 4 /* Command aborted */ 790
791 791
792/* Special handles */ 792/* Special handles */
793#define QLA_TGT_NULL_HANDLE 0 793#define QLA_TGT_NULL_HANDLE 0
@@ -960,6 +960,7 @@ struct qla_tgt_cmd {
960 unsigned int term_exchg:1; 960 unsigned int term_exchg:1;
961 unsigned int cmd_sent_to_fw:1; 961 unsigned int cmd_sent_to_fw:1;
962 unsigned int cmd_in_wq:1; 962 unsigned int cmd_in_wq:1;
963 unsigned int aborted:1;
963 964
964 struct scatterlist *sg; /* cmd data buffer SG vector */ 965 struct scatterlist *sg; /* cmd data buffer SG vector */
965 int sg_cnt; /* SG segments count */ 966 int sg_cnt; /* SG segments count */