scsi: fix sense code for EREMOTEIO

SENSE_CODE(LUN_COMM_FAILURE) has an ABORTED COMMAND sense key,
so it results in a retry in Linux.  To ensure that EREMOTEIO
is forwarded to the guest, use a HARDWARE ERROR sense key
instead.  Note that the code before commit d7a84021d was incorrect
because it used HARDWARE_ERROR as a SCSI status, not as a sense
key.

Reported-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2021-03-09 14:56:42 +01:00
parent 26dbec410e
commit dc293f60b0

View File

@ -589,7 +589,7 @@ int scsi_sense_from_errno(int errno_value, SCSISense *sense)
return TASK_SET_FULL; return TASK_SET_FULL;
#ifdef CONFIG_LINUX #ifdef CONFIG_LINUX
/* These errno mapping are specific to Linux. For more information: /* These errno mapping are specific to Linux. For more information:
* - scsi_decide_disposition in drivers/scsi/scsi_error.c * - scsi_check_sense and scsi_decide_disposition in drivers/scsi/scsi_error.c
* - scsi_result_to_blk_status in drivers/scsi/scsi_lib.c * - scsi_result_to_blk_status in drivers/scsi/scsi_lib.c
* - blk_errors[] in block/blk-core.c * - blk_errors[] in block/blk-core.c
*/ */
@ -599,7 +599,7 @@ int scsi_sense_from_errno(int errno_value, SCSISense *sense)
*sense = SENSE_CODE(READ_ERROR); *sense = SENSE_CODE(READ_ERROR);
return CHECK_CONDITION; return CHECK_CONDITION;
case EREMOTEIO: case EREMOTEIO:
*sense = SENSE_CODE(LUN_COMM_FAILURE); *sense = SENSE_CODE(TARGET_FAILURE);
return CHECK_CONDITION; return CHECK_CONDITION;
#endif #endif
case ENOMEDIUM: case ENOMEDIUM: