qemuMigrationDstPrepareAnyBlockDirtyBitmaps: Fix check for existing bitmaps

On incoming migration qemu doesn't load bitmaps into memory (which makes
them available under the 'dirty-bitmaps' field which we parse as the
'bitmaps' array in 'qemuBlockNamedNodeData') until after actually
resuming CPUs, thus the check for existing bitmaps never actually
worked.

We need to check the 'qcow2bitmaps' field instead which is populated
from the qcow2 headers prior to activating the image.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Peter Krempa committed 2026-02-03 15:34:52 +01:00
1 parent b2fe3465de
commit 0c75fc1747
1 file changed
+7 -9
+7 -9
View File
@@ -3230,6 +3230,8 @@ qemuMigrationDstPrepareAnyBlockDirtyBitmaps(virDomainObj *vm,
qemuBlockNamedNodeData *nodedata;
GSList *nextbitmap;
VIR_DEBUG("offer migrate bitmaps for '%s'", disk->target);
if (!(nodedata = virHashLookup(blockNamedNodeData, disk->nodename))) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("failed to find data for block node '%1$s'"),
@@ -3246,18 +3248,14 @@ qemuMigrationDstPrepareAnyBlockDirtyBitmaps(virDomainObj *vm,
for (nextbitmap = disk->bitmaps; nextbitmap; nextbitmap = nextbitmap->next) {
qemuMigrationBlockDirtyBitmapsDiskBitmap *bitmap = nextbitmap->data;
size_t k;
/* don't migrate into existing bitmaps */
for (k = 0; k < nodedata->nbitmaps; k++) {
if (STREQ(bitmap->bitmapname, nodedata->bitmaps[k]->name)) {
bitmap->skip = true;
break;
}
}
if (nodedata->qcow2bitmaps)
bitmap->skip = g_strv_contains((const char **) nodedata->qcow2bitmaps, bitmap->bitmapname);
VIR_DEBUG("offer migrate bitmap '%s' disk '%s' -> skip: '%d'",
bitmap->bitmapname, disk->target, bitmap->skip);
if (bitmap->skip)
continue;
}
}