mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 07:13:54 -06:00
scsi: explicitly list guest-recoverable sense codes
It's not really possible to fit all sense codes into errno codes, especially in such a way that sense codes can be properly categorized as either guest-recoverable or host-handled. Create a new function that checks for guest recoverable sense, then scsi_sense_buf_to_errno only needs to be called for host handled sense codes. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
d31347f5ff
commit
bdf9613b7f
3 changed files with 46 additions and 3 deletions
43
scsi/utils.c
43
scsi/utils.c
|
@ -336,6 +336,38 @@ int scsi_convert_sense(uint8_t *in_buf, int in_len,
|
|||
}
|
||||
}
|
||||
|
||||
static bool scsi_sense_is_guest_recoverable(int key, int asc, int ascq)
|
||||
{
|
||||
switch (key) {
|
||||
case NO_SENSE:
|
||||
case RECOVERED_ERROR:
|
||||
case UNIT_ATTENTION:
|
||||
case ABORTED_COMMAND:
|
||||
return true;
|
||||
case NOT_READY:
|
||||
case ILLEGAL_REQUEST:
|
||||
case DATA_PROTECT:
|
||||
/* Parse ASCQ */
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
switch ((asc << 8) | ascq) {
|
||||
case 0x1a00: /* PARAMETER LIST LENGTH ERROR */
|
||||
case 0x2000: /* INVALID OPERATION CODE */
|
||||
case 0x2400: /* INVALID FIELD IN CDB */
|
||||
case 0x2500: /* LOGICAL UNIT NOT SUPPORTED */
|
||||
case 0x2600: /* INVALID FIELD IN PARAMETER LIST */
|
||||
|
||||
case 0x0401: /* NOT READY, IN PROGRESS OF BECOMING READY */
|
||||
case 0x0402: /* NOT READY, INITIALIZING COMMAND REQUIRED */
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
int scsi_sense_to_errno(int key, int asc, int ascq)
|
||||
{
|
||||
switch (key) {
|
||||
|
@ -391,6 +423,17 @@ int scsi_sense_buf_to_errno(const uint8_t *in_buf, size_t in_len)
|
|||
return scsi_sense_to_errno(sense.key, sense.asc, sense.ascq);
|
||||
}
|
||||
|
||||
bool scsi_sense_buf_is_guest_recoverable(const uint8_t *in_buf, size_t in_len)
|
||||
{
|
||||
SCSISense sense;
|
||||
if (in_len < 1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
sense = scsi_parse_sense_buf(in_buf, in_len);
|
||||
return scsi_sense_is_guest_recoverable(sense.key, sense.asc, sense.ascq);
|
||||
}
|
||||
|
||||
const char *scsi_command_name(uint8_t cmd)
|
||||
{
|
||||
static const char *names[] = {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue