mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-22 03:12:22 +00:00
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:
parent
562511afa6
commit
c89a44777f
@ -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,
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user