[Libvirt-cim] [PATCH 1 of 2] Add an EmulatedType field to DiskRASD to select CDROM or Disk

Dan Smith danms at us.ibm.com
Thu Nov 6 21:11:24 UTC 2008


# HG changeset patch
# User Dan Smith <danms at us.ibm.com>
# Date 1226005676 28800
# Node ID 049f0bb012190e680257d00463138391405a5c60
# Parent  9385e61cd401162bef9c44bc11f64ca349a41abf
Add an EmulatedType field to DiskRASD to select CDROM or Disk

This seems like a pretty reasonable way to do this, but comments are welcome.
I had initially planned to have a specific RASD type to represent a CDROM,
but I don't think that makes much sense, and is significantly more complex.
Adding this gives us a way to set and query the CDROM-ness of a disk, and
with the following patch, avoids dropping this qualifier from existing
configurations.

Signed-off-by: Dan Smith <danms at us.ibm.com>

diff -r 9385e61cd401 -r 049f0bb01219 schema/ResourceAllocationSettingData.mof
--- a/schema/ResourceAllocationSettingData.mof	Thu Nov 06 09:24:24 2008 -0800
+++ b/schema/ResourceAllocationSettingData.mof	Thu Nov 06 13:07:56 2008 -0800
@@ -21,6 +21,10 @@
       [Description ("Device as seen by the guest")]
       string VirtualDevice;
 
+      [Description ("Device emulation type"),
+        ValueMap {"0", "1"},
+        Values {"Disk", "CDROM"}]
+      uint16 EmulatedType;
 };
 
 [Description ("KVM virtual disk configuration"),
@@ -32,6 +36,10 @@
       [Description ("Device as seen by the guest")]
       string VirtualDevice;
 
+      [Description ("Device emulation type"),
+        ValueMap {"0", "1"},
+        Values {"Disk", "CDROM"}]
+      uint16 EmulatedType;
 };
 
 [Description ("LXC virtual disk configuration"),
diff -r 9385e61cd401 -r 049f0bb01219 src/Virt_RASD.c
--- a/src/Virt_RASD.c	Thu Nov 06 09:24:24 2008 -0800
+++ b/src/Virt_RASD.c	Thu Nov 06 13:07:56 2008 -0800
@@ -224,6 +224,7 @@
                                        CMPIInstance *inst)
 {
         uint64_t cap = 0;
+        uint16_t type;
         CMPIStatus s = {CMPI_RC_OK, NULL};
 
         get_vol_size(broker, ref, dev->dev.disk.source, &cap);
@@ -243,6 +244,20 @@
                       "Address",
                       (CMPIValue *)dev->dev.disk.source,
                       CMPI_chars);
+
+        /* There's not much we can do here if we don't recognize the type,
+         * so it seems that assuming 'disk' is a reasonable default
+         */
+        if ((dev->dev.disk.device != NULL) &&
+            STREQ(dev->dev.disk.device, "cdrom"))
+                type = VIRT_DISK_TYPE_CDROM;
+        else
+                type = VIRT_DISK_TYPE_DISK;
+
+        CMSetProperty(inst,
+                      "EmulatedType",
+                      (CMPIValue *)&type,
+                      CMPI_uint16);
 
         return s;
 }
diff -r 9385e61cd401 -r 049f0bb01219 src/Virt_RASD.h
--- a/src/Virt_RASD.h	Thu Nov 06 09:24:24 2008 -0800
+++ b/src/Virt_RASD.h	Thu Nov 06 13:07:56 2008 -0800
@@ -22,6 +22,9 @@
 #define __VIRT_RASD_H
 
 #include "device_parsing.h"
+
+#define VIRT_DISK_TYPE_DISK  0
+#define VIRT_DISK_TYPE_CDROM 1
 
 char *rasd_to_xml(CMPIInstance *rasd);
 
diff -r 9385e61cd401 -r 049f0bb01219 src/Virt_VirtualSystemManagementService.c
--- a/src/Virt_VirtualSystemManagementService.c	Thu Nov 06 09:24:24 2008 -0800
+++ b/src/Virt_VirtualSystemManagementService.c	Thu Nov 06 13:07:56 2008 -0800
@@ -402,6 +402,7 @@
                                      struct virt_device *dev)
 {
         const char *val = NULL;
+        uint16_t type;
 
         if (cu_get_str_prop(inst, "VirtualDevice", &val) != CMPI_RC_OK)
                 return "Missing `VirtualDevice' property";
@@ -415,6 +416,16 @@
         free(dev->dev.disk.source);
         dev->dev.disk.source = strdup(val);
         dev->dev.disk.disk_type = disk_type_from_file(val);
+
+        if (cu_get_u16_prop(inst, "EmulatedType", &type) != CMPI_RC_OK)
+                type = VIRT_DISK_TYPE_DISK;
+
+        if (type == VIRT_DISK_TYPE_DISK)
+                dev->dev.disk.device = strdup("disk");
+        else if (type == VIRT_DISK_TYPE_CDROM)
+                dev->dev.disk.device = strdup("cdrom");
+        else
+                return "Invalid value for EmulatedType";
 
         free(dev->id);
         dev->id = strdup(dev->dev.disk.virtual_dev);




More information about the Libvirt-cim mailing list