qemu-img: Factor out code for merging bitmaps

The next patch will add another client that wants to merge dirty
bitmaps; it will be easier to refactor the code to construct the QAPI
struct correctly into a helper function.

Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <20200521192137.1120211-4-eblake@redhat.com>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
This commit is contained in:
Eric Blake 2020-05-21 14:21:35 -05:00
parent 5d72c68b49
commit 6c729dd832
1 changed files with 21 additions and 13 deletions

View File

@ -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();
}