If the user request handler completed the request with a CHECK CONDITION status, tcmu_handle_completion() copies the command entry sense data into the session request structure sense data. However, the sense data length indicated by the field scsi_sense_length is not set and equal to 0, resulting in the copy being a no-op and failure to propagate the sense data back to the initiator. To fix this, properly set the session command sense data length and also set the session command SCF_TRANSPORT_TASK_SENSE flag to indicate that the command has valid sense data. Signed-off-by: Damien Le Moal <damien.lemoal@xxxxxxx> --- drivers/target/target_core_user.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/target/target_core_user.c b/drivers/target/target_core_user.c index beb5f09..7426b4c 100644 --- a/drivers/target/target_core_user.c +++ b/drivers/target/target_core_user.c @@ -831,7 +831,9 @@ static void tcmu_handle_completion(struct tcmu_cmd *cmd, struct tcmu_cmd_entry * entry->rsp.scsi_status = SAM_STAT_CHECK_CONDITION; } else if (entry->rsp.scsi_status == SAM_STAT_CHECK_CONDITION) { memcpy(se_cmd->sense_buffer, entry->rsp.sense_buffer, - se_cmd->scsi_sense_length); + TRANSPORT_SENSE_BUFFER); + se_cmd->scsi_sense_length = TRANSPORT_SENSE_BUFFER; + se_cmd->se_cmd_flags |= SCF_TRANSPORT_TASK_SENSE; } else if (se_cmd->se_cmd_flags & SCF_BIDI) { /* Get Data-In buffer before clean up */ gather_data_area(udev, cmd, true); -- 2.9.4