And then add the transaction that allows us to perform this operation atomically.
Signed-off-by: John Snow <js...@redhat.com> --- blockdev.c | 39 +++++++++++++++++++++++++++++++++++++++ qapi-schema.json | 4 +++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/blockdev.c b/blockdev.c index 9233bcd..3f9842a 100644 --- a/blockdev.c +++ b/blockdev.c @@ -2012,6 +2012,40 @@ static void block_dirty_bitmap_add_abort(BlkActionState *common) } } +static void block_dirty_bitmap_copy_prepare(BlkActionState *common, + Error **errp) +{ + Error *local_err = NULL; + BlockDirtyBitmapCopy *action; + BlockDirtyBitmapState *state = DO_UPCAST(BlockDirtyBitmapState, + common, common); + + action = common->action->block_dirty_bitmap_copy; + /* AIO context taken (and released) within qmp_block_dirty_bitmap_copy */ + qmp_block_dirty_bitmap_copy(action->node, action->source, + action->dest, &local_err); + + if (!local_err) { + state->prepared = true; + } else { + error_propagate(errp, local_err); + } +} + +static void block_dirty_bitmap_copy_abort(BlkActionState *common) +{ + BlockDirtyBitmapCopy *action; + BlockDirtyBitmapState *state = DO_UPCAST(BlockDirtyBitmapState, + common, common); + + action = common->action->block_dirty_bitmap_copy; + if (state->prepared) { + qmp_block_dirty_bitmap_remove(action->node, + action->source, + &error_abort); + } +} + static void block_dirty_bitmap_clear_prepare(BlkActionState *common, Error **errp) { @@ -2113,6 +2147,11 @@ static const BlkActionOps actions[] = { .prepare = block_dirty_bitmap_add_prepare, .abort = block_dirty_bitmap_add_abort, }, + [TRANSACTION_ACTION_KIND_BLOCK_DIRTY_BITMAP_COPY] = { + .instance_size = sizeof(BlockDirtyBitmapState), + .prepare = block_dirty_bitmap_copy_prepare, + .abort = block_dirty_bitmap_copy_abort, + }, [TRANSACTION_ACTION_KIND_BLOCK_DIRTY_BITMAP_CLEAR] = { .instance_size = sizeof(BlockDirtyBitmapState), .prepare = block_dirty_bitmap_clear_prepare, diff --git a/qapi-schema.json b/qapi-schema.json index bbd4b3a..89fdd0f 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -1472,6 +1472,7 @@ # blockdev-snapshot-internal-sync since 1.7 # blockdev-backup since 2.3 # block-dirty-bitmap-add since 2.4 +# block-dirty-bitmap-copy since 2.4 # block-dirty-bitmap-clear since 2.4 ## { 'union': 'TransactionAction', @@ -1482,7 +1483,8 @@ 'abort': 'Abort', 'blockdev-snapshot-internal-sync': 'BlockdevSnapshotInternal', 'block-dirty-bitmap-add': 'BlockDirtyBitmapAdd', - 'block-dirty-bitmap-clear': 'BlockDirtyBitmap' + 'block-dirty-bitmap-clear': 'BlockDirtyBitmap', + 'block-dirty-bitmap-copy': 'BlockDirtyBitmapCopy' } } ## -- 2.1.0