orion / rpms / qemu

Forked from rpms/qemu 4 years ago
Clone
0fb2b27
From: Fam Zheng <famz@redhat.com>
0fb2b27
Date: Mon, 21 Aug 2017 22:10:05 +0800
59eb7ad
Subject: [PATCH] scsi: Refactor scsi sense interpreting code
0fb2b27
0fb2b27
So that it can be reused outside of iscsi.c.
0fb2b27
0fb2b27
Also update MAINTAINERS to include the new files in SCSI section.
0fb2b27
0fb2b27
Signed-off-by: Fam Zheng <famz@redhat.com>
0fb2b27
Message-Id: <20170821141008.19383-2-famz@redhat.com>
0fb2b27
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
0fb2b27
---
0fb2b27
 MAINTAINERS         |  2 ++
0fb2b27
 block/iscsi.c       | 45 ++++-----------------------------------------
0fb2b27
 include/scsi/scsi.h | 19 +++++++++++++++++++
0fb2b27
 util/Makefile.objs  |  1 +
0fb2b27
 util/scsi.c         | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
0fb2b27
 5 files changed, 78 insertions(+), 41 deletions(-)
0fb2b27
 create mode 100644 include/scsi/scsi.h
0fb2b27
 create mode 100644 util/scsi.c
0fb2b27
0fb2b27
diff --git a/MAINTAINERS b/MAINTAINERS
0fb2b27
index ccee28b12d..2a4e5036ae 100644
0fb2b27
--- a/MAINTAINERS
0fb2b27
+++ b/MAINTAINERS
0fb2b27
@@ -969,7 +969,9 @@ SCSI
0fb2b27
 M: Paolo Bonzini <pbonzini@redhat.com>
0fb2b27
 S: Supported
0fb2b27
 F: include/hw/scsi/*
0fb2b27
+F: include/scsi/*
0fb2b27
 F: hw/scsi/*
0fb2b27
+F: util/scsi*
0fb2b27
 F: tests/virtio-scsi-test.c
0fb2b27
 T: git git://github.com/bonzini/qemu.git scsi-next
0fb2b27
 
0fb2b27
diff --git a/block/iscsi.c b/block/iscsi.c
0fb2b27
index d557c99668..4bed63cd6d 100644
0fb2b27
--- a/block/iscsi.c
0fb2b27
+++ b/block/iscsi.c
0fb2b27
@@ -40,6 +40,7 @@
0fb2b27
 #include "qmp-commands.h"
0fb2b27
 #include "qapi/qmp/qstring.h"
0fb2b27
 #include "crypto/secret.h"
0fb2b27
+#include "scsi/scsi.h"
0fb2b27
 
0fb2b27
 #include <iscsi/iscsi.h>
0fb2b27
 #include <iscsi/scsi-lowlevel.h>
0fb2b27
@@ -209,47 +210,9 @@ static inline unsigned exp_random(double mean)
0fb2b27
 
0fb2b27
 static int iscsi_translate_sense(struct scsi_sense *sense)
0fb2b27
 {
0fb2b27
-    int ret;
0fb2b27
-
0fb2b27
-    switch (sense->key) {
0fb2b27
-    case SCSI_SENSE_NOT_READY:
0fb2b27
-        return -EBUSY;
0fb2b27
-    case SCSI_SENSE_DATA_PROTECTION:
0fb2b27
-        return -EACCES;
0fb2b27
-    case SCSI_SENSE_COMMAND_ABORTED:
0fb2b27
-        return -ECANCELED;
0fb2b27
-    case SCSI_SENSE_ILLEGAL_REQUEST:
0fb2b27
-        /* Parse ASCQ */
0fb2b27
-        break;
0fb2b27
-    default:
0fb2b27
-        return -EIO;
0fb2b27
-    }
0fb2b27
-    switch (sense->ascq) {
0fb2b27
-    case SCSI_SENSE_ASCQ_PARAMETER_LIST_LENGTH_ERROR:
0fb2b27
-    case SCSI_SENSE_ASCQ_INVALID_OPERATION_CODE:
0fb2b27
-    case SCSI_SENSE_ASCQ_INVALID_FIELD_IN_CDB:
0fb2b27
-    case SCSI_SENSE_ASCQ_INVALID_FIELD_IN_PARAMETER_LIST:
0fb2b27
-        ret = -EINVAL;
0fb2b27
-        break;
0fb2b27
-    case SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE:
0fb2b27
-        ret = -ENOSPC;
0fb2b27
-        break;
0fb2b27
-    case SCSI_SENSE_ASCQ_LOGICAL_UNIT_NOT_SUPPORTED:
0fb2b27
-        ret = -ENOTSUP;
0fb2b27
-        break;
0fb2b27
-    case SCSI_SENSE_ASCQ_MEDIUM_NOT_PRESENT:
0fb2b27
-    case SCSI_SENSE_ASCQ_MEDIUM_NOT_PRESENT_TRAY_CLOSED:
0fb2b27
-    case SCSI_SENSE_ASCQ_MEDIUM_NOT_PRESENT_TRAY_OPEN:
0fb2b27
-        ret = -ENOMEDIUM;
0fb2b27
-        break;
0fb2b27
-    case SCSI_SENSE_ASCQ_WRITE_PROTECTED:
0fb2b27
-        ret = -EACCES;
0fb2b27
-        break;
0fb2b27
-    default:
0fb2b27
-        ret = -EIO;
0fb2b27
-        break;
0fb2b27
-    }
0fb2b27
-    return ret;
0fb2b27
+    return - scsi_sense_to_errno(sense->key,
0fb2b27
+                                 (sense->ascq & 0xFF00) >> 8,
0fb2b27
+                                 sense->ascq & 0xFF);
0fb2b27
 }
