From nobody Sun Feb 8 22:58:02 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=virtuozzo.com ARC-Seal: i=1; a=rsa-sha256; t=1559564324; cv=none; d=zoho.com; s=zohoarc; b=lPoBsDnTngYhTCXO5IrNzPzlGy931j0p6ttTbvelCvG3Jr/D44FvTg9HpsoePQV05j8DNIX0Uwua0++BJn4b7chsDqhzN+txjWq+NmsfPaQB+9wZ1Y19wJOqITDlOZy/Ih/xmiFdLFY1uRtSdNtBHavuqG8be4ZNXJOVNojFW0A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1559564324; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=BoqN6As0FS2ylndWXaM6Vwmrz23xS6oFIjBmgeGjiMo=; b=Wag2zITF+tJdZGR9GPHCk1gFCGzpnsvcCxK4vDnXoA1V0C9NivNrLJ87AhXN6toTVTARUQAfaK+PfjlhSkTma5rtxt9BTbxbSq68r7T6YoUU7N2TGBtO9hYYIwuMfoFs4rKhOGE5XfHu3z6R6LgRJd8Xqzoku6epMjMIJpXzekY= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 155956432422520.580746598740234; Mon, 3 Jun 2019 05:18:44 -0700 (PDT) Received: from localhost ([127.0.0.1]:34327 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hXlvB-0001Rs-6N for importer@patchew.org; Mon, 03 Jun 2019 08:18:37 -0400 Received: from eggs.gnu.org ([209.51.188.92]:60202) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hXlqU-0006DT-Si for qemu-devel@nongnu.org; Mon, 03 Jun 2019 08:13:48 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hXldZ-0001qF-OX for qemu-devel@nongnu.org; Mon, 03 Jun 2019 08:00:27 -0400 Received: from relay.sw.ru ([185.231.240.75]:39524) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hXldU-00012C-Im; Mon, 03 Jun 2019 08:00:22 -0400 Received: from [10.94.3.0] (helo=kvm.qa.sw.ru) by relay.sw.ru with esmtp (Exim 4.91) (envelope-from ) id 1hXldG-0002hc-Pt; Mon, 03 Jun 2019 15:00:07 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-devel@nongnu.org, qemu-block@nongnu.org Date: Mon, 3 Jun 2019 15:00:04 +0300 Message-Id: <20190603120005.37394-4-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20190603120005.37394-1-vsementsov@virtuozzo.com> References: <20190603120005.37394-1-vsementsov@virtuozzo.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 185.231.240.75 Subject: [Qemu-devel] [PATCH 3/4] qapi: implement block-dirty-bitmap-remove transaction action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, fam@euphon.net, vsementsov@virtuozzo.com, armbru@redhat.com, mreitz@redhat.com, nshirokovskiy@virtuozzo.com, den@openvz.org, jsnow@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" It is used to do transactional movement of the bitmap (which is possible in conjunction with merge command). Transactional bitmap movement is needed in scenarios with external snapshot, when we don't want to leave copy of the bitmap in the base image. Signed-off-by: Vladimir Sementsov-Ogievskiy --- qapi/transaction.json | 2 ++ blockdev.c | 74 +++++++++++++++++++++++++++++++++++++++---- 2 files changed, 70 insertions(+), 6 deletions(-) diff --git a/qapi/transaction.json b/qapi/transaction.json index 95edb78227..da95b804aa 100644 --- a/qapi/transaction.json +++ b/qapi/transaction.json @@ -45,6 +45,7 @@ # # - @abort: since 1.6 # - @block-dirty-bitmap-add: since 2.5 +# - @block-dirty-bitmap-remove: since 4.1 # - @block-dirty-bitmap-clear: since 2.5 # - @block-dirty-bitmap-enable: since 4.0 # - @block-dirty-bitmap-disable: since 4.0 @@ -61,6 +62,7 @@ 'data': { 'abort': 'Abort', 'block-dirty-bitmap-add': 'BlockDirtyBitmapAdd', + 'block-dirty-bitmap-remove': 'BlockDirtyBitmap', 'block-dirty-bitmap-clear': 'BlockDirtyBitmap', 'block-dirty-bitmap-enable': 'BlockDirtyBitmap', 'block-dirty-bitmap-disable': 'BlockDirtyBitmap', diff --git a/blockdev.c b/blockdev.c index 5b3eef0d3e..0d9aa7f0a1 100644 --- a/blockdev.c +++ b/blockdev.c @@ -2135,6 +2135,46 @@ static void block_dirty_bitmap_merge_prepare(BlkActi= onState *common, errp); } =20 +static BdrvDirtyBitmap *do_block_dirty_bitmap_remove( + const char *node, const char *name, bool release, + BlockDriverState **bitmap_bs, Error **errp); + +static void block_dirty_bitmap_remove_prepare(BlkActionState *common, + Error **errp) +{ + BlockDirtyBitmap *action; + BlockDirtyBitmapState *state =3D DO_UPCAST(BlockDirtyBitmapState, + common, common); + + if (action_check_completion_mode(common, errp) < 0) { + return; + } + + action =3D common->action->u.block_dirty_bitmap_remove.data; + + state->bitmap =3D do_block_dirty_bitmap_remove(action->node, action->n= ame, + false, &state->bs, errp); + if (state->bitmap) { + bdrv_dirty_bitmap_hide(state->bitmap); + } +} + +static void block_dirty_bitmap_remove_abort(BlkActionState *common) +{ + BlockDirtyBitmapState *state =3D DO_UPCAST(BlockDirtyBitmapState, + common, common); + + bdrv_dirty_bitmap_unhide(state->bitmap); +} + +static void block_dirty_bitmap_remove_commit(BlkActionState *common) +{ + BlockDirtyBitmapState *state =3D DO_UPCAST(BlockDirtyBitmapState, + common, common); + + bdrv_release_dirty_bitmap(state->bs, state->bitmap); +} + static void abort_prepare(BlkActionState *common, Error **errp) { error_setg(errp, "Transaction aborted using Abort action"); @@ -2212,6 +2252,12 @@ static const BlkActionOps actions[] =3D { .commit =3D block_dirty_bitmap_free_backup, .abort =3D block_dirty_bitmap_restore, }, + [TRANSACTION_ACTION_KIND_BLOCK_DIRTY_BITMAP_REMOVE] =3D { + .instance_size =3D sizeof(BlockDirtyBitmapState), + .prepare =3D block_dirty_bitmap_remove_prepare, + .commit =3D block_dirty_bitmap_remove_commit, + .abort =3D block_dirty_bitmap_remove_abort, + }, /* Where are transactions for MIRROR, COMMIT and STREAM? * Although these blockjobs use transaction callbacks like the backup = job, * these jobs do not necessarily adhere to transaction semantics. @@ -2870,20 +2916,21 @@ void qmp_block_dirty_bitmap_add(const char *node, c= onst char *name, bdrv_dirty_bitmap_set_persistence(bitmap, persistent); } =20 -void qmp_block_dirty_bitmap_remove(const char *node, const char *name, - Error **errp) +static BdrvDirtyBitmap *do_block_dirty_bitmap_remove( + const char *node, const char *name, bool release, + BlockDriverState **bitmap_bs, Error **errp) { BlockDriverState *bs; BdrvDirtyBitmap *bitmap; =20 bitmap =3D block_dirty_bitmap_lookup(node, name, &bs, errp); if (!bitmap || !bs) { - return; + return NULL; } =20 if (bdrv_dirty_bitmap_check(bitmap, BDRV_BITMAP_BUSY | BDRV_BITMAP_RO, errp)) { - return; + return NULL; } =20 if (bdrv_dirty_bitmap_get_persistence(bitmap)) { @@ -2893,13 +2940,28 @@ void qmp_block_dirty_bitmap_remove(const char *node= , const char *name, aio_context_acquire(aio_context); bdrv_remove_persistent_dirty_bitmap(bs, name, &local_err); aio_context_release(aio_context); + if (local_err !=3D NULL) { error_propagate(errp, local_err); - return; + return NULL; } } =20 - bdrv_release_dirty_bitmap(bs, bitmap); + if (release) { + bdrv_release_dirty_bitmap(bs, bitmap); + } + + if (bitmap_bs) { + *bitmap_bs =3D bs; + } + + return bitmap; +} + +void qmp_block_dirty_bitmap_remove(const char *node, const char *name, + Error **errp) +{ + do_block_dirty_bitmap_remove(node, name, true, NULL, errp); } =20 /** --=20 2.18.0