From: "Daniel P. Berrange" <berrange(a)redhat.com>
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(a)redhat.com>
---
docs/formatdomain.html.in | 24 ++++++++++++++
docs/schemas/domaincommon.rng | 73 ++++++++++++++++++++++++++++++-------------
src/conf/domain_conf.c | 25 ++++++++++++---
src/conf/domain_conf.h | 6 ++--
src/qemu/qemu_command.c | 3 +-
5 files changed, 102 insertions(+), 29 deletions(-)
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 888c005..a707cc8 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -1876,6 +1876,13 @@
<target dir='/import/from/host'/>
<readonly/>
</filesystem>
+ <filesystem type='file' accessmode='passthrough'>
+ <driver name='loop' type='raw'/>
+ <driver type='path' wrpolicy='immediate'/>
+ <source file='/export/to/guest.img'/>
+ <target dir='/import/from/host'/>
+ <readonly/>
+ </filesystem>
...
</devices>
...</pre>
@@ -1967,6 +1974,23 @@
</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.4</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
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 3976b82..206757f 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -888,7 +888,7 @@
<define name="diskspec">
<interleave>
<optional>
- <ref name="driver"/>
+ <ref name="diskDriver"/>
</optional>
<optional>
<ref name='diskMirror'/>
@@ -1270,7 +1270,7 @@
<!--
Disk may use a special driver for access.
-->
- <define name="driver">
+ <define name="diskDriver">
<element name="driver">
<choice>
<group>
@@ -1314,13 +1314,13 @@
<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>
@@ -1502,6 +1502,9 @@
<attribute name="type">
<value>file</value>
</attribute>
+ <optional>
+ <ref name="diskDriver"/>
+ </optional>
<interleave>
<element name="source">
<attribute name="file">
@@ -1515,6 +1518,9 @@
<attribute name="type">
<value>block</value>
</attribute>
+ <optional>
+ <ref name="diskDriver"/>
+ </optional>
<interleave>
<element name="source">
<attribute name="dev">
@@ -1531,6 +1537,9 @@
<value>mount</value>
</attribute>
</optional>
+ <optional>
+ <ref name="diskDriver"/>
+ </optional>
<interleave>
<element name="source">
<attribute name="dir">
@@ -1538,22 +1547,6 @@
</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>
@@ -1562,6 +1555,9 @@
<value>bind</value>
</attribute>
</optional>
+ <optional>
+ <ref name="diskDriver"/>
+ </optional>
<interleave>
<element name="source">
<attribute name="dir">
@@ -1575,6 +1571,9 @@
<attribute name="type">
<value>template</value>
</attribute>
+ <optional>
+ <ref name="diskDriver"/>
+ </optional>
<interleave>
<element name="source">
<attribute name="name">
@@ -1588,6 +1587,9 @@
<attribute name="type">
<value>ram</value>
</attribute>
+ <optional>
+ <ref name="diskDriver"/>
+ </optional>
<interleave>
<element name="source">
<attribute name="usage">
@@ -1645,6 +1647,35 @@
</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
@@ -3754,7 +3785,7 @@
</attribute>
<optional>
<attribute name='format'>
- <ref name='diskFormat'/>
+ <ref name='storageFormat'/>
</attribute>
</optional>
<optional>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index dc0ecaa..582308b 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -336,7 +336,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",
@@ -5368,6 +5369,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;
@@ -5436,9 +5438,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;
@@ -5446,12 +5452,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,
@@ -5511,6 +5525,7 @@ cleanup:
VIR_FREE(wrpolicy);
VIR_FREE(usage);
VIR_FREE(unit);
+ VIR_FREE(format);
return def;
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index f1f01fa..a65aabc 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -767,6 +767,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
};
@@ -793,9 +794,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;
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 05c12b2..05c2a41 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -130,7 +130,8 @@ VIR_ENUM_DECL(qemuDomainFSDriver)
VIR_ENUM_IMPL(qemuDomainFSDriver, VIR_DOMAIN_FS_DRIVER_TYPE_LAST,
"local",
"local",
- "handle");
+ "handle",
+ NULL);
/**
--
1.7.11.7