diff options
author | Quinn Tran <quinn.tran@qlogic.com> | 2015-12-17 14:57:03 -0500 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2016-01-07 16:57:45 -0500 |
commit | 193b50b9d54a4fcb723a8005b29d8dd5518e3ae2 (patch) | |
tree | 47fea09224a9449bf9b6bb6182e6bb0172c517ab | |
parent | b7bd104e6f1c3be2bf881dc1ca7db40da3ee65fd (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.c | 23 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_target.h | 3 |
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 | ||
3177 | done: | 3177 | done: |
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 */ |