scsi-disk: convert more errno values back to SCSI statuses
Linux has some OS-specific (and sometimes weird) mappings for various SCSI statuses and sense codes. The most important is probably RESERVATION CONFLICT. Add them so that they can be reported back to the guest kernel. Cc: Hannes Reinecke <hare@suse.de> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
b430b51395
commit
3b12a7fd39
@ -461,6 +461,25 @@ static bool scsi_handle_rw_error(SCSIDiskReq *r, int error, bool acct_failed)
|
|||||||
}
|
}
|
||||||
error = scsi_sense_buf_to_errno(r->req.sense, sizeof(r->req.sense));
|
error = scsi_sense_buf_to_errno(r->req.sense, sizeof(r->req.sense));
|
||||||
break;
|
break;
|
||||||
|
#ifdef CONFIG_LINUX
|
||||||
|
/* These errno mapping are specific to Linux. For more information:
|
||||||
|
* - scsi_decide_disposition in drivers/scsi/scsi_error.c
|
||||||
|
* - scsi_result_to_blk_status in drivers/scsi/scsi_lib.c
|
||||||
|
* - blk_errors[] in block/blk-core.c
|
||||||
|
*/
|
||||||
|
case EBADE:
|
||||||
|
/* DID_NEXUS_FAILURE -> BLK_STS_NEXUS. */
|
||||||
|
scsi_req_complete(&r->req, RESERVATION_CONFLICT);
|
||||||
|
break;
|
||||||
|
case ENODATA:
|
||||||
|
/* DID_MEDIUM_ERROR -> BLK_STS_MEDIUM. */
|
||||||
|
scsi_check_condition(r, SENSE_CODE(READ_ERROR));
|
||||||
|
break;
|
||||||
|
case EREMOTEIO:
|
||||||
|
/* DID_TARGET_FAILURE -> BLK_STS_TARGET. */
|
||||||
|
scsi_req_complete(&r->req, HARDWARE_ERROR);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
case ENOMEDIUM:
|
case ENOMEDIUM:
|
||||||
scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
|
scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user