qemu: backup: Fix backup of disk skipped in an intermediate checkpoint

If a disk is not captured by one of the intermediate checkpoints the
code would fail, but we can easily calculate the bitmaps to merge
correctly by skipping over checkpoints which don't describe the disk.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
Peter Krempa 2020-05-21 13:23:40 +02:00
parent 562511afa6
commit c89a44777f
2 changed files with 30 additions and 0 deletions

View File

@ -240,6 +240,30 @@ qemuBackupDiskPrepareOneBitmapsChain(virDomainMomentDefPtr *incremental,
for (incridx = 0; incremental[incridx]; incridx++) {
g_autoptr(virJSONValue) tmp = virJSONValueNewArray();
virStorageSourcePtr tmpsrc = NULL;
virDomainCheckpointDefPtr chkdef = (virDomainCheckpointDefPtr) incremental[incridx];
bool checkpoint_has_disk = false;
size_t i;
for (i = 0; i < chkdef->ndisks; i++) {
if (STRNEQ_NULLABLE(diskdst, chkdef->disks[i].name))
continue;
if (chkdef->disks[i].type == VIR_DOMAIN_CHECKPOINT_TYPE_BITMAP)
checkpoint_has_disk = true;
break;
}
if (!checkpoint_has_disk) {
if (!incremental[incridx + 1]) {
virReportError(VIR_ERR_INVALID_ARG,
_("disk '%s' not found in checkpoint '%s'"),
diskdst, incremental[incridx]->name);
return NULL;
}
continue;
}
if (qemuBackupGetBitmapMergeRange(n, incremental[incridx]->name,
&tmp, &tmpsrc, diskdst,

View File

@ -727,6 +727,12 @@ testQemuBackupGetIncrementalMoment(const char *name)
if (!(checkpoint = virDomainCheckpointDefNew()))
abort();
checkpoint->disks = g_new0(virDomainCheckpointDiskDef, 1);
checkpoint->ndisks = 1;
checkpoint->disks[0].name = g_strdup("testdisk");
checkpoint->disks[0].type = VIR_DOMAIN_CHECKPOINT_TYPE_BITMAP;
checkpoint->parent.name = g_strdup(name);
return (virDomainMomentDefPtr) checkpoint;