<br><font size=2 face="sans-serif">The schema changes for this patch look
fairly innocent, and in keeping with how the KVM_DiskResourceAllocationSetting
class has already extended the CIM_RASD superclass with implementation-specific
properties. I also did not find any relevant 'prior art' in the existing
DSP1041 'ResourceAllocationProfile' that would apply here.</font>
<br>
<br><font size=2 face="sans-serif">+1 wrt schema extensions.</font>
<br>
<br><font size=2 face="sans-serif">- G</font>
<br>
<br><font size=2 face="sans-serif">Dr. Gareth S. Bestor<br>
IBM Senior Software Engineer<br>
Systems & Technology Group - Systems Management Standards<br>
971-285-6375 (mobile)<br>
bestor@us.ibm.com</font>
<br>
<br>
<br>
<table width=100%>
<tr>
<td><img src=cid:_1_1A2293F41A229020007A081286257998>
<td width=100%>
<table width=100%>
<tr valign=top>
<td width=100%><font size=2 face="sans-serif"><b>[Libvirt-cim] [PATCH]
Plan9fs (aka 9pfs,        VirtFS) support for
QEMU/KVM environment</b></font></table>
<br>
<table width=100%>
<tr>
<td><font size=2 color=#e26200 face="sans-serif"><b>Deepak C Shetty </b></font>
<td><font size=2 color=#8f8f8f face="sans-serif">to:</font>
<td><font size=2 face="sans-serif">libvirt-cim</font>
<td>
<div align=right><font size=1 face="sans-serif">12/09/11 05:18 AM</font></div></table>
<br>
<table width=100%>
<tr>
<td>
<table width=100%>
<tr>
<td><font size=2 color=#8f8f8f face="sans-serif">Sent by:</font>
<td width=100%><font size=2 color=#e26200 face="sans-serif"><b>libvirt-cim-bounces@redhat.com</b></font></table>
<br><font size=1 face="sans-serif"><b>Please respond to List for discussion
and development of libvirt CIM        </b></font>
<td>
<div align=right></div></table>
<br></table>
<br>
<br>
<hr>
<br>
<br>
<br><tt><font size=2>VirtFS is virtualization aware file system pass-through
which provides the<br>
functionality to share host file system inside the guest. Its supported
in<br>
libvirt via the <filesystem> xml node/tag. This patch introduces
the<br>
filesystem support in KVM_DiskRASD and its associated changes needed to<br>
support VirtFS in libvirt-cim.<br>
<br>
For further details...<br>
Virtfs home page/wiki : </font></tt><a href=http://v9fs.sourceforge.net/><tt><font size=2>http://v9fs.sourceforge.net/<br>
Virtfs setup for QEMU : </font></tt><a href=http://wiki.qemu.org/Documentation/9psetup><tt><font size=2>http://wiki.qemu.org/Documentation/9psetup<br>
Virtfs support in libvirt :<br>
</font></tt><a href=http://libvirt.org/formatdomain.html#elementsFilesystems><tt><font size=2>http://libvirt.org/formatdomain.html#elementsFilesystems<br>
<br>
An example of the <filesystem> node in libvirt, supporting VirtFS...<br>
<filesystem type='mount' accessmode='passthrough'><br>
      <driver type='path'/><br>
      <source dir='/export/to/guest'/><br>
      <target dir='/import/from/host'/><br>
      <readonly/><br>
</filesystem><br>
<br>
Signed-off-by: Deepak C Shetty <deepakcs@linux.vnet.ibm.com><br>
---<br>
<br>
 libxkutil/device_parsing.c              
 |    8 ++++++++<br>
 libxkutil/device_parsing.h              
 |    1 +<br>
 libxkutil/xmlgen.c                
       |   15 +++++++++++++++<br>
 schema/ResourceAllocationSettingData.mof  |    7 +++++--<br>
 src/Virt_RASD.c                
          |    6 ++++++<br>
 src/Virt_RASD.h                
          |    1 +<br>
 src/Virt_VirtualSystemManagementService.c |    8 ++++++++<br>
 7 files changed, 44 insertions(+), 2 deletions(-)<br>
<br>
diff --git a/libxkutil/device_parsing.c b/libxkutil/device_parsing.c<br>
index 371838f..6a09e7d 100644<br>
--- a/libxkutil/device_parsing.c<br>
+++ b/libxkutil/device_parsing.c<br>
@@ -65,6 +65,7 @@ static void cleanup_disk_device(struct disk_device *dev)<br>
         free(dev->source);<br>
         free(dev->virtual_dev);<br>
         free(dev->bus_type);<br>
