Commit ce0f706e authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending

Pull scsi target fixes from Nicholas Bellinger:
 "This includes an important >= v3.6 regression bugfix for active I/O
  shutdown (Roland), some TMR related failure / corner cases fixes for
  long outstanding I/O (Roland), two FCoE target mode fabric fabric role
  fixes (MDR), a fix for an incorrect sense code during LUN
  communication failure (Dr. Hannes), plus a handful of other minor
  fixes.

  There are still some outstanding zero-length control CDB regression
  fixes that need to be addressed for v3.8, that will be coming in a
  follow-up PULL request."

* git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending:
  iscsi-target: Fix CmdSN comparison (use cmd->cmd_sn instead of cmd->stat_sn)
  target: Release se_cmd when LUN lookup fails for TMR
  target: Fix use-after-free in LUN RESET handling
  target: Fix missing CMD_T_ACTIVE bit regression for pending WRITEs
  tcm_fc: Do not report target role when target is not defined
  tcm_fc: Do not indicate retry capability to initiators
  target: Use TCM_NO_SENSE for initialisation
  target: Introduce TCM_NO_SENSE
  target: use correct sense code for LUN communication failure
parents 31db7206 64fe4f4f
...@@ -372,7 +372,7 @@ int iscsit_prepare_cmds_for_realligance(struct iscsi_conn *conn) ...@@ -372,7 +372,7 @@ int iscsit_prepare_cmds_for_realligance(struct iscsi_conn *conn)
* made generic here. * made generic here.
*/ */
if (!(cmd->cmd_flags & ICF_OOO_CMDSN) && !cmd->immediate_cmd && if (!(cmd->cmd_flags & ICF_OOO_CMDSN) && !cmd->immediate_cmd &&
iscsi_sna_gte(cmd->stat_sn, conn->sess->exp_cmd_sn)) { iscsi_sna_gte(cmd->cmd_sn, conn->sess->exp_cmd_sn)) {
list_del(&cmd->i_conn_node); list_del(&cmd->i_conn_node);
spin_unlock_bh(&conn->cmd_lock); spin_unlock_bh(&conn->cmd_lock);
iscsit_free_cmd(cmd); iscsit_free_cmd(cmd);
......
...@@ -212,7 +212,7 @@ target_emulate_set_target_port_groups(struct se_cmd *cmd) ...@@ -212,7 +212,7 @@ target_emulate_set_target_port_groups(struct se_cmd *cmd)
struct t10_alua_tg_pt_gp_member *tg_pt_gp_mem, *l_tg_pt_gp_mem; struct t10_alua_tg_pt_gp_member *tg_pt_gp_mem, *l_tg_pt_gp_mem;
unsigned char *buf; unsigned char *buf;
unsigned char *ptr; unsigned char *ptr;
sense_reason_t rc; sense_reason_t rc = TCM_NO_SENSE;
u32 len = 4; /* Skip over RESERVED area in header */ u32 len = 4; /* Skip over RESERVED area in header */
int alua_access_state, primary = 0; int alua_access_state, primary = 0;
u16 tg_pt_id, rtpi; u16 tg_pt_id, rtpi;
......
...@@ -2053,7 +2053,7 @@ core_scsi3_emulate_pro_register(struct se_cmd *cmd, u64 res_key, u64 sa_res_key, ...@@ -2053,7 +2053,7 @@ core_scsi3_emulate_pro_register(struct se_cmd *cmd, u64 res_key, u64 sa_res_key,
/* Used for APTPL metadata w/ UNREGISTER */ /* Used for APTPL metadata w/ UNREGISTER */
unsigned char *pr_aptpl_buf = NULL; unsigned char *pr_aptpl_buf = NULL;
unsigned char isid_buf[PR_REG_ISID_LEN], *isid_ptr = NULL; unsigned char isid_buf[PR_REG_ISID_LEN], *isid_ptr = NULL;
sense_reason_t ret; sense_reason_t ret = TCM_NO_SENSE;
int pr_holder = 0, type; int pr_holder = 0, type;
if (!se_sess || !se_lun) { if (!se_sess || !se_lun) {
......
...@@ -541,9 +541,6 @@ static void transport_lun_remove_cmd(struct se_cmd *cmd) ...@@ -541,9 +541,6 @@ static void transport_lun_remove_cmd(struct se_cmd *cmd)
void transport_cmd_finish_abort(struct se_cmd *cmd, int remove) void transport_cmd_finish_abort(struct se_cmd *cmd, int remove)
{ {
if (!(cmd->se_cmd_flags & SCF_SCSI_TMR_CDB))
transport_lun_remove_cmd(cmd);
if (transport_cmd_check_stop_to_fabric(cmd)) if (transport_cmd_check_stop_to_fabric(cmd))
return; return;
if (remove) if (remove)
...@@ -1396,6 +1393,8 @@ static void target_complete_tmr_failure(struct work_struct *work) ...@@ -1396,6 +1393,8 @@ static void target_complete_tmr_failure(struct work_struct *work)
se_cmd->se_tmr_req->response = TMR_LUN_DOES_NOT_EXIST; se_cmd->se_tmr_req->response = TMR_LUN_DOES_NOT_EXIST;
se_cmd->se_tfo->queue_tm_rsp(se_cmd); se_cmd->se_tfo->queue_tm_rsp(se_cmd);
transport_cmd_check_stop_to_fabric(se_cmd);
} }
/** /**
...@@ -1688,6 +1687,7 @@ void target_execute_cmd(struct se_cmd *cmd) ...@@ -1688,6 +1687,7 @@ void target_execute_cmd(struct se_cmd *cmd)
} }
cmd->t_state = TRANSPORT_PROCESSING; cmd->t_state = TRANSPORT_PROCESSING;
cmd->transport_state |= CMD_T_ACTIVE;
spin_unlock_irq(&cmd->t_state_lock); spin_unlock_irq(&cmd->t_state_lock);
if (!target_handle_task_attr(cmd)) if (!target_handle_task_attr(cmd))
...@@ -2597,6 +2597,16 @@ transport_send_check_condition_and_sense(struct se_cmd *cmd, ...@@ -2597,6 +2597,16 @@ transport_send_check_condition_and_sense(struct se_cmd *cmd,
* SENSE KEY values from include/scsi/scsi.h * SENSE KEY values from include/scsi/scsi.h
*/ */
switch (reason) { switch (reason) {
case TCM_NO_SENSE:
/* CURRENT ERROR */
buffer[0] = 0x70;
buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10;
/* Not Ready */
buffer[SPC_SENSE_KEY_OFFSET] = NOT_READY;
/* NO ADDITIONAL SENSE INFORMATION */
buffer[SPC_ASC_KEY_OFFSET] = 0;
buffer[SPC_ASCQ_KEY_OFFSET] = 0;
break;
case TCM_NON_EXISTENT_LUN: case TCM_NON_EXISTENT_LUN:
/* CURRENT ERROR */ /* CURRENT ERROR */
buffer[0] = 0x70; buffer[0] = 0x70;
...@@ -2743,7 +2753,7 @@ transport_send_check_condition_and_sense(struct se_cmd *cmd, ...@@ -2743,7 +2753,7 @@ transport_send_check_condition_and_sense(struct se_cmd *cmd,
/* ILLEGAL REQUEST */ /* ILLEGAL REQUEST */
buffer[SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; buffer[SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST;
/* LOGICAL UNIT COMMUNICATION FAILURE */ /* LOGICAL UNIT COMMUNICATION FAILURE */
buffer[SPC_ASC_KEY_OFFSET] = 0x80; buffer[SPC_ASC_KEY_OFFSET] = 0x08;
break; break;
} }
/* /*
...@@ -2804,6 +2814,8 @@ void transport_send_task_abort(struct se_cmd *cmd) ...@@ -2804,6 +2814,8 @@ void transport_send_task_abort(struct se_cmd *cmd)
} }
cmd->scsi_status = SAM_STAT_TASK_ABORTED; cmd->scsi_status = SAM_STAT_TASK_ABORTED;
transport_lun_remove_cmd(cmd);
pr_debug("Setting SAM_STAT_TASK_ABORTED status for CDB: 0x%02x," pr_debug("Setting SAM_STAT_TASK_ABORTED status for CDB: 0x%02x,"
" ITT: 0x%08x\n", cmd->t_task_cdb[0], " ITT: 0x%08x\n", cmd->t_task_cdb[0],
cmd->se_tfo->get_task_tag(cmd)); cmd->se_tfo->get_task_tag(cmd));
......
...@@ -355,11 +355,11 @@ static int ft_prli_locked(struct fc_rport_priv *rdata, u32 spp_len, ...@@ -355,11 +355,11 @@ static int ft_prli_locked(struct fc_rport_priv *rdata, u32 spp_len,
tport = ft_tport_create(rdata->local_port); tport = ft_tport_create(rdata->local_port);
if (!tport) if (!tport)
return 0; /* not a target for this local port */ goto not_target; /* not a target for this local port */
acl = ft_acl_get(tport->tpg, rdata); acl = ft_acl_get(tport->tpg, rdata);
if (!acl) if (!acl)
return 0; goto not_target; /* no target for this remote */
if (!rspp) if (!rspp)
goto fill; goto fill;
...@@ -396,12 +396,18 @@ static int ft_prli_locked(struct fc_rport_priv *rdata, u32 spp_len, ...@@ -396,12 +396,18 @@ static int ft_prli_locked(struct fc_rport_priv *rdata, u32 spp_len,
/* /*
* OR in our service parameters with other provider (initiator), if any. * OR in our service parameters with other provider (initiator), if any.
* TBD XXX - indicate RETRY capability?
*/ */
fill: fill:
fcp_parm = ntohl(spp->spp_params); fcp_parm = ntohl(spp->spp_params);
fcp_parm &= ~FCP_SPPF_RETRY;
spp->spp_params = htonl(fcp_parm | FCP_SPPF_TARG_FCN); spp->spp_params = htonl(fcp_parm | FCP_SPPF_TARG_FCN);
return FC_SPP_RESP_ACK; return FC_SPP_RESP_ACK;
not_target:
fcp_parm = ntohl(spp->spp_params);
fcp_parm &= ~FCP_SPPF_TARG_FCN;
spp->spp_params = htonl(fcp_parm);
return 0;
} }
/** /**
......
...@@ -174,6 +174,7 @@ typedef unsigned __bitwise__ sense_reason_t; ...@@ -174,6 +174,7 @@ typedef unsigned __bitwise__ sense_reason_t;
enum tcm_sense_reason_table { enum tcm_sense_reason_table {
#define R(x) (__force sense_reason_t )(x) #define R(x) (__force sense_reason_t )(x)
TCM_NO_SENSE = R(0x00),
TCM_NON_EXISTENT_LUN = R(0x01), TCM_NON_EXISTENT_LUN = R(0x01),
TCM_UNSUPPORTED_SCSI_OPCODE = R(0x02), TCM_UNSUPPORTED_SCSI_OPCODE = R(0x02),
TCM_INCORRECT_AMOUNT_OF_DATA = R(0x03), TCM_INCORRECT_AMOUNT_OF_DATA = R(0x03),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment