summary refs log tree commit diff stats
path: root/util/scsi.c
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/scsi.c
parent5efa3c04483d408a03ff5f018842501a2048a51b (diff)
downloadfocaccia-qemu-a485b23425c755867d6caa6ab590be4e0473e35a.tar.gz
focaccia-qemu-a485b23425c755867d6caa6ab590be4e0473e35a.zip
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/scsi.c')
-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);
+}