qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH]Optionally change the virtio-block storage class to


From: Dor Laor
Subject: [Qemu-devel] [PATCH]Optionally change the virtio-block storage class to PCI_CLASS_STORAGE_SCSI
Date: Sun, 24 May 2009 18:15:15 +0300
User-agent: Thunderbird 2.0.0.19 (X11/20090105)

Here is a new patch that allows a configurable option to be passed to qemu.
The default will be PCI_CLASS_STORAGE_SCSI. To be able to sustain migration from older
qemu's, a parameter - driver ...,class=128 can be passed.
While it's not the most beautiful piece of code, it aligned with current qemu code.

>From a19863b191e5e32812ddcbd63f88826ff16d2298 Mon Sep 17 00:00:00 2001
From: Dor Laor <address@hidden>
Date: Sun, 24 May 2009 18:01:39 +0300
Subject: [PATCH] Optionally change the virtio-block storage class to 
PCI_CLASS_STORAGE_SCSI

Windows whql tests does not recognizes the virtio device since its storage
class is PCI_CLASS_STORAGE_OTHER.
Changing the default and allow and option to pass the class as
-drive file=...,class=128.

Signed-off-by: Dor Laor <address@hidden>
---
 hw/virtio-blk.c |    7 +++++++
 hw/virtio-pci.c |    6 +++++-
 hw/virtio.h     |    1 +
 sysemu.h        |    2 ++
 vl.c            |   23 ++++++++++++++++++++++-
 5 files changed, 37 insertions(+), 2 deletions(-)

diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c
index 8dd3c7a..7f89e0d 100644
--- a/hw/virtio-blk.c
+++ b/hw/virtio-blk.c
@@ -348,6 +348,13 @@ static int virtio_blk_load(QEMUFile *f, void *opaque, int 
version_id)
     return 0;
 }
 
+int virtio_blk_get_class(DeviceState *dev)
+{
+    VirtIOBlock *s = (VirtIOBlock *)dev;
+
+    return drive_get_class_code(s->bs);
+}
+
 VirtIODevice *virtio_blk_init(DeviceState *dev)
 {
     VirtIOBlock *s;
diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c
index c072423..77d4a54 100644
--- a/hw/virtio-pci.c
+++ b/hw/virtio-pci.c
@@ -14,6 +14,7 @@
  */
 
 #include <inttypes.h>
+#include <sysemu.h>
 
 #include "virtio.h"
 #include "pci.h"
@@ -286,12 +287,15 @@ static void virtio_blk_init_pci(PCIDevice *pci_dev)
 {
     VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
     VirtIODevice *vdev;
+    int class_code;
 
     vdev = virtio_blk_init(&pci_dev->qdev);
+    if ((class_code = virtio_blk_get_class(vdev)) == -1)
+        class_code = PCI_CLASS_STORAGE_SCSI;
     virtio_init_pci(proxy, vdev,
                     PCI_VENDOR_ID_REDHAT_QUMRANET,
                     PCI_DEVICE_ID_VIRTIO_BLOCK,
-                    PCI_CLASS_STORAGE_OTHER,
+                    (uint16_t)class_code,
                     0x00);
 }
 
diff --git a/hw/virtio.h b/hw/virtio.h
index 425727e..fd8b7a7 100644
--- a/hw/virtio.h
+++ b/hw/virtio.h
@@ -151,5 +151,6 @@ VirtIODevice *virtio_blk_init(DeviceState *dev);
 VirtIODevice *virtio_net_init(DeviceState *dev);
 VirtIODevice *virtio_console_init(DeviceState *dev);
 VirtIODevice *virtio_balloon_init(DeviceState *dev);
+int virtio_blk_get_class(DeviceState *dev);
 
 #endif
diff --git a/sysemu.h b/sysemu.h
index 92501ed..659e222 100644
--- a/sysemu.h
+++ b/sysemu.h
@@ -154,6 +154,7 @@ typedef struct DriveInfo {
     BlockDriverState *bdrv;
     BlockInterfaceType type;
     int bus;
+    int class;
     int unit;
     int used;
     int drive_opt_idx;
@@ -174,6 +175,7 @@ extern void drive_uninit(BlockDriverState *bdrv);
 extern void drive_remove(int index);
 extern const char *drive_get_serial(BlockDriverState *bdrv);
 extern BlockInterfaceErrorAction drive_get_onerror(BlockDriverState *bdrv);
+extern int drive_get_class_code(BlockDriverState *bdrv);
 
 BlockDriverState *qdev_init_bdrv(DeviceState *dev, BlockInterfaceType type);
 
diff --git a/vl.c b/vl.c
index 2c1f0e0..5c8ac6f 100644
--- a/vl.c
+++ b/vl.c
@@ -2181,6 +2181,17 @@ BlockInterfaceErrorAction 
drive_get_onerror(BlockDriverState *bdrv)
     return BLOCK_ERR_STOP_ENOSPC;
 }
 
+extern int drive_get_class_code(BlockDriverState *bdrv)
+{
+    int index;
+
+    for (index = 0; index < nb_drives; index++)
+        if (drives_table[index].bdrv == bdrv)
+            return drives_table[index].class;
+
+    return -1;
+}
+
 static void bdrv_format_print(void *opaque, const char *name)
 {
     fprintf(stderr, " %s", name);
@@ -2218,13 +2229,14 @@ int drive_init(struct drive_opt *arg, int snapshot, 
void *opaque)
     int index;
     int cache;
     int bdrv_flags, onerror;
+    int class = -1;
     int drives_table_idx;
     char *str = arg->opt;
     static const char * const params[] = { "bus", "unit", "if", "index",
                                            "cyls", "heads", "secs", "trans",
                                            "media", "snapshot", "file",
                                            "cache", "format", "serial", 
"werror",
-                                           NULL };
+                                           "class", NULL };
 
     if (check_params(params, str) < 0) {
          fprintf(stderr, "qemu: unknown parameter '%s' in '%s'\n",
@@ -2355,6 +2367,14 @@ int drive_init(struct drive_opt *arg, int snapshot, void 
*opaque)
        }
     }
 
+    if (get_param_value(buf, sizeof(buf), "class", str)) {
+        if (type != IF_VIRTIO) {
+            fprintf(stderr, "class is no supported by this format\n");
+            return -1;
+        }
+        class =  strtol(buf, NULL, 0);
+    }
+
     if (get_param_value(buf, sizeof(buf), "media", str)) {
         if (!strcmp(buf, "disk")) {
            media = MEDIA_DISK;
@@ -2502,6 +2522,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void 
*opaque)
     drives_table[drives_table_idx].bus = bus_id;
     drives_table[drives_table_idx].unit = unit_id;
     drives_table[drives_table_idx].onerror = onerror;
+    drives_table[drives_table_idx].class = class;
     drives_table[drives_table_idx].drive_opt_idx = arg - drives_opt;
     strncpy(drives_table[drives_table_idx].serial, serial, sizeof(serial));
     nb_drives++;
-- 
1.5.6.6


reply via email to

[Prev in Thread] Current Thread [Next in Thread]