[libvirt] [PATCH v2 28/29] conf: Parse and format 'backingStore' for disk <mirror>

Peter Krempa pkrempa at redhat.com
Fri Mar 22 18:01:04 UTC 2019


When the block copy operation is started with a reused external file in
incremental mode libvirt will need to open and insert the backing chain
for that file into qemu (in -blockdev mode). This means that we'll need
to track the backing chain and metadata such as node names for the full
chain of <mirror>.

This patch invokes the full backing chain formatter and parser for
<mirror> so that the chain can be kept with <mirror>.

Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---
 docs/schemas/domaincommon.rng                      |  1 +
 src/conf/domain_conf.c                             |  5 +++++
 tests/qemustatusxml2xmldata/blockjob-mirror-in.xml | 13 +++++++++++++
 tests/qemuxml2argvdata/disk-mirror.xml             |  6 ++++++
 tests/qemuxml2xmloutdata/disk-mirror-active.xml    |  6 ++++++
 5 files changed, 31 insertions(+)

diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 1828e0795b..623ef28719 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -5676,6 +5676,7 @@
           </choice>
         </attribute>
       </optional>
+      <ref name="diskBackingChain"/>
     </element>
   </define>
   <define name="diskAuth">
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 2514c60744..0970d48045 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -9351,6 +9351,8 @@ virDomainDiskDefMirrorParse(virDomainDiskDefPtr def,
     if (mirrorType) {
         if (virDomainStorageSourceParse(NULL, ctxt, def->mirror, flags, xmlopt) < 0)
             return -1;
+        if (virDomainDiskBackingStoreParse(ctxt, def->mirror, flags, xmlopt) < 0)
+            return -1;
     } else {
         /* For back-compat reasons, we handle a file name encoded as
          * attributes, even though we prefer modern output in the style of
@@ -24033,6 +24035,9 @@ virDomainDiskDefFormatMirror(virBufferPtr buf,
     if (virDomainDiskSourceFormat(&childBuf, disk->mirror, 0, false, flags, xmlopt) < 0)
         return -1;

+    if (virDomainDiskBackingStoreFormat(&childBuf, disk->mirror, xmlopt, flags) < 0)
+        return -1;
+
     if (virXMLFormatElement(buf, "mirror", &attrBuf, &childBuf) < 0)
         return -1;

diff --git a/tests/qemustatusxml2xmldata/blockjob-mirror-in.xml b/tests/qemustatusxml2xmldata/blockjob-mirror-in.xml
index 32bde1ba66..df23ac00aa 100644
--- a/tests/qemustatusxml2xmldata/blockjob-mirror-in.xml
+++ b/tests/qemustatusxml2xmldata/blockjob-mirror-in.xml
@@ -65,6 +65,7 @@
         <mirror type='file' file='/tmp/copy.img' format='qcow2' job='copy'>
           <format type='qcow2'/>
           <source file='/tmp/copy.img'/>
+          <backingStore/>
         </mirror>
         <target dev='vda' bus='virtio'/>
         <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
@@ -76,6 +77,18 @@
         <mirror type='file' file='/tmp/logcopy.img' format='qcow2' job='copy' ready='abort'>
           <format type='qcow2'/>
           <source file='/tmp/logcopy.img'/>
+          <backingStore type='block' index='1'>
+            <format type='raw'/>
+            <source dev='/dev/HostVG/backing'>
+              <privateData>
+                <nodenames>
+                  <nodename type='storage' name='test-backing-storage'/>
+                  <nodename type='format' name='test-backing-format'/>
+                </nodenames>
+              </privateData>
+            </source>
+            <backingStore/>
+          </backingStore>
         </mirror>
         <target dev='vdb' bus='virtio'/>
         <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
diff --git a/tests/qemuxml2argvdata/disk-mirror.xml b/tests/qemuxml2argvdata/disk-mirror.xml
index e89eee47ed..c1e6e94e33 100644
--- a/tests/qemuxml2argvdata/disk-mirror.xml
+++ b/tests/qemuxml2argvdata/disk-mirror.xml
@@ -36,6 +36,7 @@
       <mirror type='file' file='/tmp/copy.img' format='qcow2' job='copy'>
         <format type='qcow2'/>
         <source file='/tmp/copy.img'/>
+        <backingStore/>
       </mirror>
       <target dev='vda' bus='virtio'/>
     </disk>
@@ -45,6 +46,11 @@
       <mirror type='file' file='/tmp/logcopy.img' format='qcow2' job='copy' ready='abort'>
         <format type='qcow2'/>
         <source file='/tmp/logcopy.img'/>
+        <backingStore type='block' index='1'>
+          <format type='raw'/>
+          <source dev='/dev/HostVG/backing'/>
+          <backingStore/>
+        </backingStore>
       </mirror>
       <target dev='vdb' bus='virtio'/>
     </disk>
diff --git a/tests/qemuxml2xmloutdata/disk-mirror-active.xml b/tests/qemuxml2xmloutdata/disk-mirror-active.xml
index d689eac6b8..32ffc647be 100644
--- a/tests/qemuxml2xmloutdata/disk-mirror-active.xml
+++ b/tests/qemuxml2xmloutdata/disk-mirror-active.xml
@@ -40,6 +40,7 @@
       <mirror type='file' file='/tmp/copy.img' format='qcow2' job='copy'>
         <format type='qcow2'/>
         <source file='/tmp/copy.img'/>
+        <backingStore/>
       </mirror>
       <target dev='vda' bus='virtio'/>
       <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
@@ -51,6 +52,11 @@
       <mirror type='file' file='/tmp/logcopy.img' format='qcow2' job='copy' ready='abort'>
         <format type='qcow2'/>
         <source file='/tmp/logcopy.img'/>
+        <backingStore type='block' index='1'>
+          <format type='raw'/>
+          <source dev='/dev/HostVG/backing'/>
+          <backingStore/>
+        </backingStore>
       </mirror>
       <target dev='vdb' bus='virtio'/>
       <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
-- 
2.20.1




More information about the libvir-list mailing list