Commit 6c729dd8 authored by Eric Blake's avatar Eric Blake
Browse files

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: default avatarEric Blake <eblake@redhat.com>
Message-Id: <20200521192137.1120211-4-eblake@redhat.com>
Reviewed-by: default avatarVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
parent 5d72c68b
Loading
Loading
Loading
Loading
+21 −13
Original line number Diff line number Diff line
@@ -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();
        }