Allow starting the block-copy job for a persistent domain if a user declares by using a flag that the job will not be recovered if the VM is switched off while the job is active. This allows to use the block-copy job with persistent VMs under the same conditions as would apply to transient domains. --- include/libvirt/libvirt-domain.h | 3 +++ src/libvirt-domain.c | 3 +++ src/qemu/qemu_driver.c | 9 ++++++--- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h index 720db32f7..45f939a8c 100644 --- a/include/libvirt/libvirt-domain.h +++ b/include/libvirt/libvirt-domain.h @@ -2428,6 +2428,9 @@ typedef enum { backing chain */ VIR_DOMAIN_BLOCK_COPY_REUSE_EXT = 1 << 1, /* Reuse existing external file for a copy */ + VIR_DOMAIN_BLOCK_COPY_TRANSIENT_JOB = 1 << 2, /* Don't force usage of + recoverable job for the + copy operation */ } virDomainBlockCopyFlags; /** diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c index 310b91b37..6726a5120 100644 --- a/src/libvirt-domain.c +++ b/src/libvirt-domain.c @@ -10027,6 +10027,9 @@ virDomainBlockRebase(virDomainPtr dom, const char *disk, * or virDomainDetachDevice(), while a copy job is active; they may * also restrict a copy job to transient domains. * + * If @flags contains VIR_DOMAIN_BLOCK_COPY_TRANSIENT_JOB the job will not be + * recoverable if the VM is turned of while job is active. + * * The @disk parameter is either an unambiguous source name of the * block device (the <source file='...'/> sub-element, such as * "/path/to/image"), or the device target shorthand (the diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index f0cdea659..29efda198 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -16507,7 +16507,8 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm, /* Preliminaries: find the disk we are editing, sanity checks */ virCheckFlags(VIR_DOMAIN_BLOCK_COPY_SHALLOW | - VIR_DOMAIN_BLOCK_COPY_REUSE_EXT, -1); + VIR_DOMAIN_BLOCK_COPY_REUSE_EXT | + VIR_DOMAIN_BLOCK_COPY_TRANSIENT_JOB, -1); priv = vm->privateData; cfg = virQEMUDriverGetConfig(driver); @@ -16546,7 +16547,8 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm, _("block copy is not supported with this QEMU binary")); goto endjob; } - if (vm->persistent) { + if (!(flags & VIR_DOMAIN_BLOCK_COPY_TRANSIENT_JOB) && + vm->persistent) { /* XXX if qemu ever lets us start a new domain with mirroring * already active, we can relax this; but for now, the risk of * 'managedsave' due to libvirt-guests means we can't risk @@ -16773,7 +16775,8 @@ qemuDomainBlockCopy(virDomainPtr dom, const char *disk, const char *destxml, size_t i; virCheckFlags(VIR_DOMAIN_BLOCK_COPY_SHALLOW | - VIR_DOMAIN_BLOCK_COPY_REUSE_EXT, -1); + VIR_DOMAIN_BLOCK_COPY_REUSE_EXT | + VIR_DOMAIN_BLOCK_COPY_TRANSIENT_JOB, -1); if (virTypedParamsValidate(params, nparams, VIR_DOMAIN_BLOCK_COPY_BANDWIDTH, VIR_TYPED_PARAM_ULLONG, -- 2.12.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list