This patch introduces new attribute to filesystem element
to support customizable security_model for mount type.
Valid security_model are: passthrough, mapped and none.

Usage:
        <filesystem type='mount' security_model='passthrough'>
        <source dir='/export/to/guest'/>
        <target dir='mount_tag'/>
        </filesystem>

Note: This patch is based on Daniel's patch to support 9pfs.
It shall be applied after applying Daniel's patch to support 9pfs.

Signed-off-by: Harsh Prateek Bora <ha...@linux.vnet.ibm.com>
---
 docs/schemas/domain.rng |    7 +++++++
 src/conf/domain_conf.c  |   30 ++++++++++++++++++++++++++++--
 src/conf/domain_conf.h  |   10 ++++++++++
 src/qemu/qemu_conf.c    |   11 +++++++++--
 4 files changed, 54 insertions(+), 4 deletions(-)

diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng
index ccb8cf3..43a292d 100644
--- a/docs/schemas/domain.rng
+++ b/docs/schemas/domain.rng
@@ -761,6 +761,13 @@
       </choice>
       <optional>
         <ref name="address"/>
+        <attribute name="security_model">
+        <choice>
+          <value>passthrough</value>
+          <value>mapped</value>
+          <value>none</value>
+        </choice>
+        </attribute>
       </optional>
     </element>
   </define>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index e05d5d7..a9881d1 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -161,6 +161,12 @@ VIR_ENUM_IMPL(virDomainFS, VIR_DOMAIN_FS_TYPE_LAST,
               "file",
               "template")
 
+VIR_ENUM_IMPL(virDomainFSSecurityModel, VIR_DOMAIN_FS_SECURITY_LAST,
+              "passthrough",
+              "mapped",
+              "none")
+
+
 VIR_ENUM_IMPL(virDomainNet, VIR_DOMAIN_NET_TYPE_LAST,
               "user",
               "ethernet",
@@ -1847,6 +1853,7 @@ virDomainFSDefParseXML(xmlNodePtr node,
     char *type = NULL;
     char *source = NULL;
     char *target = NULL;
+    char *security_model;
 
     if (VIR_ALLOC(def) < 0) {
         virReportOOMError();
@@ -1864,6 +1871,17 @@ virDomainFSDefParseXML(xmlNodePtr node,
         def->type = VIR_DOMAIN_FS_TYPE_MOUNT;
     }
 
+    security_model = virXMLPropString(node, "security_model");
+    if (security_model) {
+        if ((def->security_model = 
virDomainFSSecurityModelTypeFromString(security_model)) < 0) {
+            virDomainReportError(VIR_ERR_INTERNAL_ERROR,
+                                 _("unknown security model '%s'"), 
security_model);
+            goto error;
+        }
+    } else {
+        def->security_model = VIR_DOMAIN_FS_SECURITY_PASSTHROUGH;
+    }
+
     cur = node->children;
     while (cur != NULL) {
         if (cur->type == XML_ELEMENT_NODE) {
@@ -5602,6 +5620,7 @@ virDomainFSDefFormat(virBufferPtr buf,
                      int flags)
 {
     const char *type = virDomainFSTypeToString(def->type);
+    const char *sec_model = 
virDomainFSSecurityModelTypeToString(def->security_model);
 
     if (!type) {
         virDomainReportError(VIR_ERR_INTERNAL_ERROR,
@@ -5609,9 +5628,16 @@ virDomainFSDefFormat(virBufferPtr buf,
         return -1;
     }
 
+   if (!sec_model) {
+        virDomainReportError(VIR_ERR_INTERNAL_ERROR,
+                             _("unexpected security model %d"), 
def->security_model);
+        return -1;
+    }
+
+
     virBufferVSprintf(buf,
-                      "    <filesystem type='%s'>\n",
-                      type);
+                      "    <filesystem type='%s' security_model='%s'>\n",
+                      type, sec_model);
 
     if (def->src) {
         switch (def->type) {
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 7195c04..6adf027 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -236,10 +236,20 @@ enum virDomainFSType {
     VIR_DOMAIN_FS_TYPE_LAST
 };
 
+/* Filesystem mount security model  */
+enum virDomainFSSecurityModel {
+    VIR_DOMAIN_FS_SECURITY_PASSTHROUGH,
+    VIR_DOMAIN_FS_SECURITY_MAPPED,
+    VIR_DOMAIN_FS_SECURITY_NONE,
+
+    VIR_DOMAIN_FS_SECURITY_LAST
+};
+
 typedef struct _virDomainFSDef virDomainFSDef;
 typedef virDomainFSDef *virDomainFSDefPtr;
 struct _virDomainFSDef {
     int type;
+    int security_model;
     char *src;
     char *dst;
     unsigned int readonly : 1;
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index 18a302a..6b96d2f 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -2014,6 +2014,7 @@ qemuAssignDeviceAliases(virDomainDefPtr def, unsigned 
long long qemuCmdFlags)
         if (virAsprintf(&def->fss[i]->info.alias, "fs%d", i) < 0)
             goto no_memory;
     }
+
     for (i = 0; i < def->nsounds ; i++) {
         if (virAsprintf(&def->sounds[i]->info.alias, "sound%d", i) < 0)
             goto no_memory;
@@ -2783,11 +2784,17 @@ char *qemuBuildFSStr(virDomainFSDefPtr fs,
 
     if (fs->type != VIR_DOMAIN_FS_TYPE_MOUNT) {
         qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                        _("can only passthrough directories"));
+                        _("only supports mount filesystem type"));
         goto error;
     }
 
-    virBufferAddLit(&opt, "local,security_model=passthrough");
+    virBufferAddLit(&opt, "local");
+    if (fs->security_model == VIR_DOMAIN_FS_SECURITY_PASSTHROUGH)
+        virBufferAddLit(&opt, ",security_model=passthrough");
+    else if (fs->security_model == VIR_DOMAIN_FS_SECURITY_MAPPED)
+        virBufferAddLit(&opt, ",security_model=mapped");
+    else if (fs->security_model == VIR_DOMAIN_FS_SECURITY_NONE)
+        virBufferAddLit(&opt, ",security_model=none");
     virBufferVSprintf(&opt, ",id=%s%s", QEMU_FSDEV_HOST_PREFIX, 
fs->info.alias);
     virBufferVSprintf(&opt, ",path=%s", fs->src);
 
-- 
1.7.1.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to