Allow reusing original backing chain when doing a shallow copy without reuse of external image. The existing logic didn't allow it but it will be possible. Also add a note to explain that logic. Signed-off-by: Peter Krempa <pkrempa@xxxxxxxxxx> --- src/qemu/qemu_driver.c | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index ff83d1c024..3e0aa1b90f 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -18263,19 +18263,23 @@ qemuDomainBlockCopyCommonValidateUserMirrorBackingStore(virStorageSourcePtr mirr { /* note that if original disk does not have backing chain, shallow is cleared */ bool shallow = flags & VIR_DOMAIN_BLOCK_COPY_SHALLOW; - bool reuse = flags & VIR_DOMAIN_BLOCK_COPY_REUSE_EXT; - if (!mirror->backingStore) { - /* deep copy won't need backing store so we can terminate it */ - if (!shallow && + if (!virStorageSourceHasBacking(mirror)) { + /* for deep copy there won't be backing chain so we can terminate it */ + if (!mirror->backingStore && + !shallow && !(mirror->backingStore = virStorageSourceNew())) return -1; - return 0; - } - - /* validate user provided backing store */ - if (virStorageSourceHasBacking(mirror)) { + /* When reusing an external image we document that the user must ensure + * that the <mirror> image must expose data as the original image did + * either by providing correct chain or prepopulating the image. This + * means we can't validate this any more regardless of whether shallow + * copy is requested. + * + * For a copy when we are not reusing external image requesting shallow + * is okay and will inherit the original backing chain */ + } else { if (!blockdev) { virReportError(VIR_ERR_INVALID_ARG, "%s", _("backingStore of mirror target is not supported by this qemu")); @@ -18287,13 +18291,6 @@ qemuDomainBlockCopyCommonValidateUserMirrorBackingStore(virStorageSourcePtr mirr _("backingStore of mirror without VIR_DOMAIN_BLOCK_COPY_SHALLOW doesn't make sense")); return -1; } - } else { - /* shallow copy without reuse requires some kind of backing data */ - if (!reuse && shallow) { - virReportError(VIR_ERR_INVALID_ARG, "%s", - _("VIR_DOMAIN_BLOCK_COPY_SHALLOW implies backing chain for mirror")); - return -1; - } } return 0; -- 2.21.0 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list