|
@@ -1997,6 +1997,9 @@ static void transport_complete_qf(struct se_cmd *cmd)
|
|
|
|
|
|
switch (cmd->data_direction) {
|
|
|
case DMA_FROM_DEVICE:
|
|
|
+ if (cmd->scsi_status)
|
|
|
+ goto queue_status;
|
|
|
+
|
|
|
trace_target_cmd_complete(cmd);
|
|
|
ret = cmd->se_tfo->queue_data_in(cmd);
|
|
|
break;
|
|
@@ -2007,6 +2010,7 @@ static void transport_complete_qf(struct se_cmd *cmd)
|
|
|
}
|
|
|
/* Fall through for DMA_TO_DEVICE */
|
|
|
case DMA_NONE:
|
|
|
+queue_status:
|
|
|
trace_target_cmd_complete(cmd);
|
|
|
ret = cmd->se_tfo->queue_status(cmd);
|
|
|
break;
|
|
@@ -2128,6 +2132,9 @@ static void target_complete_ok_work(struct work_struct *work)
|
|
|
queue_rsp:
|
|
|
switch (cmd->data_direction) {
|
|
|
case DMA_FROM_DEVICE:
|
|
|
+ if (cmd->scsi_status)
|
|
|
+ goto queue_status;
|
|
|
+
|
|
|
atomic_long_add(cmd->data_length,
|
|
|
&cmd->se_lun->lun_stats.tx_data_octets);
|
|
|
/*
|
|
@@ -2167,6 +2174,7 @@ queue_rsp:
|
|
|
}
|
|
|
/* Fall through for DMA_TO_DEVICE */
|
|
|
case DMA_NONE:
|
|
|
+queue_status:
|
|
|
trace_target_cmd_complete(cmd);
|
|
|
ret = cmd->se_tfo->queue_status(cmd);
|
|
|
if (ret == -EAGAIN || ret == -ENOMEM)
|