+        free(dev->access_mode);<br>
 }<br>
 <br>
 static void cleanup_vsi_device(struct vsi_device *dev)<br>
@@ -220,6 +221,8 @@ static int parse_fs_device(xmlNode *dnode, struct virt_device
**vdevs)<br>
                 goto err;<br>
         }<br>
 <br>
+        ddev->access_mode = get_attr_value(dnode,
"accessmode");<br>
+<br>
         for (child = dnode->children; child !=
NULL; child = child->next) {<br>
                 if (XSTREQ(child->name,
"source")) {<br>
                    
    ddev->source = get_attr_value(child, "dir");<br>
@@ -233,6 +236,8 @@ static int parse_fs_device(xmlNode *dnode, struct virt_device
**vdevs)<br>
                    
            CU_DEBUG("No target dir");<br>
                    
            goto err;<br>
                    
    }<br>
+                } else if (XSTREQ(child->name,
"driver")) {<br>
+                    
  ddev->driver_type = get_attr_value(child, "type");<br>
                 }<br>
         }<br>
 <br>
@@ -870,6 +875,7 @@ struct virt_device *virt_device_dup(struct virt_device
*_dev)<br>
                 DUP_FIELD(dev,
_dev, dev.disk.source);<br>
                 DUP_FIELD(dev,
_dev, dev.disk.virtual_dev);<br>
                 DUP_FIELD(dev,
_dev, dev.disk.bus_type);<br>
+                DUP_FIELD(dev,
_dev, dev.disk.access_mode);<br>
                 dev->dev.disk.disk_type
= _dev->dev.disk.disk_type;<br>
                 dev->dev.disk.readonly
= _dev->dev.disk.readonly;<br>
                 dev->dev.disk.shareable
= _dev->dev.disk.shareable;<br>
@@ -1436,6 +1442,8 @@ int disk_type_from_file(const char *path)<br>
                 return DISK_PHY;<br>
         else if (S_ISREG(s.st_mode))<br>
                 return DISK_FILE;<br>
+        else if (S_ISDIR(s.st_mode))<br>
+                return DISK_FS;<br>
         else<br>
                 return DISK_UNKNOWN;<br>
 }<br>
diff --git a/libxkutil/device_parsing.h b/libxkutil/device_parsing.h<br>
index ab104d9..6bed040 100644<br>
--- a/libxkutil/device_parsing.h<br>
+++ b/libxkutil/device_parsing.h<br>
@@ -55,6 +55,7 @@ struct disk_device {<br>
         bool shareable;<br>
         char *bus_type;<br>
         char *cache;<br>
+        char *access_mode; /* access modes for DISK_FS
(filesystem) type */<br>
 };<br>
 <br>
 struct net_device {<br>
diff --git a/libxkutil/xmlgen.c b/libxkutil/xmlgen.c<br>
index 4cca75b..44a6158 100644<br>
--- a/libxkutil/xmlgen.c<br>
+++ b/libxkutil/xmlgen.c<br>
@@ -152,6 +152,21 @@ static const char *disk_fs_xml(xmlNodePtr root, struct
disk_device *dev)<br>
         if (fs == NULL)<br>
                 return XML_ERROR;<br>
 <br>
+        /* filesystem prop 'type' not needed to be
generated, as it defaults<br>
+         to 'mount' in libvirt, the only supported
value for now. */<br>
+<br>
+        /* filesystem prop 'accessmode' defaults to
'passthrough' in libvirt.<br>
+         So generate here if specified by user, else
leave it to libvirt. */<br>
+<br>
+        if (dev->access_mode) {<br>
+                xmlNewProp(fs,
BAD_CAST "accessmode", BAD_CAST dev->access_mode);<br>
+        }<br>
+<br>
+        if(dev->driver_type) {<br>
+                tmp = xmlNewChild(fs,
NULL, BAD_CAST "driver", NULL);<br>
+                xmlNewProp(tmp,
BAD_CAST "type", BAD_CAST dev->driver_type);<br>
+        }<br>
+<br>
         tmp = xmlNewChild(fs, NULL, BAD_CAST "source",
NULL);<br>
         if (tmp == NULL)<br>
                 return XML_ERROR;<br>
diff --git a/schema/ResourceAllocationSettingData.mof b/schema/ResourceAllocationSettingData.mof<br>
index 3da503d..108dff7 100644<br>
--- a/schema/ResourceAllocationSettingData.mof<br>
+++ b/schema/ResourceAllocationSettingData.mof<br>
@@ -40,8 +40,8 @@ class KVM_DiskResourceAllocationSettingData : KVM_ResourceAllocationSettingData<br>
       string VirtualDevice;<br>
 <br>
       [Description ("Device emulation type"),<br>
-        ValueMap {"0", "1", "2"},<br>
-        Values {"Disk", "CDROM",
"floppy"}]<br>
+        ValueMap {"0", "1", "2",
"3"},<br>
+        Values {"Disk", "CDROM",
"floppy", "filesystem"}]<br>
       uint16 EmulatedType;<br>
 <br>
       [Description ("Bus type of the device")]<br>
