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(a)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