[libvirt] [PATCH 4/5] conf: add 'format' attribute to domain/os/nvram element

Dmitry Andreev dandreev at virtuozzo.com
Tue Dec 8 14:11:14 UTC 2015


By default libvirt's qemu driver creates nvram file as a copy
of the file specified in 'template' attribute and use it as
a 'raw' image file.

'raw' image format doesn't support snapshotting. 'format'
attribut can be used to specify different format for nvram
image file.

This patch introduces 'format' attribute with two possible
values: 'raw' and 'qcow2'.
---
 docs/schemas/domaincommon.rng |  8 ++++++++
 src/conf/domain_conf.c        | 18 ++++++++++++++++++
 src/conf/domain_conf.h        |  1 +
 3 files changed, 27 insertions(+)

diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 4804c69..7c609b5 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -275,6 +275,14 @@
               </attribute>
             </optional>
             <optional>
+              <attribute name='format'>
+                <choice>
+                  <value>raw</value>
+                  <value>qcow2</value>
+                </choice>
+              </attribute>
+            </optional>
+            <optional>
               <ref name="absFilePath"/>
             </optional>
           </element>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 2f5c0ed..ce47522 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -15526,6 +15526,19 @@ virDomainDefParseXML(xmlDocPtr xml,
 
             def->os.loader->nvram = virXPathString("string(./os/nvram[1])", ctxt);
             def->os.loader->templt = virXPathString("string(./os/nvram[1]/@template)", ctxt);
+
+            if ((tmp = virXPathString("string(./os/nvram[1]/@format)", ctxt))) {
+                int format = virStorageFileFormatTypeFromString(tmp);
+                if (format < 0) {
+                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                                   _("invalid value of format attribute "
+                                     "for NVRAM '%s'"), tmp);
+                    goto error;
+                }
+
+                VIR_FREE(tmp);
+                def->os.loader->format = format;
+            }
         }
     }
 
@@ -21270,6 +21283,7 @@ virDomainLoaderDefFormat(virBufferPtr buf,
 {
     const char *readonly = virTristateBoolTypeToString(loader->readonly);
     const char *type = virDomainLoaderTypeToString(loader->type);
+    const char *format = virStorageFileFormatTypeToString(loader->format);
 
     virBufferAddLit(buf, "<loader");
 
@@ -21282,6 +21296,10 @@ virDomainLoaderDefFormat(virBufferPtr buf,
     if (loader->nvram || loader->templt) {
         virBufferAddLit(buf, "<nvram");
         virBufferEscapeString(buf, " template='%s'", loader->templt);
+
+        if (format && loader->format > 0)
+            virBufferEscapeString(buf, " format='%s'", format);
+
         if (loader->nvram)
             virBufferEscapeString(buf, ">%s</nvram>\n", loader->nvram);
         else
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 90d8e13..4607fac 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1816,6 +1816,7 @@ struct _virDomainLoaderDef {
     virDomainLoader type;
     char *nvram;    /* path to non-volatile RAM */
     char *templt;   /* user override of path to master nvram */
+    int format;     /* virStorageFileFormat */
 };
 
 void virDomainLoaderDefFree(virDomainLoaderDefPtr loader);
-- 
1.8.3.1




More information about the libvir-list mailing list