|
@@ -1638,6 +1638,24 @@ out4:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+/* Convenience wrapper around qmp_block_dirty_bitmap_merge */
|
|
|
+static void do_dirty_bitmap_merge(const char *dst_node, const char *dst_name,
|
|
|
+ const char *src_node, const char *src_name,
|
|
|
+ Error **errp)
|
|
|
+{
|
|
|
+ BlockDirtyBitmapMergeSource *merge_src;
|
|
|
+ BlockDirtyBitmapMergeSourceList *list;
|
|
|
+
|
|
|
+ merge_src = g_new0(BlockDirtyBitmapMergeSource, 1);
|
|
|
+ merge_src->type = QTYPE_QDICT;
|
|
|
+ merge_src->u.external.node = g_strdup(src_node);
|
|
|
+ merge_src->u.external.name = g_strdup(src_name);
|
|
|
+ list = g_new0(BlockDirtyBitmapMergeSourceList, 1);
|
|
|
+ list->value = merge_src;
|
|
|
+ qmp_block_dirty_bitmap_merge(dst_node, dst_name, list, errp);
|
|
|
+ qapi_free_BlockDirtyBitmapMergeSourceList(list);
|
|
|
+}
|
|
|
+
|
|
|
enum ImgConvertBlockStatus {
|
|
|
BLK_DATA,
|
|
|
BLK_ZERO,
|
|
@@ -4714,21 +4732,11 @@ static int img_bitmap(int argc, char **argv)
|
|
|
qmp_block_dirty_bitmap_disable(bs->node_name, bitmap, &err);
|
|
|
op = "disable";
|
|
|
break;
|
|
|
- case BITMAP_MERGE: {
|
|
|
- BlockDirtyBitmapMergeSource *merge_src;
|
|
|
- BlockDirtyBitmapMergeSourceList *list;
|
|
|
-
|
|
|
- merge_src = g_new0(BlockDirtyBitmapMergeSource, 1);
|
|
|
- merge_src->type = QTYPE_QDICT;
|
|
|
- merge_src->u.external.node = g_strdup(src_bs->node_name);
|
|
|
- merge_src->u.external.name = g_strdup(act->src);
|
|
|
- list = g_new0(BlockDirtyBitmapMergeSourceList, 1);
|
|
|
- list->value = merge_src;
|
|
|
- qmp_block_dirty_bitmap_merge(bs->node_name, bitmap, list, &err);
|
|
|
- qapi_free_BlockDirtyBitmapMergeSourceList(list);
|
|
|
+ case BITMAP_MERGE:
|
|
|
+ do_dirty_bitmap_merge(bs->node_name, bitmap, src_bs->node_name,
|
|
|
+ act->src, &err);
|
|
|
op = "merge";
|
|
|
break;
|
|
|
- }
|
|
|
default:
|
|
|
g_assert_not_reached();
|
|
|
}
|