[libvirt] [PATCH] Introduce <driver> under <filesystem> to support open-by-handle.

Harsh Prateek Bora harsh at linux.vnet.ibm.com
Fri Oct 7 11:02:42 UTC 2011


VirtFS allows the user to choose between local/handle for fs driver.
As of now, libvirt hardcode to use local driver only. This patch provides a
solution to allow user to choose between local/handle as fs driver.

Sample:

    <filesystem type='mount'>
      <driver type='handle'/>
      <source dir='/folder/to/share'/>
      <target dir='mount_tag'/>
    </filesystem>

Signed-off-by: Harsh Prateek Bora <harsh at linux.vnet.ibm.com>
---
 docs/schemas/domaincommon.rng |    9 +++++++++
 src/conf/domain_conf.c        |   23 +++++++++++++++++++++++
 src/conf/domain_conf.h        |   10 ++++++++++
 src/qemu/qemu_command.c       |    7 ++++++-
 4 files changed, 48 insertions(+), 1 deletions(-)

diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 492a41d..3a0cb86 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -1025,6 +1025,15 @@
       </choice>
       <optional>
         <ref name="address"/>
+        <element name="driver">
+          <attribute name="type">
+          <choice>
+            <value>local</value>
+            <value>handle</value>
+          </choice>
+          </attribute>
+          <empty/>
+        </element>
         <attribute name="accessmode">
         <choice>
           <value>passthrough</value>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index a537251..04410f2 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -238,6 +238,10 @@ VIR_ENUM_IMPL(virDomainFS, VIR_DOMAIN_FS_TYPE_LAST,
               "file",
               "template")
 
+VIR_ENUM_IMPL(virDomainFSDriverType, VIR_DOMAIN_FS_DRIVER_TYPE_LAST,
+              "local",
+              "handle")
+
 VIR_ENUM_IMPL(virDomainFSAccessMode, VIR_DOMAIN_FS_ACCESSMODE_LAST,
               "passthrough",
               "mapped",
@@ -2828,6 +2832,7 @@ virDomainFSDefParseXML(xmlNodePtr node,
     virDomainFSDefPtr def;
     xmlNodePtr cur;
     char *type = NULL;
+    char *fsdriver = NULL;
     char *source = NULL;
     char *target = NULL;
     char *accessmode = NULL;
@@ -2878,11 +2883,23 @@ virDomainFSDefParseXML(xmlNodePtr node,
                 target = virXMLPropString(cur, "dir");
             } else if (xmlStrEqual(cur->name, BAD_CAST "readonly")) {
                 def->readonly = 1;
+            } else if ((fsdriver == NULL) && (xmlStrEqual(cur->name, BAD_CAST "driver"))) {
+                fsdriver = virXMLPropString(cur, "type");
             }
         }
         cur = cur->next;
     }
 
+    if (fsdriver) {
+        if ((def->fsdriver = virDomainFSDriverTypeTypeFromString(fsdriver)) < 0) {
+            virDomainReportError(VIR_ERR_INTERNAL_ERROR,
+                                 _("unknown fs driver type '%s'"), fsdriver);
+            goto error;
+        }
+    } else {
+        def->fsdriver = VIR_DOMAIN_FS_DRIVER_TYPE_LOCAL;
+    }
+
     if (source == NULL) {
         virDomainReportError(VIR_ERR_NO_SOURCE,
                              target ? "%s" : NULL, target);
@@ -2905,6 +2922,7 @@ virDomainFSDefParseXML(xmlNodePtr node,
 
 cleanup:
     VIR_FREE(type);
+    VIR_FREE(fsdriver);
     VIR_FREE(target);
     VIR_FREE(source);
     VIR_FREE(accessmode);
@@ -9351,6 +9369,7 @@ virDomainFSDefFormat(virBufferPtr buf,
 {
     const char *type = virDomainFSTypeToString(def->type);
     const char *accessmode = virDomainFSAccessModeTypeToString(def->accessmode);
+    const char *fsdriver = virDomainFSDriverTypeTypeToString(def->fsdriver);
 
     if (!type) {
         virDomainReportError(VIR_ERR_INTERNAL_ERROR,
@@ -9369,6 +9388,10 @@ virDomainFSDefFormat(virBufferPtr buf,
                       "    <filesystem type='%s' accessmode='%s'>\n",
                       type, accessmode);
 
+    if (def->fsdriver) {
+        virBufferAsprintf(buf, "      <driver type='%s'/>\n", fsdriver);
+    }
+
     if (def->src) {
         switch (def->type) {
         case VIR_DOMAIN_FS_TYPE_MOUNT:
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index e07fd2f..d42325e 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -368,6 +368,14 @@ enum virDomainFSType {
     VIR_DOMAIN_FS_TYPE_LAST
 };
 
+/* Filesystem driver type */
+enum virDomainFSDriverType {
+    VIR_DOMAIN_FS_DRIVER_TYPE_LOCAL,
+    VIR_DOMAIN_FS_DRIVER_TYPE_HANDLE,
+
+    VIR_DOMAIN_FS_DRIVER_TYPE_LAST
+};
+
 /* Filesystem mount access mode  */
 enum virDomainFSAccessMode {
     VIR_DOMAIN_FS_ACCESSMODE_PASSTHROUGH,
@@ -381,6 +389,7 @@ typedef struct _virDomainFSDef virDomainFSDef;
 typedef virDomainFSDef *virDomainFSDefPtr;
 struct _virDomainFSDef {
     int type;
+    int fsdriver;
     int accessmode;
     char *src;
     char *dst;
@@ -1856,6 +1865,7 @@ VIR_ENUM_DECL(virDomainController)
 VIR_ENUM_DECL(virDomainControllerModelSCSI)
 VIR_ENUM_DECL(virDomainControllerModelUSB)
 VIR_ENUM_DECL(virDomainFS)
+VIR_ENUM_DECL(virDomainFSDriverType)
 VIR_ENUM_DECL(virDomainFSAccessMode)
 VIR_ENUM_DECL(virDomainNet)
 VIR_ENUM_DECL(virDomainNetBackend)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index cf99f89..a989aa7 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -1818,7 +1818,12 @@ char *qemuBuildFSStr(virDomainFSDefPtr fs,
         goto error;
     }
 
-    virBufferAddLit(&opt, "local");
+    if (fs->fsdriver == VIR_DOMAIN_FS_DRIVER_TYPE_LOCAL) {
+        virBufferAddLit(&opt, "local");
+    } else if (fs->fsdriver == VIR_DOMAIN_FS_DRIVER_TYPE_HANDLE) {
+        virBufferAddLit(&opt, "handle");
+    }
+
     if (fs->accessmode == VIR_DOMAIN_FS_ACCESSMODE_MAPPED) {
         virBufferAddLit(&opt, ",security_model=mapped");
     } else if(fs->accessmode == VIR_DOMAIN_FS_ACCESSMODE_PASSTHROUGH) {
-- 
1.7.1.1




More information about the libvir-list mailing list