summaryrefslogtreecommitdiff
path: root/util
diff options
context:
space:
mode:
authorFam Zheng <famz@redhat.com>2017-08-21 22:10:07 +0800
committerPaolo Bonzini <pbonzini@redhat.com>2017-09-19 14:09:11 +0200
commita485b23425c755867d6caa6ab590be4e0473e35a (patch)
treef22197ab32440478a02c7444ec7154cb75e63cf1 /util
parent5efa3c04483d408a03ff5f018842501a2048a51b (diff)
downloadqemu-a485b23425c755867d6caa6ab590be4e0473e35a.tar.gz
scsi: Introduce scsi_sense_buf_to_errno
This recognizes the "fixed" and "descriptor" format sense data, extracts the sense key/asc/ascq fields then converts them to an errno. Signed-off-by: Fam Zheng <famz@redhat.com> Message-Id: <20170821141008.19383-4-famz@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'util')
-rw-r--r--util/scsi.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/util/scsi.c b/util/scsi.c
index 472eb5bea5..472293d59b 100644
--- a/util/scsi.c
+++ b/util/scsi.c
@@ -58,3 +58,33 @@ int scsi_sense_to_errno(int key, int asc, int ascq)
return EIO;
}
}
+
+int scsi_sense_buf_to_errno(const uint8_t *sense, size_t sense_size)
+{
+ int key, asc, ascq;
+ if (sense_size < 1) {
+ return EIO;
+ }
+ switch (sense[0]) {
+ case 0x70: /* Fixed format sense data. */
+ if (sense_size < 14) {
+ return EIO;
+ }
+ key = sense[2] & 0xF;
+ asc = sense[12];
+ ascq = sense[13];
+ break;
+ case 0x72: /* Descriptor format sense data. */
+ if (sense_size < 4) {
+ return EIO;
+ }
+ key = sense[1] & 0xF;
+ asc = sense[2];
+ ascq = sense[3];
+ break;
+ default:
+ return EIO;
+ break;
+ }
+ return scsi_sense_to_errno(key, asc, ascq);
+}