From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41624) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z0fNX-0005S8-KW for qemu-devel@nongnu.org; Thu, 04 Jun 2015 20:21:00 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Z0fNW-0007Tx-JL for qemu-devel@nongnu.org; Thu, 04 Jun 2015 20:20:55 -0400 From: John Snow Date: Thu, 4 Jun 2015 20:20:39 -0400 Message-Id: <1433463642-21840-7-git-send-email-jsnow@redhat.com> In-Reply-To: <1433463642-21840-1-git-send-email-jsnow@redhat.com> References: <1433463642-21840-1-git-send-email-jsnow@redhat.com> Subject: [Qemu-devel] [PATCH 6/9] qmp: add block-dirty-bitmap-copy transaction List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-block@nongnu.org Cc: kwolf@redhat.com, John Snow , jcody@redhat.com, qemu-devel@nongnu.org And then add the transaction that allows us to perform this operation atomically. Signed-off-by: John Snow --- 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