From d9414e36cc8e23f938ce10260c6a2a7e68c72739 Mon Sep 17 00:00:00 2001
From: Xu Wang <gesaint@linux.vnet.ibm.com>
Date: Mon, 3 Mar 2014 09:04:18 +0800
Subject: [PATCH 48/60] Add rawio property support

Add the 'rawio' property to the DiskRASD and parse/save it properly

Once installed on the target system, use:

wbemcli gcd http://root:password@localhost:5988/root/virt:KVM_DiskResourceAllocationSettingData | grep rawio

to determine if property exists in MOF. Using 'wbemcli ei' will determine
whether or not it shows up in the enumarated instance(s) - if there are
any on the system

Signed-off-by: Xu Wang <gesaint@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
 libxkutil/device_parsing.c                | 4 ++++
 libxkutil/device_parsing.h                | 1 +
 libxkutil/xmlgen.c                        | 2 ++
 schema/ResourceAllocationSettingData.mof  | 3 +++
 src/Virt_RASD.c                           | 6 ++++++
 src/Virt_VirtualSystemManagementService.c | 5 +++++
 6 files changed, 21 insertions(+)

diff --git a/libxkutil/device_parsing.c b/libxkutil/device_parsing.c
index c9ae886..6b29a2d 100644
--- a/libxkutil/device_parsing.c
+++ b/libxkutil/device_parsing.c
@@ -92,6 +92,7 @@ static void cleanup_disk_device(struct disk_device *dev)
         free(dev->source);
         free(dev->virtual_dev);
         free(dev->bus_type);
+        free(dev->rawio);
         free(dev->access_mode);
         cleanup_device_address(&dev->address);
 }
@@ -512,6 +513,8 @@ static int parse_block_device(xmlNode *dnode, struct virt_device **vdevs)
         if (ddev->device == NULL)
                 goto err;

+        ddev->rawio = get_attr_value(dnode, "rawio");
+
         for (child = dnode->children; child != NULL; child = child->next) {
                 if (XSTREQ(child->name, "driver")) {
                         ddev->driver = get_attr_value(child, "name");
@@ -1315,6 +1318,7 @@ struct virt_device *virt_device_dup(struct virt_device *_dev)
                 DUP_FIELD(dev, _dev, dev.disk.device);
                 DUP_FIELD(dev, _dev, dev.disk.driver);
                 DUP_FIELD(dev, _dev, dev.disk.driver_type);
+                DUP_FIELD(dev, _dev, dev.disk.rawio);
                 DUP_FIELD(dev, _dev, dev.disk.cache);
                 DUP_FIELD(dev, _dev, dev.disk.source);
                 DUP_FIELD(dev, _dev, dev.disk.virtual_dev);
diff --git a/libxkutil/device_parsing.h b/libxkutil/device_parsing.h
index 92427c1..a8cf7aa 100644
--- a/libxkutil/device_parsing.h
+++ b/libxkutil/device_parsing.h
@@ -56,6 +56,7 @@ struct disk_device {
         char *driver_type;
         char *source;
         char *virtual_dev;
+        char *rawio;
         enum {DISK_UNKNOWN, DISK_PHY, DISK_FILE, DISK_FS} disk_type;
         bool readonly;
         bool shareable;
diff --git a/libxkutil/xmlgen.c b/libxkutil/xmlgen.c
index 931f0c9..2f0f475 100644
--- a/libxkutil/xmlgen.c
+++ b/libxkutil/xmlgen.c
@@ -212,6 +212,8 @@ static char *disk_block_xml(xmlNodePtr root, struct disk_device *dev)
         xmlNewProp(disk, BAD_CAST "type", BAD_CAST "block");
         if (dev->device)
                 xmlNewProp(disk, BAD_CAST "device", BAD_CAST dev->device);
+        if (dev->rawio)
+                xmlNewProp(disk, BAD_CAST "rawio", BAD_CAST dev->rawio);

         if (dev->driver) {
                 tmp = xmlNewChild(disk, NULL, BAD_CAST "driver", NULL);
diff --git a/schema/ResourceAllocationSettingData.mof b/schema/ResourceAllocationSettingData.mof
index bf1fbb6..5228f4b 100644
--- a/schema/ResourceAllocationSettingData.mof
+++ b/schema/ResourceAllocationSettingData.mof
@@ -65,6 +65,9 @@ class KVM_DiskResourceAllocationSettingData : KVM_ResourceAllocationSettingData
       [Description ("filesystem access mode")]
       string AccessMode;

+      [Description ("rawio value of lun device")]
+      string rawio;
+
       [Description ("if device is shareable")]
       boolean shareable;

diff --git a/src/Virt_RASD.c b/src/Virt_RASD.c
index df1e921..0800311 100644
--- a/src/Virt_RASD.c
+++ b/src/Virt_RASD.c
@@ -482,6 +482,12 @@ static CMPIStatus set_disk_rasd_params(const CMPIBroker *broker,
                               (CMPIValue *)dev->dev.disk.access_mode,
                               CMPI_chars);

+        if(dev->dev.disk.rawio)
+                CMSetProperty(inst,
+                              "rawio",
+                              (CMPIValue *)dev->dev.disk.rawio,
+                              CMPI_chars);
+
         if(dev->dev.disk.shareable)
                 CMSetProperty(inst,
                               "shareable",
diff --git a/src/Virt_VirtualSystemManagementService.c b/src/Virt_VirtualSystemManagementService.c
index 3e7785e..a9f7ae0 100644
--- a/src/Virt_VirtualSystemManagementService.c
+++ b/src/Virt_VirtualSystemManagementService.c
@@ -1184,6 +1184,11 @@ static const char *disk_rasd_to_vdev(CMPIInstance *inst,
         else
                 dev->dev.disk.access_mode = strdup(val);

+        if (cu_get_str_prop(inst, "rawio", &val) != CMPI_RC_OK)
+                dev->dev.disk.rawio = NULL;
+        else
+                dev->dev.disk.rawio = strdup(val);
+
         if (cu_get_bool_prop(inst, "shareable", &shareable) != CMPI_RC_OK)
                 dev->dev.disk.shareable = false;
         else
--
2.1.0
