]> xenbits.xensource.com Git - libvirt.git/commitdiff
Add support for storage format in FS <driver>
authorDaniel P. Berrange <berrange@redhat.com>
Mon, 22 Apr 2013 14:06:14 +0000 (15:06 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Mon, 13 May 2013 12:15:19 +0000 (13:15 +0100)
Extend the <driver> element in filesystem devices to
allow a storage format to be set. The new attribute
uses 'format' to reflect the storage format. This is
different from the <driver> element in disk devices
which use 'type' to reflect the storage format. This
is because the 'type' attribute on filesystem devices
is already used for the driver backend, for which the
disk devices use the 'name' attribute. Arggggh.

Anyway for disks we have

   <driver name="qemu" type="raw"/>

And for filesystems this change means we now have

   <driver type="loop" format="raw"/>

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
docs/formatdomain.html.in
docs/schemas/domaincommon.rng
docs/schemas/domainsnapshot.rng
src/conf/domain_conf.c
src/conf/domain_conf.h
src/qemu/qemu_command.c
tests/lxcxml2xmldata/lxc-disk-formats.xml [new file with mode: 0644]
tests/lxcxml2xmltest.c

index ba2586e51645c30b86e36905406676702798a371..31c132b94eced3236d62396684b7d969490dad49 100644 (file)
       &lt;target dir='/import/from/host'/&gt;
       &lt;readonly/&gt;
     &lt;/filesystem&gt;
+    &lt;filesystem type='file' accessmode='passthrough'&gt;
+      &lt;driver name='loop' type='raw'/&gt;
+      &lt;driver type='path' wrpolicy='immediate'/&gt;
+      &lt;source file='/export/to/guest.img'/&gt;
+      &lt;target dir='/import/from/host'/&gt;
+      &lt;readonly/&gt;
+    &lt;/filesystem&gt;
     ...
   &lt;/devices&gt;
   ...</pre>
 
       </dd>
 
+      <dt><code>driver</code></dt>
+      <dd>
+        The optional driver element allows specifying further details
+        related to the hypervisor driver used to provide the filesystem.
+        <span class="since">Since 1.0.6</span>
+        <ul>
+          <li>
+            If the hypervisor supports multiple backend drivers, then
+            the <code>type</code> attribute selects the primary
+            backend driver name, while the <code>format</code>
+            attribute provides the format type. For example, LXC
+            supports a type of "loop", with a format of "raw". QEMU
+            supports a type of "path" or "handle", but no formats.
+          </li>
+        </ul>
+      </dd>
+
       <dt><code>source</code></dt>
       <dd>
         The resource on the host that is being accessed in the guest. The
index 4fdacab5c4391fa7f876c22ff476a9052e69a6b4..6078b7a7588673e0ec6a87532581b9facd18e93b 100644 (file)
   <define name="diskspec">
     <interleave>
       <optional>
-        <ref name="driver"/>
+        <ref name="diskDriver"/>
       </optional>
       <optional>
         <ref name='diskMirror'/>
   <!--
       Disk may use a special driver for access.
     -->
-  <define name="driver">
+  <define name="diskDriver">
     <element name="driver">
       <choice>
         <group>
     <optional>
       <attribute name='type'>
         <choice>
-          <ref name='diskFormat'/>
+          <ref name='storageFormat'/>
           <value>aio</value> <!-- back-compat for 'raw' -->
         </choice>
       </attribute>
     </optional>
   </define>
-  <define name='diskFormat'>
+  <define name='storageFormat'>
     <choice>
       <value>raw</value>
       <value>dir</value>
           <attribute name="type">
             <value>file</value>
           </attribute>
+          <optional>
+            <ref name="fsDriver"/>
+          </optional>
           <interleave>
             <element name="source">
               <attribute name="file">
           <attribute name="type">
             <value>block</value>
           </attribute>
+          <optional>
+            <ref name="fsDriver"/>
+          </optional>
           <interleave>
             <element name="source">
               <attribute name="dev">
               <value>mount</value>
             </attribute>
           </optional>
+          <optional>
+            <ref name="fsDriver"/>
+          </optional>
           <interleave>
             <element name="source">
               <attribute name="dir">
               </attribute>
               <empty/>
             </element>
-            <optional>
-              <element name="driver">
-                <attribute name="type">
-                  <choice>
-                    <value>path</value>
-                    <value>handle</value>
-                  </choice>
-                </attribute>
-                <optional>
-                  <attribute name="wrpolicy">
-                    <value>immediate</value>
-                  </attribute>
-                </optional>
-                <empty/>
-              </element>
-            </optional>
           </interleave>
         </group>
         <group>
               <value>bind</value>
             </attribute>
           </optional>
+          <optional>
+            <ref name="fsDriver"/>
+          </optional>
           <interleave>
             <element name="source">
               <attribute name="dir">
           <attribute name="type">
             <value>template</value>
           </attribute>
+          <optional>
+            <ref name="fsDriver"/>
+          </optional>
           <interleave>
             <element name="source">
               <attribute name="name">
           <attribute name="type">
             <value>ram</value>
           </attribute>
+          <optional>
+            <ref name="fsDriver"/>
+          </optional>
           <interleave>
             <element name="source">
               <attribute name="usage">
       </interleave>
     </element>
   </define>
+  <define name="fsDriver">
+    <element name="driver">
+      <!-- Annoying inconsistency. 'disk' uses 'name'
+           for this kind of info, and 'type' for the
+           storage format. We need the latter too, so
+           had to invent a new attribute name -->
+      <optional>
+        <attribute name="type">
+          <choice>
+            <value>path</value>
+            <value>handle</value>
+            <value>loop</value>
+          </choice>
+        </attribute>
+      </optional>
+      <optional>
+        <attribute name="format">
+          <ref name="storageFormat"/>
+        </attribute>
+      </optional>
+      <optional>
+        <attribute name="wrpolicy">
+          <value>immediate</value>
+        </attribute>
+      </optional>
+      <empty/>
+    </element>
+  </define>
+
   <!--
       An interface description can either be of type bridge in which case
       it will use a bridging source, or of type ethernet which uses a device
       </attribute>
       <optional>
         <attribute name='format'>
-          <ref name='diskFormat'/>
+          <ref name='storageFormat'/>
         </attribute>
       </optional>
       <optional>
index 45d55b56c5a3e4fe84dd23f655520e3882b7fa93..7b46df1c1b646c67b28bfe5029a579137842e603 100644 (file)
               <element name='driver'>
                 <optional>
                   <attribute name='type'>
-                    <ref name='diskFormat'/>
+                    <ref name='storageFormat'/>
                   </attribute>
                 </optional>
                 <empty/>
index 209602777dee298a5f3856a0d02ea24f7002501a..ddf9ace16e7654e6d562cbef91d710ff42cd150d 100644 (file)
@@ -342,7 +342,8 @@ VIR_ENUM_IMPL(virDomainFS, VIR_DOMAIN_FS_TYPE_LAST,
 VIR_ENUM_IMPL(virDomainFSDriverType, VIR_DOMAIN_FS_DRIVER_TYPE_LAST,
               "default",
               "path",
-              "handle")
+              "handle",
+              "loop")
 
 VIR_ENUM_IMPL(virDomainFSAccessMode, VIR_DOMAIN_FS_ACCESSMODE_LAST,
               "passthrough",
@@ -5596,6 +5597,7 @@ virDomainFSDefParseXML(xmlNodePtr node,
     char *fsdriver = NULL;
     char *source = NULL;
     char *target = NULL;
+    char *format = NULL;
     char *accessmode = NULL;
     char *wrpolicy = NULL;
     char *usage = NULL;
@@ -5664,9 +5666,13 @@ virDomainFSDefParseXML(xmlNodePtr node,
                 target = virXMLPropString(cur, "dir");
             } else if (xmlStrEqual(cur->name, BAD_CAST "readonly")) {
                 def->readonly = true;
-            } else if (!fsdriver && xmlStrEqual(cur->name, BAD_CAST "driver")) {
-                fsdriver = virXMLPropString(cur, "type");
-                wrpolicy = virXMLPropString(cur, "wrpolicy");
+            } else if (xmlStrEqual(cur->name, BAD_CAST "driver")) {
+                if (!fsdriver)
+                    fsdriver = virXMLPropString(cur, "type");
+                if (!wrpolicy)
+                    wrpolicy = virXMLPropString(cur, "wrpolicy");
+                if (!format)
+                    format = virXMLPropString(cur, "format");
             }
         }
         cur = cur->next;
@@ -5674,12 +5680,20 @@ virDomainFSDefParseXML(xmlNodePtr node,
 
     if (fsdriver) {
         if ((def->fsdriver = virDomainFSDriverTypeTypeFromString(fsdriver)) <= 0) {
-            virReportError(VIR_ERR_INTERNAL_ERROR,
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                            _("unknown fs driver type '%s'"), fsdriver);
             goto error;
         }
     }
 
+    if (format) {
+        if ((def->format = virStorageFileFormatTypeFromString(format)) <= 0) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                           _("unknown driver format value '%s'"), format);
+            goto error;
+        }
+    }
+
     if (wrpolicy) {
         if ((def->wrpolicy = virDomainFSWrpolicyTypeFromString(wrpolicy)) <= 0) {
             virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
@@ -5739,6 +5753,7 @@ cleanup:
     VIR_FREE(wrpolicy);
     VIR_FREE(usage);
     VIR_FREE(unit);
+    VIR_FREE(format);
 
     return def;
 
@@ -13947,10 +13962,13 @@ virDomainFSDefFormat(virBufferPtr buf,
     if (def->fsdriver) {
         virBufferAsprintf(buf, "      <driver type='%s'", fsdriver);
 
+        if (def->format)
+            virBufferAsprintf(buf, " format='%s'",
+                              virStorageFileFormatTypeToString(def->format));
+
         /* Don't generate anything if wrpolicy is set to default */
-        if (def->wrpolicy) {
+        if (def->wrpolicy)
             virBufferAsprintf(buf, " wrpolicy='%s'", wrpolicy);
-        }
 
         virBufferAddLit(buf, "/>\n");
     }
index 5471cd3906bee67418dcf1c69742144a14287a0e..b5a0db83d23a9b6827bfeecdd51efda098ede74f 100644 (file)
@@ -800,6 +800,7 @@ enum virDomainFSDriverType {
     VIR_DOMAIN_FS_DRIVER_TYPE_DEFAULT = 0,
     VIR_DOMAIN_FS_DRIVER_TYPE_PATH,
     VIR_DOMAIN_FS_DRIVER_TYPE_HANDLE,
+    VIR_DOMAIN_FS_DRIVER_TYPE_LOOP,
 
     VIR_DOMAIN_FS_DRIVER_TYPE_LAST
 };
@@ -826,9 +827,10 @@ enum virDomainFSWrpolicy {
 
 struct _virDomainFSDef {
     int type;
-    int fsdriver;
-    int accessmode;
+    int fsdriver; /* enum virDomainFSDriverType */
+    int accessmode; /* enum virDomainFSAccessMode */
     int wrpolicy; /* enum virDomainFSWrpolicy */
+    int format; /* enum virStorageFileFormat */
     unsigned long long usage;
     char *src;
     char *dst;
index 178107d7577aec26bf2cfb135dfc95b5651f0b1c..372e1a3215301e2ee82dfda139e76bdb31060db0 100644 (file)
@@ -139,7 +139,8 @@ VIR_ENUM_DECL(qemuDomainFSDriver)
 VIR_ENUM_IMPL(qemuDomainFSDriver, VIR_DOMAIN_FS_DRIVER_TYPE_LAST,
               "local",
               "local",
-              "handle");
+              "handle",
+              NULL);
 
 
 /**
diff --git a/tests/lxcxml2xmldata/lxc-disk-formats.xml b/tests/lxcxml2xmldata/lxc-disk-formats.xml
new file mode 100644 (file)
index 0000000..da53cf2
--- /dev/null
@@ -0,0 +1,26 @@
+<domain type='lxc'>
+  <name>demo</name>
+  <uuid>8369f1ac-7e46-e869-4ca5-759d51478066</uuid>
+  <memory unit='KiB'>500000</memory>
+  <currentMemory unit='KiB'>500000</currentMemory>
+  <vcpu placement='static'>1</vcpu>
+  <os>
+    <type arch='x86_64'>exe</type>
+    <init>/bin/sh</init>
+  </os>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <emulator>/usr/libexec/libvirt_lxc</emulator>
+    <filesystem type='file' accessmode='passthrough'>
+      <driver type='loop' format='raw'/>
+      <source file='/root/container.img'/>
+      <target dir='/'/>
+    </filesystem>
+    <console type='pty'>
+      <target type='lxc' port='0'/>
+    </console>
+  </devices>
+</domain>
index 827c2fd267761ff5f359b5777c41f7a1b661a01d..97f792c25e14a6bb106292e4ea70dc7ff0f04fa5 100644 (file)
@@ -128,6 +128,7 @@ mymain(void)
 
     DO_TEST("systemd");
     DO_TEST("hostdev");
+    DO_TEST("disk-formats");
 
     virObjectUnref(caps);
     virObjectUnref(xmlopt);