@@ -58,6 +58,9 @@ class KVM_DiskResourceAllocationSettingData : KVM_ResourceAllocationSettingData<br>
 <br>
       [Description ("cache setting for device")]<br>
       string DriverCache;<br>
+      <br>
+      [Description ("filesystem access mode")]<br>
+      string AccessMode;<br>
 };<br>
 <br>
 [Description ("LXC virtual disk configuration"),<br>
diff --git a/src/Virt_RASD.c b/src/Virt_RASD.c<br>
index 9305c8d..29bf10d 100644<br>
--- a/src/Virt_RASD.c<br>
+++ b/src/Virt_RASD.c<br>
@@ -397,6 +397,12 @@ static CMPIStatus set_disk_rasd_params(const CMPIBroker
*broker,<br>
                    
          (CMPIValue *)dev->dev.disk.cache,<br>
                    
          CMPI_chars);<br>
 <br>
+        if(dev->dev.disk.access_mode)<br>
+                CMSetProperty(inst,<br>
+                    
         "AccessMode",<br>
+                    
         (CMPIValue *)dev->dev.disk.access_mode,<br>
+                    
         CMPI_chars);<br>
+<br>
         virStoragePoolFree(pool);<br>
         virStorageVolFree(vol);<br>
         virConnectClose(conn);<br>
diff --git a/src/Virt_RASD.h b/src/Virt_RASD.h<br>
index 550543a..cef4224 100644<br>
--- a/src/Virt_RASD.h<br>
+++ b/src/Virt_RASD.h<br>
@@ -26,6 +26,7 @@<br>
 #define VIRT_DISK_TYPE_DISK  0<br>
 #define VIRT_DISK_TYPE_CDROM 1<br>
 #define VIRT_DISK_TYPE_FLOPPY 2<br>
+#define VIRT_DISK_TYPE_FS 3<br>
 <br>
 char *rasd_to_xml(CMPIInstance *rasd);<br>
 <br>
diff --git a/src/Virt_VirtualSystemManagementService.c b/src/Virt_VirtualSystemManagementService.c<br>
index 21979c3..3cdca86 100644<br>
--- a/src/Virt_VirtualSystemManagementService.c<br>
+++ b/src/Virt_VirtualSystemManagementService.c<br>
@@ -1022,6 +1022,8 @@ static const char *disk_rasd_to_vdev(CMPIInstance
*inst,<br>
         }<br>
         else if (type == VIRT_DISK_TYPE_FLOPPY)<br>
                 dev->dev.disk.device
= strdup("floppy");<br>
+        else if (type == VIRT_DISK_TYPE_FS) <br>
+                dev->dev.disk.device
= strdup("filesystem");<br>
         else<br>
                 return "Invalid
value for EmulatedType";<br>
         <br>
@@ -1056,6 +1058,12 @@ static const char *disk_rasd_to_vdev(CMPIInstance
*inst,<br>
         else <br>
                 dev->dev.disk.cache
= strdup(val);<br>
 <br>
+        free(dev->dev.disk.access_mode);<br>
+        if (cu_get_str_prop(inst, "AccessMode",
&val) != CMPI_RC_OK)<br>
+                dev->dev.disk.access_mode
= NULL;<br>
+        else <br>
+                dev->dev.disk.access_mode
= strdup(val);<br>
+<br>
         free(dev->id);<br>
         dev->id = strdup(dev->dev.disk.virtual_dev);<br>
 <br>
<br>
_______________________________________________<br>
Libvirt-cim mailing list<br>
Libvirt-cim@redhat.com<br>
</font></tt><a href="https://www.redhat.com/mailman/listinfo/libvirt-cim"><tt><font size=2>https://www.redhat.com/mailman/listinfo/libvirt-cim<br>
<br>
</font></tt></a></a></a></a>
<br>