0fb2b27
 
0fb2b27
 /* Called (via iscsi_service) with QemuMutex held.  */
0fb2b27
diff --git a/include/scsi/scsi.h b/include/scsi/scsi.h
0fb2b27
new file mode 100644
0fb2b27
index 0000000000..f894ace4bf
0fb2b27
--- /dev/null
0fb2b27
+++ b/include/scsi/scsi.h
0fb2b27
@@ -0,0 +1,19 @@
0fb2b27
+/*
0fb2b27
+ *  SCSI helpers
0fb2b27
+ *
0fb2b27
+ *  Copyright 2017 Red Hat, Inc.
0fb2b27
+ *
0fb2b27
+ *  Authors:
0fb2b27
+ *   Fam Zheng <famz@redhat.com>
0fb2b27
+ *
0fb2b27
+ * This program is free software; you can redistribute it and/or modify it
0fb2b27
+ * under the terms of the GNU General Public License as published by the Free
0fb2b27
+ * Software Foundation; either version 2 of the License, or (at your option)
0fb2b27
+ * any later version.
0fb2b27
+ */
0fb2b27
+#ifndef QEMU_SCSI_H
0fb2b27
+#define QEMU_SCSI_H
0fb2b27
+
0fb2b27
+int scsi_sense_to_errno(int key, int asc, int ascq);
0fb2b27
+
0fb2b27
+#endif
0fb2b27
diff --git a/util/Makefile.objs b/util/Makefile.objs
0fb2b27
index 50a55ecc75..c9e6c493d3 100644
0fb2b27
--- a/util/Makefile.objs
0fb2b27
+++ b/util/Makefile.objs
0fb2b27
@@ -45,3 +45,4 @@ util-obj-y += qht.o
0fb2b27
 util-obj-y += range.o
0fb2b27
 util-obj-y += stats64.o
0fb2b27
 util-obj-y += systemd.o
0fb2b27
+util-obj-y += scsi.o
0fb2b27
diff --git a/util/scsi.c b/util/scsi.c
0fb2b27
new file mode 100644
0fb2b27
index 0000000000..a6710799fc
0fb2b27
--- /dev/null
0fb2b27
+++ b/util/scsi.c
0fb2b27
@@ -0,0 +1,52 @@
0fb2b27
+/*
0fb2b27
+ *  SCSI helpers
0fb2b27
+ *
0fb2b27
+ *  Copyright 2017 Red Hat, Inc.
0fb2b27
+ *
0fb2b27
+ *  Authors:
0fb2b27
+ *   Fam Zheng <famz@redhat.com>
0fb2b27
+ *
0fb2b27
+ * This program is free software; you can redistribute it and/or modify it
0fb2b27
+ * under the terms of the GNU General Public License as published by the Free
0fb2b27
+ * Software Foundation; either version 2 of the License, or (at your option)
0fb2b27
+ * any later version.
0fb2b27
+ */
0fb2b27
+
0fb2b27
+#include "qemu/osdep.h"
0fb2b27
+#include "scsi/scsi.h"
0fb2b27
+
0fb2b27
+int scsi_sense_to_errno(int key, int asc, int ascq)
0fb2b27
+{
0fb2b27
+    switch (key) {
0fb2b27
+    case 0x02: /* NOT READY */
0fb2b27
+        return EBUSY;
0fb2b27
+    case 0x07: /* DATA PROTECTION */
0fb2b27
+        return EACCES;
0fb2b27
+    case 0x0b: /* COMMAND ABORTED */
0fb2b27
+        return ECANCELED;
0fb2b27
+    case 0x05: /* ILLEGAL REQUEST */
0fb2b27
+        /* Parse ASCQ */
0fb2b27
+        break;
0fb2b27
+    default:
0fb2b27
+        return EIO;
0fb2b27
+    }
0fb2b27
+    switch ((asc << 8) | ascq) {
0fb2b27
+    case 0x1a00: /* PARAMETER LIST LENGTH ERROR */
0fb2b27
+    case 0x2000: /* INVALID OPERATION CODE */
0fb2b27
+    case 0x2400: /* INVALID FIELD IN CDB */
0fb2b27
+    case 0x2600: /* INVALID FIELD IN PARAMETER LIST */
0fb2b27
+        return EINVAL;
0fb2b27
+    case 0x2100: /* LBA OUT OF RANGE */
0fb2b27
+        return ENOSPC;
0fb2b27
+    case 0x2500: /* LOGICAL UNIT NOT SUPPORTED */
0fb2b27
+        return ENOTSUP;
0fb2b27
+    case 0x3a00: /* MEDIUM NOT PRESENT */
0fb2b27
+    case 0x3a01: /* MEDIUM NOT PRESENT TRAY CLOSED */
0fb2b27
+    case 0x3a02: /* MEDIUM NOT PRESENT TRAY OPEN */
0fb2b27
+        return ENOMEDIUM;
0fb2b27
+    case 0x2700: /* WRITE PROTECTED */
0fb2b27
+        return EACCES;
0fb2b27
+    default:
0fb2b27
+        return EIO;
0fb2b27
+    }
0fb2b27
+}