|
@@ -3110,7 +3110,6 @@ static void target_tmr_work(struct work_struct *work)
|
|
|
spin_unlock_irqrestore(&cmd->t_state_lock, flags);
|
|
|
goto check_stop;
|
|
|
}
|
|
|
- cmd->t_state = TRANSPORT_ISTATE_PROCESSING;
|
|
|
spin_unlock_irqrestore(&cmd->t_state_lock, flags);
|
|
|
|
|
|
cmd->se_tfo->queue_tm_rsp(cmd);
|
|
@@ -3123,11 +3122,25 @@ int transport_generic_handle_tmr(
|
|
|
struct se_cmd *cmd)
|
|
|
{
|
|
|
unsigned long flags;
|
|
|
+ bool aborted = false;
|
|
|
|
|
|
spin_lock_irqsave(&cmd->t_state_lock, flags);
|
|
|
- cmd->transport_state |= CMD_T_ACTIVE;
|
|
|
+ if (cmd->transport_state & CMD_T_ABORTED) {
|
|
|
+ aborted = true;
|
|
|
+ } else {
|
|
|
+ cmd->t_state = TRANSPORT_ISTATE_PROCESSING;
|
|
|
+ cmd->transport_state |= CMD_T_ACTIVE;
|
|
|
+ }
|
|
|
spin_unlock_irqrestore(&cmd->t_state_lock, flags);
|
|
|
|
|
|
+ if (aborted) {
|
|
|
+ pr_warn_ratelimited("handle_tmr caught CMD_T_ABORTED TMR %d"
|
|
|
+ "ref_tag: %llu tag: %llu\n", cmd->se_tmr_req->function,
|
|
|
+ cmd->se_tmr_req->ref_task_tag, cmd->tag);
|
|
|
+ transport_cmd_check_stop_to_fabric(cmd);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
INIT_WORK(&cmd->work, target_tmr_work);
|
|
|
queue_work(cmd->se_dev->tmr_wq, &cmd->work);
|
|
|
return 0;
|