[PATCH 09/17] qemuDomainBlockCopy: Implement VIR_DOMAIN_BLOCK_COPY_SYNCHRONOUS_WRITES

Peter Krempa pkrempa at redhat.com
Fri Dec 3 15:01:48 UTC 2021


Wire up the flag to enable the 'write-blocking' 'copy-mode' of
'blockdev-mirror'.

It's not supported by all qemu versions but it is with those which we
use -blockdev with so we can use that instead of adding another custom
capability as we use blockdev for some time now.

Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---
 src/qemu/qemu_driver.c | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 4cc1d20b89..a9fb840628 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -14902,12 +14902,14 @@ qemuDomainBlockCopyCommon(virDomainObj *vm,
     virStorageSource *n;
     virStorageSource *mirrorBacking = NULL;
     g_autoptr(GHashTable) blockNamedNodeData = NULL;
+    bool syncWrites = !!(flags & VIR_DOMAIN_BLOCK_COPY_SYNCHRONOUS_WRITES);
     int rc = 0;

     /* Preliminaries: find the disk we are editing, sanity checks */
     virCheckFlags(VIR_DOMAIN_BLOCK_COPY_SHALLOW |
                   VIR_DOMAIN_BLOCK_COPY_REUSE_EXT |
-                  VIR_DOMAIN_BLOCK_COPY_TRANSIENT_JOB, -1);
+                  VIR_DOMAIN_BLOCK_COPY_TRANSIENT_JOB |
+                  VIR_DOMAIN_BLOCK_COPY_SYNCHRONOUS_WRITES, -1);

     if (virStorageSourceIsRelative(mirror)) {
         virReportError(VIR_ERR_INVALID_ARG, "%s",
@@ -14945,6 +14947,12 @@ qemuDomainBlockCopyCommon(virDomainObj *vm,
         virDomainDiskDefSourceLUNValidate(mirror) < 0)
         goto endjob;

+    if (syncWrites && !blockdev) {
+        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
+                       _("VIR_DOMAIN_BLOCK_COPY_SYNCHRONOUS_WRITES is not supported by this VM"));
+        goto endjob;
+    }
+
     if (!(flags & VIR_DOMAIN_BLOCK_COPY_TRANSIENT_JOB) &&
         vm->persistent) {
         /* XXX if qemu ever lets us start a new domain with mirroring
@@ -15151,7 +15159,7 @@ qemuDomainBlockCopyCommon(virDomainObj *vm,
                                         qemuDomainDiskGetTopNodename(disk),
                                         mirror->nodeformat, bandwidth,
                                         granularity, buf_size, mirror_shallow,
-                                        false);
+                                        syncWrites);
     } else {
         /* qemuMonitorDriveMirror needs to honor the REUSE_EXT flag as specified
          * by the user */
@@ -15286,7 +15294,9 @@ qemuDomainBlockCopy(virDomainPtr dom, const char *disk, const char *destxml,

     virCheckFlags(VIR_DOMAIN_BLOCK_COPY_SHALLOW |
                   VIR_DOMAIN_BLOCK_COPY_REUSE_EXT |
-                  VIR_DOMAIN_BLOCK_COPY_TRANSIENT_JOB, -1);
+                  VIR_DOMAIN_BLOCK_COPY_TRANSIENT_JOB |
+                  VIR_DOMAIN_BLOCK_COPY_SYNCHRONOUS_WRITES, -1);
+
     if (virTypedParamsValidate(params, nparams,
                                VIR_DOMAIN_BLOCK_COPY_BANDWIDTH,
                                VIR_TYPED_PARAM_ULLONG,
-- 
2.31.1




More information about the libvir-list mailing list