diff --git a/src/qemu/qemu_backup.c b/src/qemu/qemu_backup.c index 1cd466d2112e06b1fd37276aef2d037f8eb888b3..31949b539995f4c131b02f80c8690797ee689027 100644 --- a/src/qemu/qemu_backup.c +++ b/src/qemu/qemu_backup.c @@ -170,30 +170,43 @@ qemuBackupDiskDataCleanup(virDomainObjPtr vm, } - -static int -qemuBackupDiskPrepareOneBitmaps(struct qemuBackupDiskData *dd, - virJSONValuePtr actions, - virDomainMomentDefPtr *incremental) +static virJSONValuePtr +qemuBackupDiskPrepareOneBitmapsChain(virDomainMomentDefPtr *incremental, + virStorageSourcePtr backingChain) { - g_autoptr(virJSONValue) mergebitmaps = NULL; - g_autoptr(virJSONValue) mergebitmapsstore = NULL; + g_autoptr(virJSONValue) ret = NULL; - if (!(mergebitmaps = virJSONValueNewArray())) - return -1; + if (!(ret = virJSONValueNewArray())) + return NULL; /* TODO: this code works only if the bitmaps are present on a single node. * The algorithm needs to be changed so that it looks into the backing chain * so that we can combine all relevant bitmaps for a given backing chain */ while (*incremental) { - if (qemuMonitorTransactionBitmapMergeSourceAddBitmap(mergebitmaps, - dd->domdisk->src->nodeformat, + if (qemuMonitorTransactionBitmapMergeSourceAddBitmap(ret, + backingChain->nodeformat, (*incremental)->name) < 0) - return -1; + return NULL; incremental++; } + return g_steal_pointer(&ret); +} + + +static int +qemuBackupDiskPrepareOneBitmaps(struct qemuBackupDiskData *dd, + virJSONValuePtr actions, + virDomainMomentDefPtr *incremental) +{ + g_autoptr(virJSONValue) mergebitmaps = NULL; + g_autoptr(virJSONValue) mergebitmapsstore = NULL; + + if (!(mergebitmaps = qemuBackupDiskPrepareOneBitmapsChain(incremental, + dd->domdisk->src))) + return -1; + if (!(mergebitmapsstore = virJSONValueCopy(mergebitmaps))) return -1;