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@xxxxxxxxxx> --- 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