}
-
-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;