diff options
| -rw-r--r-- | drivers/target/iscsi/iscsi_target_erl2.c | 2 | ||||
| -rw-r--r-- | drivers/target/target_core_alua.c | 2 | ||||
| -rw-r--r-- | drivers/target/target_core_pr.c | 2 | ||||
| -rw-r--r-- | drivers/target/target_core_transport.c | 20 | ||||
| -rw-r--r-- | drivers/target/tcm_fc/tfc_sess.c | 12 | ||||
| -rw-r--r-- | include/target/target_core_base.h | 1 |
6 files changed, 29 insertions, 10 deletions
diff --git a/drivers/target/iscsi/iscsi_target_erl2.c b/drivers/target/iscsi/iscsi_target_erl2.c index 9ac4c151eae4..ba6091bf93fc 100644 --- a/drivers/target/iscsi/iscsi_target_erl2.c +++ b/drivers/target/iscsi/iscsi_target_erl2.c | |||
| @@ -372,7 +372,7 @@ int iscsit_prepare_cmds_for_realligance(struct iscsi_conn *conn) | |||
| 372 | * made generic here. | 372 | * made generic here. |
| 373 | */ | 373 | */ |
| 374 | if (!(cmd->cmd_flags & ICF_OOO_CMDSN) && !cmd->immediate_cmd && | 374 | if (!(cmd->cmd_flags & ICF_OOO_CMDSN) && !cmd->immediate_cmd && |
| 375 | iscsi_sna_gte(cmd->stat_sn, conn->sess->exp_cmd_sn)) { | 375 | iscsi_sna_gte(cmd->cmd_sn, conn->sess->exp_cmd_sn)) { |
| 376 | list_del(&cmd->i_conn_node); | 376 | list_del(&cmd->i_conn_node); |
| 377 | spin_unlock_bh(&conn->cmd_lock); | 377 | spin_unlock_bh(&conn->cmd_lock); |
| 378 | iscsit_free_cmd(cmd); | 378 | iscsit_free_cmd(cmd); |
diff --git a/drivers/target/target_core_alua.c b/drivers/target/target_core_alua.c index 85140f7dde1e..7d4ec02e29a9 100644 --- a/drivers/target/target_core_alua.c +++ b/drivers/target/target_core_alua.c | |||
| @@ -212,7 +212,7 @@ target_emulate_set_target_port_groups(struct se_cmd *cmd) | |||
| 212 | struct t10_alua_tg_pt_gp_member *tg_pt_gp_mem, *l_tg_pt_gp_mem; | 212 | struct t10_alua_tg_pt_gp_member *tg_pt_gp_mem, *l_tg_pt_gp_mem; |
| 213 | unsigned char *buf; | 213 | unsigned char *buf; |
| 214 | unsigned char *ptr; | 214 | unsigned char *ptr; |
| 215 | sense_reason_t rc; | 215 | sense_reason_t rc = TCM_NO_SENSE; |
| 216 | u32 len = 4; /* Skip over RESERVED area in header */ | 216 | u32 len = 4; /* Skip over RESERVED area in header */ |
| 217 | int alua_access_state, primary = 0; | 217 | int alua_access_state, primary = 0; |
| 218 | u16 tg_pt_id, rtpi; | 218 | u16 tg_pt_id, rtpi; |
diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c index e35dbf85841f..8e0290b38e43 100644 --- a/drivers/target/target_core_pr.c +++ b/drivers/target/target_core_pr.c | |||
| @@ -2053,7 +2053,7 @@ core_scsi3_emulate_pro_register(struct se_cmd *cmd, u64 res_key, u64 sa_res_key, | |||
| 2053 | /* Used for APTPL metadata w/ UNREGISTER */ | 2053 | /* Used for APTPL metadata w/ UNREGISTER */ |
| 2054 | unsigned char *pr_aptpl_buf = NULL; | 2054 | unsigned char *pr_aptpl_buf = NULL; |
| 2055 | unsigned char isid_buf[PR_REG_ISID_LEN], *isid_ptr = NULL; | 2055 | unsigned char isid_buf[PR_REG_ISID_LEN], *isid_ptr = NULL; |
| 2056 | sense_reason_t ret; | 2056 | sense_reason_t ret = TCM_NO_SENSE; |
| 2057 | int pr_holder = 0, type; | 2057 | int pr_holder = 0, type; |
| 2058 | 2058 | ||
| 2059 | if (!se_sess || !se_lun) { | 2059 | if (!se_sess || !se_lun) { |
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index c23c76ccef65..bd587b70661a 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c | |||
| @@ -541,9 +541,6 @@ static void transport_lun_remove_cmd(struct se_cmd *cmd) | |||
| 541 | 541 | ||
| 542 | void transport_cmd_finish_abort(struct se_cmd *cmd, int remove) | 542 | void transport_cmd_finish_abort(struct se_cmd *cmd, int remove) |
| 543 | { | 543 | { |
| 544 | if (!(cmd->se_cmd_flags & SCF_SCSI_TMR_CDB)) | ||
| 545 | transport_lun_remove_cmd(cmd); | ||
| 546 | |||
| 547 | if (transport_cmd_check_stop_to_fabric(cmd)) | 544 | if (transport_cmd_check_stop_to_fabric(cmd)) |
| 548 | return; | 545 | return; |
| 549 | if (remove) | 546 | if (remove) |
| @@ -1396,6 +1393,8 @@ static void target_complete_tmr_failure(struct work_struct *work) | |||
| 1396 | 1393 | ||
| 1397 | se_cmd->se_tmr_req->response = TMR_LUN_DOES_NOT_EXIST; | 1394 | se_cmd->se_tmr_req->response = TMR_LUN_DOES_NOT_EXIST; |
| 1398 | se_cmd->se_tfo->queue_tm_rsp(se_cmd); | 1395 | se_cmd->se_tfo->queue_tm_rsp(se_cmd); |
| 1396 | |||
| 1397 | transport_cmd_check_stop_to_fabric(se_cmd); | ||
| 1399 | } | 1398 | } |
| 1400 | 1399 | ||
| 1401 | /** | 1400 | /** |
| @@ -1688,6 +1687,7 @@ void target_execute_cmd(struct se_cmd *cmd) | |||
| 1688 | } | 1687 | } |
| 1689 | 1688 | ||
| 1690 | cmd->t_state = TRANSPORT_PROCESSING; | 1689 | cmd->t_state = TRANSPORT_PROCESSING; |
| 1690 | cmd->transport_state |= CMD_T_ACTIVE; | ||
| 1691 | spin_unlock_irq(&cmd->t_state_lock); | 1691 | spin_unlock_irq(&cmd->t_state_lock); |
| 1692 | 1692 | ||
| 1693 | if (!target_handle_task_attr(cmd)) | 1693 | if (!target_handle_task_attr(cmd)) |
| @@ -2597,6 +2597,16 @@ transport_send_check_condition_and_sense(struct se_cmd *cmd, | |||
| 2597 | * SENSE KEY values from include/scsi/scsi.h | 2597 | * SENSE KEY values from include/scsi/scsi.h |
| 2598 | */ | 2598 | */ |
| 2599 | switch (reason) { | 2599 | switch (reason) { |
| 2600 | case TCM_NO_SENSE: | ||
| 2601 | /* CURRENT ERROR */ | ||
| 2602 | buffer[0] = 0x70; | ||
| 2603 | buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; | ||
| 2604 | /* Not Ready */ | ||
| 2605 | buffer[SPC_SENSE_KEY_OFFSET] = NOT_READY; | ||
| 2606 | /* NO ADDITIONAL SENSE INFORMATION */ | ||
| 2607 | buffer[SPC_ASC_KEY_OFFSET] = 0; | ||
| 2608 | buffer[SPC_ASCQ_KEY_OFFSET] = 0; | ||
| 2609 | break; | ||
| 2600 | case TCM_NON_EXISTENT_LUN: | 2610 | case TCM_NON_EXISTENT_LUN: |
| 2601 | /* CURRENT ERROR */ | 2611 | /* CURRENT ERROR */ |
| 2602 | buffer[0] = 0x70; | 2612 | buffer[0] = 0x70; |
| @@ -2743,7 +2753,7 @@ transport_send_check_condition_and_sense(struct se_cmd *cmd, | |||
| 2743 | /* ILLEGAL REQUEST */ | 2753 | /* ILLEGAL REQUEST */ |
| 2744 | buffer[SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; | 2754 | buffer[SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; |
| 2745 | /* LOGICAL UNIT COMMUNICATION FAILURE */ | 2755 | /* LOGICAL UNIT COMMUNICATION FAILURE */ |
| 2746 | buffer[SPC_ASC_KEY_OFFSET] = 0x80; | 2756 | buffer[SPC_ASC_KEY_OFFSET] = 0x08; |
| 2747 | break; | 2757 | break; |
| 2748 | } | 2758 | } |
| 2749 | /* | 2759 | /* |
| @@ -2804,6 +2814,8 @@ void transport_send_task_abort(struct se_cmd *cmd) | |||
| 2804 | } | 2814 | } |
| 2805 | cmd->scsi_status = SAM_STAT_TASK_ABORTED; | 2815 | cmd->scsi_status = SAM_STAT_TASK_ABORTED; |
| 2806 | 2816 | ||
| 2817 | transport_lun_remove_cmd(cmd); | ||
| 2818 | |||
| 2807 | pr_debug("Setting SAM_STAT_TASK_ABORTED status for CDB: 0x%02x," | 2819 | pr_debug("Setting SAM_STAT_TASK_ABORTED status for CDB: 0x%02x," |
| 2808 | " ITT: 0x%08x\n", cmd->t_task_cdb[0], | 2820 | " ITT: 0x%08x\n", cmd->t_task_cdb[0], |
| 2809 | cmd->se_tfo->get_task_tag(cmd)); | 2821 | cmd->se_tfo->get_task_tag(cmd)); |
diff --git a/drivers/target/tcm_fc/tfc_sess.c b/drivers/target/tcm_fc/tfc_sess.c index 12d6fa21e5e1..6659dd36e806 100644 --- a/drivers/target/tcm_fc/tfc_sess.c +++ b/drivers/target/tcm_fc/tfc_sess.c | |||
| @@ -355,11 +355,11 @@ static int ft_prli_locked(struct fc_rport_priv *rdata, u32 spp_len, | |||
| 355 | 355 | ||
| 356 | tport = ft_tport_create(rdata->local_port); | 356 | tport = ft_tport_create(rdata->local_port); |
| 357 | if (!tport) | 357 | if (!tport) |
| 358 | return 0; /* not a target for this local port */ | 358 | goto not_target; /* not a target for this local port */ |
| 359 | 359 | ||
| 360 | acl = ft_acl_get(tport->tpg, rdata); | 360 | acl = ft_acl_get(tport->tpg, rdata); |
| 361 | if (!acl) | 361 | if (!acl) |
| 362 | return 0; | 362 | goto not_target; /* no target for this remote */ |
| 363 | 363 | ||
| 364 | if (!rspp) | 364 | if (!rspp) |
| 365 | goto fill; | 365 | goto fill; |
| @@ -396,12 +396,18 @@ static int ft_prli_locked(struct fc_rport_priv *rdata, u32 spp_len, | |||
| 396 | 396 | ||
| 397 | /* | 397 | /* |
| 398 | * OR in our service parameters with other provider (initiator), if any. | 398 | * OR in our service parameters with other provider (initiator), if any. |
| 399 | * TBD XXX - indicate RETRY capability? | ||
| 400 | */ | 399 | */ |
| 401 | fill: | 400 | fill: |
| 402 | fcp_parm = ntohl(spp->spp_params); | 401 | fcp_parm = ntohl(spp->spp_params); |
| 402 | fcp_parm &= ~FCP_SPPF_RETRY; | ||
| 403 | spp->spp_params = htonl(fcp_parm | FCP_SPPF_TARG_FCN); | 403 | spp->spp_params = htonl(fcp_parm | FCP_SPPF_TARG_FCN); |
| 404 | return FC_SPP_RESP_ACK; | 404 | return FC_SPP_RESP_ACK; |
| 405 | |||
| 406 | not_target: | ||
| 407 | fcp_parm = ntohl(spp->spp_params); | ||
| 408 | fcp_parm &= ~FCP_SPPF_TARG_FCN; | ||
| 409 | spp->spp_params = htonl(fcp_parm); | ||
| 410 | return 0; | ||
| 405 | } | 411 | } |
| 406 | 412 | ||
| 407 | /** | 413 | /** |
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h index 7cae2360221e..663e34a5383f 100644 --- a/include/target/target_core_base.h +++ b/include/target/target_core_base.h | |||
| @@ -174,6 +174,7 @@ typedef unsigned __bitwise__ sense_reason_t; | |||
| 174 | 174 | ||
| 175 | enum tcm_sense_reason_table { | 175 | enum tcm_sense_reason_table { |
| 176 | #define R(x) (__force sense_reason_t )(x) | 176 | #define R(x) (__force sense_reason_t )(x) |
| 177 | TCM_NO_SENSE = R(0x00), | ||
| 177 | TCM_NON_EXISTENT_LUN = R(0x01), | 178 | TCM_NON_EXISTENT_LUN = R(0x01), |
| 178 | TCM_UNSUPPORTED_SCSI_OPCODE = R(0x02), | 179 | TCM_UNSUPPORTED_SCSI_OPCODE = R(0x02), |
| 179 | TCM_INCORRECT_AMOUNT_OF_DATA = R(0x03), | 180 | TCM_INCORRECT_AMOUNT_OF_DATA = R(0x03), |
