From nobody Sun May 12 19:34:54 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=yandex-team.ru ARC-Seal: i=1; a=rsa-sha256; t=1683731458; cv=none; d=zohomail.com; s=zohoarc; b=QJWZ42uzQdwiTd+T3DM4jZ/0jCqqPHiaFgz0odgRZb0loftOqHlKTrH18gFpOacjJtaMGSMZrO6NRZc94znYv3Lu5PtxxKn3c6TkPiQI6Ib87/hxSjwWh3xONMjZfB1kUf7Y/ejOEP0bapz9YzlhhA9lJ6WbGk29l/U8n0EIX8k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1683731458; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=MTlRdyeX7SAWp5qObXT2PxCfIliiyU/9oHNHKZ8jGDU=; b=ZHXvsIRxLBlFoY9APi9Oqxh9hq2bH98+zgnV5Wy46HFzgqusHCqagCpqgG+ws68uDnEGejhI9hGAhAMzYzcJzCAjc7xZXfwaXqpmpGr8mAtq5yiOV18Xb2UxVmuIHYootHv9VRN8WhiVFJyVrXYH2EPLXh2I2vPB7Uj7vOpRw4U= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1683731458225913.5576618616711; Wed, 10 May 2023 08:10:58 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pwlPD-0006qN-2b; Wed, 10 May 2023 11:07:03 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pwlP6-0006oL-Sl; Wed, 10 May 2023 11:06:56 -0400 Received: from forwardcorp1b.mail.yandex.net ([178.154.239.136]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pwlP0-0001TF-BU; Wed, 10 May 2023 11:06:56 -0400 Received: from mail-nwsmtp-smtp-corp-main-44.iva.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-44.iva.yp-c.yandex.net [IPv6:2a02:6b8:c0c:a884:0:640:947b:0]) by forwardcorp1b.mail.yandex.net (Yandex) with ESMTP id 23EEB5FE63; Wed, 10 May 2023 18:06:37 +0300 (MSK) Received: from vsementsov-nix.yandex-team.ru (unknown [2a02:6b8:b081:2::1:11]) by mail-nwsmtp-smtp-corp-main-44.iva.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id P6XgPR0OpqM0-GuUBQnY7; Wed, 10 May 2023 18:06:35 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1683731196; bh=MTlRdyeX7SAWp5qObXT2PxCfIliiyU/9oHNHKZ8jGDU=; h=Message-Id:Date:In-Reply-To:Cc:Subject:References:To:From; b=atuO7c2tfGNjpVvl9GZlw8ATyU9mtFJeQgh5sQVDJnaRMOJajnf8HouoEXyZPnj47 YzInyXdjYN7wMSuk6LLsP0xoRDjsV9Z1kFKdLX+PuaG0QMFW3EWwKwJRZMFagKXOrM AOin89bjW+xJ1hdoupw9AREqKjkuo8tumJaBHcZM= Authentication-Results: mail-nwsmtp-smtp-corp-main-44.iva.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Cc: qemu-devel@nongnu.org, kwolf@redhat.com, hreitz@redhat.com, vsementsov@yandex-team.ru, den@openvz.org, alexander.ivanov@virtuozzo.com Subject: [PATCH v9 1/6] blockdev: refactor transaction to use Transaction API Date: Wed, 10 May 2023 18:06:19 +0300 Message-Id: <20230510150624.310640-2-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230510150624.310640-1-vsementsov@yandex-team.ru> References: <20230510150624.310640-1-vsementsov@yandex-team.ru> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=178.154.239.136; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1b.mail.yandex.net X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1683731460138100003 Content-Type: text/plain; charset="utf-8" We are going to add more block-graph modifying transaction actions, and block-graph modifying functions are already based on Transaction API. Next, we'll need to separately update permissions after several graph-modifying actions, and this would be simple with help of Transaction API. So, now let's just transform what we have into new-style transaction actions. Signed-off-by: Vladimir Sementsov-Ogievskiy --- blockdev.c | 309 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 178 insertions(+), 131 deletions(-) diff --git a/blockdev.c b/blockdev.c index d7b5c18f0a..82e5b6905b 100644 --- a/blockdev.c +++ b/blockdev.c @@ -1200,10 +1200,7 @@ typedef struct BlkActionState BlkActionState; */ typedef struct BlkActionOps { size_t instance_size; - void (*prepare)(BlkActionState *common, Error **errp); - void (*commit)(BlkActionState *common); - void (*abort)(BlkActionState *common); - void (*clean)(BlkActionState *common); + void (*action)(BlkActionState *common, Transaction *tran, Error **errp= ); } BlkActionOps; =20 /** @@ -1235,6 +1232,12 @@ typedef struct InternalSnapshotState { bool created; } InternalSnapshotState; =20 +static void internal_snapshot_abort(void *opaque); +static void internal_snapshot_clean(void *opaque); +TransactionActionDrv internal_snapshot_drv =3D { + .abort =3D internal_snapshot_abort, + .clean =3D internal_snapshot_clean, +}; =20 static int action_check_completion_mode(BlkActionState *s, Error **errp) { @@ -1249,8 +1252,8 @@ static int action_check_completion_mode(BlkActionStat= e *s, Error **errp) return 0; } =20 -static void internal_snapshot_prepare(BlkActionState *common, - Error **errp) +static void internal_snapshot_action(BlkActionState *common, + Transaction *tran, Error **errp) { Error *local_err =3D NULL; const char *device; @@ -1269,6 +1272,8 @@ static void internal_snapshot_prepare(BlkActionState = *common, internal =3D common->action->u.blockdev_snapshot_internal_sync.data; state =3D DO_UPCAST(InternalSnapshotState, common, common); =20 + tran_add(tran, &internal_snapshot_drv, state); + /* 1. parse input */ device =3D internal->device; name =3D internal->name; @@ -1353,10 +1358,9 @@ out: aio_context_release(aio_context); } =20 -static void internal_snapshot_abort(BlkActionState *common) +static void internal_snapshot_abort(void *opaque) { - InternalSnapshotState *state =3D - DO_UPCAST(InternalSnapshotState, common, comm= on); + InternalSnapshotState *state =3D opaque; BlockDriverState *bs =3D state->bs; QEMUSnapshotInfo *sn =3D &state->sn; AioContext *aio_context; @@ -1380,10 +1384,9 @@ static void internal_snapshot_abort(BlkActionState *= common) aio_context_release(aio_context); } =20 -static void internal_snapshot_clean(BlkActionState *common) +static void internal_snapshot_clean(void *opaque) { - InternalSnapshotState *state =3D DO_UPCAST(InternalSnapshotState, - common, common); + g_autofree InternalSnapshotState *state =3D opaque; AioContext *aio_context; =20 if (!state->bs) { @@ -1406,8 +1409,17 @@ typedef struct ExternalSnapshotState { bool overlay_appended; } ExternalSnapshotState; =20 -static void external_snapshot_prepare(BlkActionState *common, - Error **errp) +static void external_snapshot_commit(void *opaque); +static void external_snapshot_abort(void *opaque); +static void external_snapshot_clean(void *opaque); +TransactionActionDrv external_snapshot_drv =3D { + .commit =3D external_snapshot_commit, + .abort =3D external_snapshot_abort, + .clean =3D external_snapshot_clean, +}; + +static void external_snapshot_action(BlkActionState *common, Transaction *= tran, + Error **errp) { int ret; int flags =3D 0; @@ -1426,6 +1438,8 @@ static void external_snapshot_prepare(BlkActionState = *common, AioContext *aio_context; uint64_t perm, shared; =20 + tran_add(tran, &external_snapshot_drv, state); + /* 'blockdev-snapshot' and 'blockdev-snapshot-sync' have similar * purpose but a different set of parameters */ switch (action->type) { @@ -1578,10 +1592,9 @@ out: aio_context_release(aio_context); } =20 -static void external_snapshot_commit(BlkActionState *common) +static void external_snapshot_commit(void *opaque) { - ExternalSnapshotState *state =3D - DO_UPCAST(ExternalSnapshotState, common, comm= on); + ExternalSnapshotState *state =3D opaque; AioContext *aio_context; =20 aio_context =3D bdrv_get_aio_context(state->old_bs); @@ -1597,10 +1610,9 @@ static void external_snapshot_commit(BlkActionState = *common) aio_context_release(aio_context); } =20 -static void external_snapshot_abort(BlkActionState *common) +static void external_snapshot_abort(void *opaque) { - ExternalSnapshotState *state =3D - DO_UPCAST(ExternalSnapshotState, common, comm= on); + ExternalSnapshotState *state =3D opaque; if (state->new_bs) { if (state->overlay_appended) { AioContext *aio_context; @@ -1640,10 +1652,9 @@ static void external_snapshot_abort(BlkActionState *= common) } } =20 -static void external_snapshot_clean(BlkActionState *common) +static void external_snapshot_clean(void *opaque) { - ExternalSnapshotState *state =3D - DO_UPCAST(ExternalSnapshotState, common, comm= on); + g_autofree ExternalSnapshotState *state =3D opaque; AioContext *aio_context; =20 if (!state->old_bs) { @@ -1671,7 +1682,17 @@ static BlockJob *do_backup_common(BackupCommon *back= up, AioContext *aio_context, JobTxn *txn, Error **errp); =20 -static void drive_backup_prepare(BlkActionState *common, Error **errp) +static void drive_backup_commit(void *opaque); +static void drive_backup_abort(void *opaque); +static void drive_backup_clean(void *opaque); +TransactionActionDrv drive_backup_drv =3D { + .commit =3D drive_backup_commit, + .abort =3D drive_backup_abort, + .clean =3D drive_backup_clean, +}; + +static void drive_backup_action(BlkActionState *common, Transaction *tran, + Error **errp) { DriveBackupState *state =3D DO_UPCAST(DriveBackupState, common, common= ); DriveBackup *backup; @@ -1688,6 +1709,8 @@ static void drive_backup_prepare(BlkActionState *comm= on, Error **errp) bool set_backing_hd =3D false; int ret; =20 + tran_add(tran, &drive_backup_drv, state); + assert(common->action->type =3D=3D TRANSACTION_ACTION_KIND_DRIVE_BACKU= P); backup =3D common->action->u.drive_backup.data; =20 @@ -1818,9 +1841,9 @@ out: aio_context_release(aio_context); } =20 -static void drive_backup_commit(BlkActionState *common) +static void drive_backup_commit(void *opaque) { - DriveBackupState *state =3D DO_UPCAST(DriveBackupState, common, common= ); + DriveBackupState *state =3D opaque; AioContext *aio_context; =20 aio_context =3D bdrv_get_aio_context(state->bs); @@ -1832,18 +1855,18 @@ static void drive_backup_commit(BlkActionState *com= mon) aio_context_release(aio_context); } =20 -static void drive_backup_abort(BlkActionState *common) +static void drive_backup_abort(void *opaque) { - DriveBackupState *state =3D DO_UPCAST(DriveBackupState, common, common= ); + DriveBackupState *state =3D opaque; =20 if (state->job) { job_cancel_sync(&state->job->job, true); } } =20 -static void drive_backup_clean(BlkActionState *common) +static void drive_backup_clean(void *opaque) { - DriveBackupState *state =3D DO_UPCAST(DriveBackupState, common, common= ); + g_autofree DriveBackupState *state =3D opaque; AioContext *aio_context; =20 if (!state->bs) { @@ -1864,7 +1887,17 @@ typedef struct BlockdevBackupState { BlockJob *job; } BlockdevBackupState; =20 -static void blockdev_backup_prepare(BlkActionState *common, Error **errp) +static void blockdev_backup_commit(void *opaque); +static void blockdev_backup_abort(void *opaque); +static void blockdev_backup_clean(void *opaque); +TransactionActionDrv blockdev_backup_drv =3D { + .commit =3D blockdev_backup_commit, + .abort =3D blockdev_backup_abort, + .clean =3D blockdev_backup_clean, +}; + +static void blockdev_backup_action(BlkActionState *common, Transaction *tr= an, + Error **errp) { BlockdevBackupState *state =3D DO_UPCAST(BlockdevBackupState, common, = common); BlockdevBackup *backup; @@ -1874,6 +1907,8 @@ static void blockdev_backup_prepare(BlkActionState *c= ommon, Error **errp) AioContext *old_context; int ret; =20 + tran_add(tran, &blockdev_backup_drv, state); + assert(common->action->type =3D=3D TRANSACTION_ACTION_KIND_BLOCKDEV_BA= CKUP); backup =3D common->action->u.blockdev_backup.data; =20 @@ -1912,9 +1947,9 @@ static void blockdev_backup_prepare(BlkActionState *c= ommon, Error **errp) aio_context_release(aio_context); } =20 -static void blockdev_backup_commit(BlkActionState *common) +static void blockdev_backup_commit(void *opaque) { - BlockdevBackupState *state =3D DO_UPCAST(BlockdevBackupState, common, = common); + BlockdevBackupState *state =3D opaque; AioContext *aio_context; =20 aio_context =3D bdrv_get_aio_context(state->bs); @@ -1926,18 +1961,18 @@ static void blockdev_backup_commit(BlkActionState *= common) aio_context_release(aio_context); } =20 -static void blockdev_backup_abort(BlkActionState *common) +static void blockdev_backup_abort(void *opaque) { - BlockdevBackupState *state =3D DO_UPCAST(BlockdevBackupState, common, = common); + BlockdevBackupState *state =3D opaque; =20 if (state->job) { job_cancel_sync(&state->job->job, true); } } =20 -static void blockdev_backup_clean(BlkActionState *common) +static void blockdev_backup_clean(void *opaque) { - BlockdevBackupState *state =3D DO_UPCAST(BlockdevBackupState, common, = common); + g_autofree BlockdevBackupState *state =3D opaque; AioContext *aio_context; =20 if (!state->bs) { @@ -1961,14 +1996,22 @@ typedef struct BlockDirtyBitmapState { bool was_enabled; } BlockDirtyBitmapState; =20 -static void block_dirty_bitmap_add_prepare(BlkActionState *common, - Error **errp) +static void block_dirty_bitmap_add_abort(void *opaque); +TransactionActionDrv block_dirty_bitmap_add_drv =3D { + .abort =3D block_dirty_bitmap_add_abort, + .clean =3D g_free, +}; + +static void block_dirty_bitmap_add_action(BlkActionState *common, + Transaction *tran, Error **errp) { Error *local_err =3D NULL; BlockDirtyBitmapAdd *action; BlockDirtyBitmapState *state =3D DO_UPCAST(BlockDirtyBitmapState, common, common); =20 + tran_add(tran, &block_dirty_bitmap_add_drv, state); + if (action_check_completion_mode(common, errp) < 0) { return; } @@ -1988,13 +2031,12 @@ static void block_dirty_bitmap_add_prepare(BlkActio= nState *common, } } =20 -static void block_dirty_bitmap_add_abort(BlkActionState *common) +static void block_dirty_bitmap_add_abort(void *opaque) { BlockDirtyBitmapAdd *action; - BlockDirtyBitmapState *state =3D DO_UPCAST(BlockDirtyBitmapState, - common, common); + BlockDirtyBitmapState *state =3D opaque; =20 - action =3D common->action->u.block_dirty_bitmap_add.data; + action =3D state->common.action->u.block_dirty_bitmap_add.data; /* Should not be able to fail: IF the bitmap was added via .prepare(), * then the node reference and bitmap name must have been valid. */ @@ -2003,13 +2045,23 @@ static void block_dirty_bitmap_add_abort(BlkActionS= tate *common) } } =20 -static void block_dirty_bitmap_clear_prepare(BlkActionState *common, - Error **errp) +static void block_dirty_bitmap_restore(void *opaque); +static void block_dirty_bitmap_free_backup(void *opaque); +TransactionActionDrv block_dirty_bitmap_clear_drv =3D { + .abort =3D block_dirty_bitmap_restore, + .commit =3D block_dirty_bitmap_free_backup, + .clean =3D g_free, +}; + +static void block_dirty_bitmap_clear_action(BlkActionState *common, + Transaction *tran, Error **err= p) { BlockDirtyBitmapState *state =3D DO_UPCAST(BlockDirtyBitmapState, common, common); BlockDirtyBitmap *action; =20 + tran_add(tran, &block_dirty_bitmap_clear_drv, state); + if (action_check_completion_mode(common, errp) < 0) { return; } @@ -2030,31 +2082,37 @@ static void block_dirty_bitmap_clear_prepare(BlkAct= ionState *common, bdrv_clear_dirty_bitmap(state->bitmap, &state->backup); } =20 -static void block_dirty_bitmap_restore(BlkActionState *common) +static void block_dirty_bitmap_restore(void *opaque) { - BlockDirtyBitmapState *state =3D DO_UPCAST(BlockDirtyBitmapState, - common, common); + BlockDirtyBitmapState *state =3D opaque; =20 if (state->backup) { bdrv_restore_dirty_bitmap(state->bitmap, state->backup); } } =20 -static void block_dirty_bitmap_free_backup(BlkActionState *common) +static void block_dirty_bitmap_free_backup(void *opaque) { - BlockDirtyBitmapState *state =3D DO_UPCAST(BlockDirtyBitmapState, - common, common); + BlockDirtyBitmapState *state =3D opaque; =20 hbitmap_free(state->backup); } =20 -static void block_dirty_bitmap_enable_prepare(BlkActionState *common, - Error **errp) +static void block_dirty_bitmap_enable_abort(void *opaque); +TransactionActionDrv block_dirty_bitmap_enable_drv =3D { + .abort =3D block_dirty_bitmap_enable_abort, + .clean =3D g_free, +}; + +static void block_dirty_bitmap_enable_action(BlkActionState *common, + Transaction *tran, Error **er= rp) { BlockDirtyBitmap *action; BlockDirtyBitmapState *state =3D DO_UPCAST(BlockDirtyBitmapState, common, common); =20 + tran_add(tran, &block_dirty_bitmap_enable_drv, state); + if (action_check_completion_mode(common, errp) < 0) { return; } @@ -2076,23 +2134,30 @@ static void block_dirty_bitmap_enable_prepare(BlkAc= tionState *common, bdrv_enable_dirty_bitmap(state->bitmap); } =20 -static void block_dirty_bitmap_enable_abort(BlkActionState *common) +static void block_dirty_bitmap_enable_abort(void *opaque) { - BlockDirtyBitmapState *state =3D DO_UPCAST(BlockDirtyBitmapState, - common, common); + BlockDirtyBitmapState *state =3D opaque; =20 if (!state->was_enabled) { bdrv_disable_dirty_bitmap(state->bitmap); } } =20 -static void block_dirty_bitmap_disable_prepare(BlkActionState *common, - Error **errp) +static void block_dirty_bitmap_disable_abort(void *opaque); +TransactionActionDrv block_dirty_bitmap_disable_drv =3D { + .abort =3D block_dirty_bitmap_disable_abort, + .clean =3D g_free, +}; + +static void block_dirty_bitmap_disable_action(BlkActionState *common, + Transaction *tran, Error **e= rrp) { BlockDirtyBitmap *action; BlockDirtyBitmapState *state =3D DO_UPCAST(BlockDirtyBitmapState, common, common); =20 + tran_add(tran, &block_dirty_bitmap_disable_drv, state); + if (action_check_completion_mode(common, errp) < 0) { return; } @@ -2114,23 +2179,30 @@ static void block_dirty_bitmap_disable_prepare(BlkA= ctionState *common, bdrv_disable_dirty_bitmap(state->bitmap); } =20 -static void block_dirty_bitmap_disable_abort(BlkActionState *common) +static void block_dirty_bitmap_disable_abort(void *opaque) { - BlockDirtyBitmapState *state =3D DO_UPCAST(BlockDirtyBitmapState, - common, common); + BlockDirtyBitmapState *state =3D opaque; =20 if (state->was_enabled) { bdrv_enable_dirty_bitmap(state->bitmap); } } =20 -static void block_dirty_bitmap_merge_prepare(BlkActionState *common, - Error **errp) +TransactionActionDrv block_dirty_bitmap_merge_drv =3D { + .commit =3D block_dirty_bitmap_free_backup, + .abort =3D block_dirty_bitmap_restore, + .clean =3D g_free, +}; + +static void block_dirty_bitmap_merge_action(BlkActionState *common, + Transaction *tran, Error **err= p) { BlockDirtyBitmapMerge *action; BlockDirtyBitmapState *state =3D DO_UPCAST(BlockDirtyBitmapState, common, common); =20 + tran_add(tran, &block_dirty_bitmap_merge_drv, state); + if (action_check_completion_mode(common, errp) < 0) { return; } @@ -2142,13 +2214,23 @@ static void block_dirty_bitmap_merge_prepare(BlkAct= ionState *common, errp); } =20 -static void block_dirty_bitmap_remove_prepare(BlkActionState *common, - Error **errp) +static void block_dirty_bitmap_remove_commit(void *opaque); +static void block_dirty_bitmap_remove_abort(void *opaque); +TransactionActionDrv block_dirty_bitmap_remove_drv =3D { + .commit =3D block_dirty_bitmap_remove_commit, + .abort =3D block_dirty_bitmap_remove_abort, + .clean =3D g_free, +}; + +static void block_dirty_bitmap_remove_action(BlkActionState *common, + Transaction *tran, Error **er= rp) { BlockDirtyBitmap *action; BlockDirtyBitmapState *state =3D DO_UPCAST(BlockDirtyBitmapState, common, common); =20 + tran_add(tran, &block_dirty_bitmap_remove_drv, state); + if (action_check_completion_mode(common, errp) < 0) { return; } @@ -2163,10 +2245,9 @@ static void block_dirty_bitmap_remove_prepare(BlkAct= ionState *common, } } =20 -static void block_dirty_bitmap_remove_abort(BlkActionState *common) +static void block_dirty_bitmap_remove_abort(void *opaque) { - BlockDirtyBitmapState *state =3D DO_UPCAST(BlockDirtyBitmapState, - common, common); + BlockDirtyBitmapState *state =3D opaque; =20 if (state->bitmap) { bdrv_dirty_bitmap_skip_store(state->bitmap, false); @@ -2174,21 +2255,28 @@ static void block_dirty_bitmap_remove_abort(BlkActi= onState *common) } } =20 -static void block_dirty_bitmap_remove_commit(BlkActionState *common) +static void block_dirty_bitmap_remove_commit(void *opaque) { - BlockDirtyBitmapState *state =3D DO_UPCAST(BlockDirtyBitmapState, - common, common); + BlockDirtyBitmapState *state =3D opaque; =20 bdrv_dirty_bitmap_set_busy(state->bitmap, false); bdrv_release_dirty_bitmap(state->bitmap); } =20 -static void abort_prepare(BlkActionState *common, Error **errp) +static void abort_commit(void *opaque); +TransactionActionDrv abort_drv =3D { + .commit =3D abort_commit, + .clean =3D g_free, +}; + +static void abort_action(BlkActionState *common, Transaction *tran, + Error **errp) { + tran_add(tran, &abort_drv, common); error_setg(errp, "Transaction aborted using Abort action"); } =20 -static void abort_commit(BlkActionState *common) +static void abort_commit(void *opaque) { g_assert_not_reached(); /* this action never succeeds */ } @@ -2196,75 +2284,51 @@ static void abort_commit(BlkActionState *common) static const BlkActionOps actions[] =3D { [TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT] =3D { .instance_size =3D sizeof(ExternalSnapshotState), - .prepare =3D external_snapshot_prepare, - .commit =3D external_snapshot_commit, - .abort =3D external_snapshot_abort, - .clean =3D external_snapshot_clean, + .action =3D external_snapshot_action, }, [TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_SYNC] =3D { .instance_size =3D sizeof(ExternalSnapshotState), - .prepare =3D external_snapshot_prepare, - .commit =3D external_snapshot_commit, - .abort =3D external_snapshot_abort, - .clean =3D external_snapshot_clean, + .action =3D external_snapshot_action, }, [TRANSACTION_ACTION_KIND_DRIVE_BACKUP] =3D { .instance_size =3D sizeof(DriveBackupState), - .prepare =3D drive_backup_prepare, - .commit =3D drive_backup_commit, - .abort =3D drive_backup_abort, - .clean =3D drive_backup_clean, + .action =3D drive_backup_action, }, [TRANSACTION_ACTION_KIND_BLOCKDEV_BACKUP] =3D { .instance_size =3D sizeof(BlockdevBackupState), - .prepare =3D blockdev_backup_prepare, - .commit =3D blockdev_backup_commit, - .abort =3D blockdev_backup_abort, - .clean =3D blockdev_backup_clean, + .action =3D blockdev_backup_action, }, [TRANSACTION_ACTION_KIND_ABORT] =3D { .instance_size =3D sizeof(BlkActionState), - .prepare =3D abort_prepare, - .commit =3D abort_commit, + .action =3D abort_action, }, [TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_INTERNAL_SYNC] =3D { .instance_size =3D sizeof(InternalSnapshotState), - .prepare =3D internal_snapshot_prepare, - .abort =3D internal_snapshot_abort, - .clean =3D internal_snapshot_clean, + .action =3D internal_snapshot_action, }, [TRANSACTION_ACTION_KIND_BLOCK_DIRTY_BITMAP_ADD] =3D { .instance_size =3D sizeof(BlockDirtyBitmapState), - .prepare =3D block_dirty_bitmap_add_prepare, - .abort =3D block_dirty_bitmap_add_abort, + .action =3D block_dirty_bitmap_add_action, }, [TRANSACTION_ACTION_KIND_BLOCK_DIRTY_BITMAP_CLEAR] =3D { .instance_size =3D sizeof(BlockDirtyBitmapState), - .prepare =3D block_dirty_bitmap_clear_prepare, - .commit =3D block_dirty_bitmap_free_backup, - .abort =3D block_dirty_bitmap_restore, + .action =3D block_dirty_bitmap_clear_action, }, [TRANSACTION_ACTION_KIND_BLOCK_DIRTY_BITMAP_ENABLE] =3D { .instance_size =3D sizeof(BlockDirtyBitmapState), - .prepare =3D block_dirty_bitmap_enable_prepare, - .abort =3D block_dirty_bitmap_enable_abort, + .action =3D block_dirty_bitmap_enable_action, }, [TRANSACTION_ACTION_KIND_BLOCK_DIRTY_BITMAP_DISABLE] =3D { .instance_size =3D sizeof(BlockDirtyBitmapState), - .prepare =3D block_dirty_bitmap_disable_prepare, - .abort =3D block_dirty_bitmap_disable_abort, + .action =3D block_dirty_bitmap_disable_action, }, [TRANSACTION_ACTION_KIND_BLOCK_DIRTY_BITMAP_MERGE] =3D { .instance_size =3D sizeof(BlockDirtyBitmapState), - .prepare =3D block_dirty_bitmap_merge_prepare, - .commit =3D block_dirty_bitmap_free_backup, - .abort =3D block_dirty_bitmap_restore, + .action =3D block_dirty_bitmap_merge_action, }, [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, + .action =3D block_dirty_bitmap_remove_action, }, /* Where are transactions for MIRROR, COMMIT and STREAM? * Although these blockjobs use transaction callbacks like the backup = job, @@ -2306,14 +2370,11 @@ void qmp_transaction(TransactionActionList *dev_lis= t, TransactionActionList *dev_entry =3D dev_list; bool has_props =3D !!props; JobTxn *block_job_txn =3D NULL; - BlkActionState *state, *next; Error *local_err =3D NULL; + Transaction *tran =3D tran_new(); =20 GLOBAL_STATE_CODE(); =20 - QTAILQ_HEAD(, BlkActionState) snap_bdrv_states; - QTAILQ_INIT(&snap_bdrv_states); - /* Does this transaction get canceled as a group on failure? * If not, we don't really need to make a JobTxn. */ @@ -2329,6 +2390,7 @@ void qmp_transaction(TransactionActionList *dev_list, while (NULL !=3D dev_entry) { TransactionAction *dev_info =3D NULL; const BlkActionOps *ops; + BlkActionState *state; =20 dev_info =3D dev_entry->value; dev_entry =3D dev_entry->next; @@ -2343,38 +2405,23 @@ void qmp_transaction(TransactionActionList *dev_lis= t, state->action =3D dev_info; state->block_job_txn =3D block_job_txn; state->txn_props =3D props; - QTAILQ_INSERT_TAIL(&snap_bdrv_states, state, entry); =20 - state->ops->prepare(state, &local_err); + state->ops->action(state, tran, &local_err); if (local_err) { error_propagate(errp, local_err); goto delete_and_fail; } } =20 - QTAILQ_FOREACH(state, &snap_bdrv_states, entry) { - if (state->ops->commit) { - state->ops->commit(state); - } - } + tran_commit(tran); =20 /* success */ goto exit; =20 delete_and_fail: /* failure, and it is all-or-none; roll back all operations */ - QTAILQ_FOREACH_REVERSE(state, &snap_bdrv_states, entry) { - if (state->ops->abort) { - state->ops->abort(state); - } - } + tran_abort(tran); exit: - QTAILQ_FOREACH_SAFE(state, &snap_bdrv_states, entry, next) { - if (state->ops->clean) { - state->ops->clean(state); - } - g_free(state); - } if (!has_props) { qapi_free_TransactionProperties(props); } --=20 2.34.1 From nobody Sun May 12 19:34:54 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=yandex-team.ru ARC-Seal: i=1; a=rsa-sha256; t=1683731241; cv=none; d=zohomail.com; s=zohoarc; b=AUxPi5wXL3YPNkAfsqLBMYDJRHlbtbWmnzQGGlklJqLwrzvTXK6KoTvV7C+fv+2Vzy3IpWvWcAPaiibYT7PGJzOrofDX+bXTSRZJyx/2ryxlIQnaMYk+9kTGGzi2APZ+OEXOxezl3ekyrod3IqYU+mZeK0TvQMjCboH/FJ73jYI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1683731241; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=465Y2GCAk0u1xjDhcIluHJncr/ojQOcPTtUz0nyztJg=; b=SATwYRKsF+64QnfCewGtrtso6CfVqBEi7LUEPic+X4Q9lvIeVmFXBFEKhye6VYoP98N+qCZkrW5dGNfyMW9BvwpRwyDorh3NRiiBm9jFP/U6N6HrgUgY+unL5nnWDmP8qYbZJHwVEuFPbEww3dePhe6i7Hr0DWnkFxusxZKAtb4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1683731241034408.84923176526877; Wed, 10 May 2023 08:07:21 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pwlPB-0006on-7z; Wed, 10 May 2023 11:07:01 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pwlP5-0006nH-JN; Wed, 10 May 2023 11:06:55 -0400 Received: from forwardcorp1b.mail.yandex.net ([2a02:6b8:c02:900:1:45:d181:df01]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pwlP0-0001TH-Bk; Wed, 10 May 2023 11:06:55 -0400 Received: from mail-nwsmtp-smtp-corp-main-44.iva.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-44.iva.yp-c.yandex.net [IPv6:2a02:6b8:c0c:a884:0:640:947b:0]) by forwardcorp1b.mail.yandex.net (Yandex) with ESMTP id 35E67600FD; Wed, 10 May 2023 18:06:38 +0300 (MSK) Received: from vsementsov-nix.yandex-team.ru (unknown [2a02:6b8:b081:2::1:11]) by mail-nwsmtp-smtp-corp-main-44.iva.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id P6XgPR0OpqM0-Dsht6kRv; Wed, 10 May 2023 18:06:37 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1683731197; bh=465Y2GCAk0u1xjDhcIluHJncr/ojQOcPTtUz0nyztJg=; h=Message-Id:Date:In-Reply-To:Cc:Subject:References:To:From; b=M/k6UngCz/I2OiIoIHUp29PkQuS3wmFCANqFXg3MJiXdci24Wvz0+0y0QQc3MKFii DedHvYzEmHq8YMNjQrcJXvxGW55m9Yrxv51OmbyEK3HYd/+yFe9YgoM+DJ5U4RUsL5 okLSu4hchib7/qIGRg253QKIjd66WzGIS4gzjgEo= Authentication-Results: mail-nwsmtp-smtp-corp-main-44.iva.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Cc: qemu-devel@nongnu.org, kwolf@redhat.com, hreitz@redhat.com, vsementsov@yandex-team.ru, den@openvz.org, alexander.ivanov@virtuozzo.com Subject: [PATCH v9 2/6] blockdev: transactions: rename some things Date: Wed, 10 May 2023 18:06:20 +0300 Message-Id: <20230510150624.310640-3-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230510150624.310640-1-vsementsov@yandex-team.ru> References: <20230510150624.310640-1-vsementsov@yandex-team.ru> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=2a02:6b8:c02:900:1:45:d181:df01; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1b.mail.yandex.net X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1683731243975100001 Content-Type: text/plain; charset="utf-8" Look at qmp_transaction(): dev_list is not obvious name for list of actions. Let's look at qapi spec, this argument is "actions". Let's follow the common practice of using same argument names in qapi scheme and code. To be honest, rename props to properties for same reason. Next, we have to rename global map of actions, to not conflict with new name for function argument. Rename also dev_entry loop variable accordingly to new name of the list. Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Kevin Wolf --- blockdev.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/blockdev.c b/blockdev.c index 82e5b6905b..f72084d206 100644 --- a/blockdev.c +++ b/blockdev.c @@ -2281,7 +2281,7 @@ static void abort_commit(void *opaque) g_assert_not_reached(); /* this action never succeeds */ } =20 -static const BlkActionOps actions[] =3D { +static const BlkActionOps actions_map[] =3D { [TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT] =3D { .instance_size =3D sizeof(ExternalSnapshotState), .action =3D external_snapshot_action, @@ -2363,12 +2363,12 @@ static TransactionProperties *get_transaction_prope= rties( * * Always run under BQL. */ -void qmp_transaction(TransactionActionList *dev_list, - struct TransactionProperties *props, +void qmp_transaction(TransactionActionList *actions, + struct TransactionProperties *properties, Error **errp) { - TransactionActionList *dev_entry =3D dev_list; - bool has_props =3D !!props; + TransactionActionList *act =3D actions; + bool has_properties =3D !!properties; JobTxn *block_job_txn =3D NULL; Error *local_err =3D NULL; Transaction *tran =3D tran_new(); @@ -2378,8 +2378,8 @@ void qmp_transaction(TransactionActionList *dev_list, /* Does this transaction get canceled as a group on failure? * If not, we don't really need to make a JobTxn. */ - props =3D get_transaction_properties(props); - if (props->completion_mode !=3D ACTION_COMPLETION_MODE_INDIVIDUAL) { + properties =3D get_transaction_properties(properties); + if (properties->completion_mode !=3D ACTION_COMPLETION_MODE_INDIVIDUAL= ) { block_job_txn =3D job_txn_new(); } =20 @@ -2387,24 +2387,24 @@ void qmp_transaction(TransactionActionList *dev_lis= t, bdrv_drain_all(); =20 /* We don't do anything in this loop that commits us to the operations= */ - while (NULL !=3D dev_entry) { + while (NULL !=3D act) { TransactionAction *dev_info =3D NULL; const BlkActionOps *ops; BlkActionState *state; =20 - dev_info =3D dev_entry->value; - dev_entry =3D dev_entry->next; + dev_info =3D act->value; + act =3D act->next; =20 - assert(dev_info->type < ARRAY_SIZE(actions)); + assert(dev_info->type < ARRAY_SIZE(actions_map)); =20 - ops =3D &actions[dev_info->type]; + ops =3D &actions_map[dev_info->type]; assert(ops->instance_size > 0); =20 state =3D g_malloc0(ops->instance_size); state->ops =3D ops; state->action =3D dev_info; state->block_job_txn =3D block_job_txn; - state->txn_props =3D props; + state->txn_props =3D properties; =20 state->ops->action(state, tran, &local_err); if (local_err) { @@ -2422,8 +2422,8 @@ delete_and_fail: /* failure, and it is all-or-none; roll back all operations */ tran_abort(tran); exit: - if (!has_props) { - qapi_free_TransactionProperties(props); + if (!has_properties) { + qapi_free_TransactionProperties(properties); } job_txn_unref(block_job_txn); } --=20 2.34.1 From nobody Sun May 12 19:34:54 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=yandex-team.ru ARC-Seal: i=1; a=rsa-sha256; t=1683731319; cv=none; d=zohomail.com; s=zohoarc; b=jvzvIWVMGvK/3AEyl+RbbLCXCdhLzz099MWs4wY3u/2ShRQ1r8UksiL5yD+T+PgapObnCSKN3YKZTviUl2ME/31GtZ7br6mOD1zi8Y4NIYLOMXyauS7fCScC9FRQ6b6nCAD8osyhKWTxAKNQJjLhdbi7JjiW7xDkVuGiUkKLhJU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1683731319; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=nvoPU4S7do5RGX01Rb8JMhvLZHytwNpwMwx5W9ccy6I=; b=cfO8X62LU+X/mvxnTCoCWqRG8+U74fjEuT0e5j6lkPrzLCUCbfAUUEYgFcv3wSyr4u0hZH9sdzuwT5/iC+wywviR/iIZN594Ktk9BkgxWT2rTvCw6X9FUg1f98jIdC8xoFK2OPQP0dAPJXpiNsD3VoFLZyVhpmln9bsDkQ8cKCo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1683731319083388.59686456482893; Wed, 10 May 2023 08:08:39 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pwlPE-0006rL-4c; Wed, 10 May 2023 11:07:04 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pwlPC-0006q0-0E; Wed, 10 May 2023 11:07:02 -0400 Received: from forwardcorp1c.mail.yandex.net ([2a02:6b8:c03:500:1:45:d181:df01]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pwlP0-0001TQ-BV; Wed, 10 May 2023 11:07:01 -0400 Received: from mail-nwsmtp-smtp-corp-main-44.iva.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-44.iva.yp-c.yandex.net [IPv6:2a02:6b8:c0c:a884:0:640:947b:0]) by forwardcorp1c.mail.yandex.net (Yandex) with ESMTP id 0731D5EC41; Wed, 10 May 2023 18:06:39 +0300 (MSK) Received: from vsementsov-nix.yandex-team.ru (unknown [2a02:6b8:b081:2::1:11]) by mail-nwsmtp-smtp-corp-main-44.iva.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id P6XgPR0OpqM0-NZaHfJiA; Wed, 10 May 2023 18:06:38 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1683731198; bh=nvoPU4S7do5RGX01Rb8JMhvLZHytwNpwMwx5W9ccy6I=; h=Message-Id:Date:In-Reply-To:Cc:Subject:References:To:From; b=lWsz/EANzQlx1nGycEkLOqDqJd9ZYeSzpqYDR2AUHvTO8iVyc7eP+sLvz265zb5jK iC3zrOAAjKYZKWPzN3wiQxkhGkkhw9eW75v/1g8mejMP1wx7Ipfrn98H2rJouXPM/D eFCRkbcJu04BNCuQ/FitGBANrhHcDXk+cpzywXIk= Authentication-Results: mail-nwsmtp-smtp-corp-main-44.iva.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Cc: qemu-devel@nongnu.org, kwolf@redhat.com, hreitz@redhat.com, vsementsov@yandex-team.ru, den@openvz.org, alexander.ivanov@virtuozzo.com Subject: [PATCH v9 3/6] blockdev: qmp_transaction: refactor loop to classic for Date: Wed, 10 May 2023 18:06:21 +0300 Message-Id: <20230510150624.310640-4-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230510150624.310640-1-vsementsov@yandex-team.ru> References: <20230510150624.310640-1-vsementsov@yandex-team.ru> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=2a02:6b8:c03:500:1:45:d181:df01; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1c.mail.yandex.net X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1683731320228100003 Content-Type: text/plain; charset="utf-8" Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Kevin Wolf --- blockdev.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/blockdev.c b/blockdev.c index f72084d206..f236e5c27e 100644 --- a/blockdev.c +++ b/blockdev.c @@ -2367,7 +2367,7 @@ void qmp_transaction(TransactionActionList *actions, struct TransactionProperties *properties, Error **errp) { - TransactionActionList *act =3D actions; + TransactionActionList *act; bool has_properties =3D !!properties; JobTxn *block_job_txn =3D NULL; Error *local_err =3D NULL; @@ -2387,14 +2387,11 @@ void qmp_transaction(TransactionActionList *actions, bdrv_drain_all(); =20 /* We don't do anything in this loop that commits us to the operations= */ - while (NULL !=3D act) { - TransactionAction *dev_info =3D NULL; + for (act =3D actions; act; act =3D act->next) { + TransactionAction *dev_info =3D act->value; const BlkActionOps *ops; BlkActionState *state; =20 - dev_info =3D act->value; - act =3D act->next; - assert(dev_info->type < ARRAY_SIZE(actions_map)); =20 ops =3D &actions_map[dev_info->type]; --=20 2.34.1 From nobody Sun May 12 19:34:54 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=yandex-team.ru ARC-Seal: i=1; a=rsa-sha256; t=1683731423; cv=none; d=zohomail.com; s=zohoarc; b=K4TCI9TtQxdCKhulrLIDx5itr/NWRpTasLu4ZBJf2Me8sVolQGHGJme+FbIzU8WpRlZvPs19AJSPA2vQCJLJAsyiTddQ4dYkEI5riW0Kh+8sgU0/nkzBQ9JyE4O6+xTuLlYvMYIkgP+6EnDfC5DDTQRmVKHXqkufRIZJZgIkVjo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1683731423; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=r8f/te8QM4q750DKav1zHKpgLx0MD/WBl5noJ8ZqNes=; b=G2qOgf1hvRPlG9lJHQ4bA7FAH4V0K0apv6wD9JeOgMSZhoetNWmqwplwH3yXgSlmgppd7gvJL8AF5QAiiefvwpoqOZGCiLUyv/KksupC+tfjd33Iae+YZ/n4tkj4WrkmQhHRTvSg/nvn7Ir7EG1BH2r4lKGeGFJSopXGRsAcBv4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1683731423582149.33741843612574; Wed, 10 May 2023 08:10:23 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pwlPE-0006s0-NP; Wed, 10 May 2023 11:07:04 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pwlP7-0006p0-Hk; Wed, 10 May 2023 11:07:01 -0400 Received: from forwardcorp1c.mail.yandex.net ([2a02:6b8:c03:500:1:45:d181:df01]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pwlP0-0001Td-Bj; Wed, 10 May 2023 11:06:57 -0400 Received: from mail-nwsmtp-smtp-corp-main-44.iva.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-44.iva.yp-c.yandex.net [IPv6:2a02:6b8:c0c:a884:0:640:947b:0]) by forwardcorp1c.mail.yandex.net (Yandex) with ESMTP id EB06C5EC4E; Wed, 10 May 2023 18:06:39 +0300 (MSK) Received: from vsementsov-nix.yandex-team.ru (unknown [2a02:6b8:b081:2::1:11]) by mail-nwsmtp-smtp-corp-main-44.iva.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id P6XgPR0OpqM0-ZwutVvAc; Wed, 10 May 2023 18:06:39 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1683731199; bh=r8f/te8QM4q750DKav1zHKpgLx0MD/WBl5noJ8ZqNes=; h=Message-Id:Date:In-Reply-To:Cc:Subject:References:To:From; b=dqIqkichS8NHBfaB/fwQK319++/3K1ZiEyQN+93Q9RAgePzeRRa1y5fkN3qMUUSdk waCCuEbReTdqRFy0jwXVAcgXSVZxF9nDAwjKyJ+68jOBCRRkmjL87GMoFYW90kLsZ5 EB0sLbcaXtx7OoxyEdXFGXV2smNAq3jZZ+1Zt0ik= Authentication-Results: mail-nwsmtp-smtp-corp-main-44.iva.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Cc: qemu-devel@nongnu.org, kwolf@redhat.com, hreitz@redhat.com, vsementsov@yandex-team.ru, den@openvz.org, alexander.ivanov@virtuozzo.com Subject: [PATCH v9 4/6] blockdev: transaction: refactor handling transaction properties Date: Wed, 10 May 2023 18:06:22 +0300 Message-Id: <20230510150624.310640-5-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230510150624.310640-1-vsementsov@yandex-team.ru> References: <20230510150624.310640-1-vsementsov@yandex-team.ru> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=2a02:6b8:c03:500:1:45:d181:df01; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1c.mail.yandex.net X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1683731424182100001 Content-Type: text/plain; charset="utf-8" Only backup supports GROUPED mode. Make this logic more clear. And avoid passing extra thing to each action. Signed-off-by: Vladimir Sementsov-Ogievskiy --- blockdev.c | 96 +++++++++++++----------------------------------------- 1 file changed, 22 insertions(+), 74 deletions(-) diff --git a/blockdev.c b/blockdev.c index f236e5c27e..6bcf80b18b 100644 --- a/blockdev.c +++ b/blockdev.c @@ -1220,7 +1220,6 @@ struct BlkActionState { TransactionAction *action; const BlkActionOps *ops; JobTxn *block_job_txn; - TransactionProperties *txn_props; QTAILQ_ENTRY(BlkActionState) entry; }; =20 @@ -1239,19 +1238,6 @@ TransactionActionDrv internal_snapshot_drv =3D { .clean =3D internal_snapshot_clean, }; =20 -static int action_check_completion_mode(BlkActionState *s, Error **errp) -{ - if (s->txn_props->completion_mode !=3D ACTION_COMPLETION_MODE_INDIVIDU= AL) { - error_setg(errp, - "Action '%s' does not support Transaction property " - "completion-mode =3D %s", - TransactionActionKind_str(s->action->type), - ActionCompletionMode_str(s->txn_props->completion_mode)= ); - return -1; - } - return 0; -} - static void internal_snapshot_action(BlkActionState *common, Transaction *tran, Error **errp) { @@ -1274,15 +1260,9 @@ static void internal_snapshot_action(BlkActionState = *common, =20 tran_add(tran, &internal_snapshot_drv, state); =20 - /* 1. parse input */ device =3D internal->device; name =3D internal->name; =20 - /* 2. check for validation */ - if (action_check_completion_mode(common, errp) < 0) { - return; - } - bs =3D qmp_get_root_bs(device, errp); if (!bs) { return; @@ -1466,9 +1446,6 @@ static void external_snapshot_action(BlkActionState *= common, Transaction *tran, } =20 /* start processing */ - if (action_check_completion_mode(common, errp) < 0) { - return; - } =20 state->old_bs =3D bdrv_lookup_bs(device, node_name, errp); if (!state->old_bs) { @@ -2012,10 +1989,6 @@ static void block_dirty_bitmap_add_action(BlkActionS= tate *common, =20 tran_add(tran, &block_dirty_bitmap_add_drv, state); =20 - if (action_check_completion_mode(common, errp) < 0) { - return; - } - action =3D common->action->u.block_dirty_bitmap_add.data; /* AIO context taken and released within qmp_block_dirty_bitmap_add */ qmp_block_dirty_bitmap_add(action->node, action->name, @@ -2062,10 +2035,6 @@ static void block_dirty_bitmap_clear_action(BlkActio= nState *common, =20 tran_add(tran, &block_dirty_bitmap_clear_drv, state); =20 - if (action_check_completion_mode(common, errp) < 0) { - return; - } - action =3D common->action->u.block_dirty_bitmap_clear.data; state->bitmap =3D block_dirty_bitmap_lookup(action->node, action->name, @@ -2113,10 +2082,6 @@ static void block_dirty_bitmap_enable_action(BlkActi= onState *common, =20 tran_add(tran, &block_dirty_bitmap_enable_drv, state); =20 - if (action_check_completion_mode(common, errp) < 0) { - return; - } - action =3D common->action->u.block_dirty_bitmap_enable.data; state->bitmap =3D block_dirty_bitmap_lookup(action->node, action->name, @@ -2158,10 +2123,6 @@ static void block_dirty_bitmap_disable_action(BlkAct= ionState *common, =20 tran_add(tran, &block_dirty_bitmap_disable_drv, state); =20 - if (action_check_completion_mode(common, errp) < 0) { - return; - } - action =3D common->action->u.block_dirty_bitmap_disable.data; state->bitmap =3D block_dirty_bitmap_lookup(action->node, action->name, @@ -2203,10 +2164,6 @@ static void block_dirty_bitmap_merge_action(BlkActio= nState *common, =20 tran_add(tran, &block_dirty_bitmap_merge_drv, state); =20 - if (action_check_completion_mode(common, errp) < 0) { - return; - } - action =3D common->action->u.block_dirty_bitmap_merge.data; =20 state->bitmap =3D block_dirty_bitmap_merge(action->node, action->targe= t, @@ -2231,10 +2188,6 @@ static void block_dirty_bitmap_remove_action(BlkActi= onState *common, =20 tran_add(tran, &block_dirty_bitmap_remove_drv, state); =20 - if (action_check_completion_mode(common, errp) < 0) { - return; - } - action =3D common->action->u.block_dirty_bitmap_remove.data; =20 state->bitmap =3D block_dirty_bitmap_remove(action->node, action->name, @@ -2338,25 +2291,6 @@ static const BlkActionOps actions_map[] =3D { */ }; =20 -/** - * Allocate a TransactionProperties structure if necessary, and fill - * that structure with desired defaults if they are unset. - */ -static TransactionProperties *get_transaction_properties( - TransactionProperties *props) -{ - if (!props) { - props =3D g_new0(TransactionProperties, 1); - } - - if (!props->has_completion_mode) { - props->has_completion_mode =3D true; - props->completion_mode =3D ACTION_COMPLETION_MODE_INDIVIDUAL; - } - - return props; -} - /* * 'Atomic' group operations. The operations are performed as a set, and = if * any fail then we roll back all operations in the group. @@ -2368,24 +2302,42 @@ void qmp_transaction(TransactionActionList *actions, Error **errp) { TransactionActionList *act; - bool has_properties =3D !!properties; JobTxn *block_job_txn =3D NULL; Error *local_err =3D NULL; - Transaction *tran =3D tran_new(); + Transaction *tran; + ActionCompletionMode comp_mode =3D + properties ? properties->completion_mode : + ACTION_COMPLETION_MODE_INDIVIDUAL; =20 GLOBAL_STATE_CODE(); =20 /* Does this transaction get canceled as a group on failure? * If not, we don't really need to make a JobTxn. */ - properties =3D get_transaction_properties(properties); - if (properties->completion_mode !=3D ACTION_COMPLETION_MODE_INDIVIDUAL= ) { + if (comp_mode !=3D ACTION_COMPLETION_MODE_INDIVIDUAL) { + for (act =3D actions; act; act =3D act->next) { + TransactionActionKind type =3D act->value->type; + + if (type !=3D TRANSACTION_ACTION_KIND_BLOCKDEV_BACKUP && + type !=3D TRANSACTION_ACTION_KIND_DRIVE_BACKUP) + { + error_setg(errp, + "Action '%s' does not support transaction prope= rty " + "completion-mode =3D %s", + TransactionActionKind_str(type), + ActionCompletionMode_str(comp_mode)); + return; + } + } + block_job_txn =3D job_txn_new(); } =20 /* drain all i/o before any operations */ bdrv_drain_all(); =20 + tran =3D tran_new(); + /* We don't do anything in this loop that commits us to the operations= */ for (act =3D actions; act; act =3D act->next) { TransactionAction *dev_info =3D act->value; @@ -2401,7 +2353,6 @@ void qmp_transaction(TransactionActionList *actions, state->ops =3D ops; state->action =3D dev_info; state->block_job_txn =3D block_job_txn; - state->txn_props =3D properties; =20 state->ops->action(state, tran, &local_err); if (local_err) { @@ -2419,9 +2370,6 @@ delete_and_fail: /* failure, and it is all-or-none; roll back all operations */ tran_abort(tran); exit: - if (!has_properties) { - qapi_free_TransactionProperties(properties); - } job_txn_unref(block_job_txn); } =20 --=20 2.34.1 From nobody Sun May 12 19:34:54 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=yandex-team.ru ARC-Seal: i=1; a=rsa-sha256; t=1683731540; cv=none; d=zohomail.com; s=zohoarc; b=Djv6Fi7X+N9ROkCZ+cbLn4bpuKFKWIUu4+ehyDAGv0Nfk6NS/ddE9/pgGaByaorsQ9sPtzBUc8/uLzPSkuFnzzmosDWB442LsboS78gr0vdKb6VpTxirraF0uArarpBCsr0P+2HRDPNktAb4vEhsGurchb5GVkg8RFDeT3FG4Ek= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1683731540; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=9fVXmXfUGAl3kFCFCGH42efA63olGtvjCZYm0bEs8Lk=; b=mtG7K6pPLI2K/R5HlqipJn1yasrlF/oixU49G17dYodctvXXYzv0ckYwWcYfoXuDSLnClECjKqueTsxQXk+hQxOh0zzfzp5BZqYWwlpadSM0WOQg0s/9mJD/zR49Gk/ZSoh19P6w7EoenF+sAdhYm14NO4WTps5O+mTTKtAETO4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1683731540017349.99523258427257; Wed, 10 May 2023 08:12:20 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pwlP5-0006n0-CI; Wed, 10 May 2023 11:06:55 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pwlP3-0006mK-PX; Wed, 10 May 2023 11:06:53 -0400 Received: from forwardcorp1b.mail.yandex.net ([178.154.239.136]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pwlP0-0001Ti-Bj; Wed, 10 May 2023 11:06:52 -0400 Received: from mail-nwsmtp-smtp-corp-main-44.iva.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-44.iva.yp-c.yandex.net [IPv6:2a02:6b8:c0c:a884:0:640:947b:0]) by forwardcorp1b.mail.yandex.net (Yandex) with ESMTP id C5BE95FD1C; Wed, 10 May 2023 18:06:40 +0300 (MSK) Received: from vsementsov-nix.yandex-team.ru (unknown [2a02:6b8:b081:2::1:11]) by mail-nwsmtp-smtp-corp-main-44.iva.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id P6XgPR0OpqM0-vVDZwUMS; Wed, 10 May 2023 18:06:40 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1683731200; bh=9fVXmXfUGAl3kFCFCGH42efA63olGtvjCZYm0bEs8Lk=; h=Message-Id:Date:In-Reply-To:Cc:Subject:References:To:From; b=TpWFO899NNF7t5I01x9MF0Tcu9q8DndOGnKcTqhIW/LLtcgBsUx7zIysZxJ3dyT4V evizElFr28kRCWsUxzOaGNznN3u6wRZCeHLEY1ixgK9s2Ls/XKJa72rMDXaPkFdds3 1PlYJPWUAF+ZT8XwX8kQbPsAodOn5NTaVR45WUs8= Authentication-Results: mail-nwsmtp-smtp-corp-main-44.iva.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Cc: qemu-devel@nongnu.org, kwolf@redhat.com, hreitz@redhat.com, vsementsov@yandex-team.ru, den@openvz.org, alexander.ivanov@virtuozzo.com Subject: [PATCH v9 5/6] blockdev: use state.bitmap in block-dirty-bitmap-add action Date: Wed, 10 May 2023 18:06:23 +0300 Message-Id: <20230510150624.310640-6-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230510150624.310640-1-vsementsov@yandex-team.ru> References: <20230510150624.310640-1-vsementsov@yandex-team.ru> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=178.154.239.136; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1b.mail.yandex.net X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1683731540394100001 Content-Type: text/plain; charset="utf-8" Other bitmap related actions use the .bitmap pointer in .abort action, let's do same here: 1. It helps further refactoring, as bitmap-add is the only bitmap action that uses state.action in .abort 2. It must be safe: transaction actions rely on the fact that on .abort() the state is the same as at the end of .prepare(), so that in .abort() we could precisely rollback the changes done by .prepare(). The only way to remove the bitmap during transaction should be block-dirty-bitmap-remove action, but it postpones actual removal to .commit(), so we are OK on any rollback path. (Note also that bitmap-remove is the only bitmap action that has .commit() phase, except for simple g_free the state on .clean()) 3. Again, other bitmap actions behave this way: keep the bitmap pointer during the transaction. Signed-off-by: Vladimir Sementsov-Ogievskiy --- blockdev.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/blockdev.c b/blockdev.c index 6bcf80b18b..10003bdc52 100644 --- a/blockdev.c +++ b/blockdev.c @@ -1998,7 +1998,8 @@ static void block_dirty_bitmap_add_action(BlkActionSt= ate *common, &local_err); =20 if (!local_err) { - state->prepared =3D true; + state->bitmap =3D block_dirty_bitmap_lookup(action->node, action->= name, + NULL, &error_abort); } else { error_propagate(errp, local_err); } @@ -2006,15 +2007,10 @@ static void block_dirty_bitmap_add_action(BlkAction= State *common, =20 static void block_dirty_bitmap_add_abort(void *opaque) { - BlockDirtyBitmapAdd *action; BlockDirtyBitmapState *state =3D opaque; =20 - action =3D state->common.action->u.block_dirty_bitmap_add.data; - /* Should not be able to fail: IF the bitmap was added via .prepare(), - * then the node reference and bitmap name must have been valid. - */ - if (state->prepared) { - qmp_block_dirty_bitmap_remove(action->node, action->name, &error_a= bort); + if (state->bitmap) { + bdrv_release_dirty_bitmap(state->bitmap); } } =20 --=20 2.34.1 From nobody Sun May 12 19:34:54 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=yandex-team.ru ARC-Seal: i=1; a=rsa-sha256; t=1683731306; cv=none; d=zohomail.com; s=zohoarc; b=aa60mkXaFU6wYN3O8Ug77IiH5QwBYLcBGQ+WF8CzCjDbKx5+sw+IapE549NQLei7FfdEAUxOJFJ9fjX7hiZIJq8BVjZgi9jyEAtgvKZ7sblc8mqA6kbvprHinsbm/P0ZCD5tBiGg5kAyB9Xuose6vlS5s+YVPLM4CCzvzV1k4qM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1683731306; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=uvC/9tJikHQto5fPs1uuzEh6Moc77wBMQshr3GgWtRU=; b=OIU0yVtW//Lti7E5Px9wrtfywbW0XRa/2k4UXaAg4NI/Vth9njRrNqEFvyiowkJ3LN32bEgjjs4oC8WwxqcFQTdCGl9GPUw8l3MK+HTQw/c1OlfArVlca20IwftRMJE65I71lUZ2BZ4qPDZeaY/JVohKgBEz3tuPRqSKwkuXH4c= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 16837313063271003.6124449332922; Wed, 10 May 2023 08:08:26 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pwlPP-0006v9-CN; Wed, 10 May 2023 11:07:15 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pwlPE-0006sH-Ve; Wed, 10 May 2023 11:07:05 -0400 Received: from forwardcorp1c.mail.yandex.net ([178.154.239.200]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pwlP0-0001To-By; Wed, 10 May 2023 11:07:04 -0400 Received: from mail-nwsmtp-smtp-corp-main-44.iva.yp-c.yandex.net (mail-nwsmtp-smtp-corp-main-44.iva.yp-c.yandex.net [IPv6:2a02:6b8:c0c:a884:0:640:947b:0]) by forwardcorp1c.mail.yandex.net (Yandex) with ESMTP id EF54B5EC48; Wed, 10 May 2023 18:06:41 +0300 (MSK) Received: from vsementsov-nix.yandex-team.ru (unknown [2a02:6b8:b081:2::1:11]) by mail-nwsmtp-smtp-corp-main-44.iva.yp-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id P6XgPR0OpqM0-mLvyswwE; Wed, 10 May 2023 18:06:40 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1683731200; bh=uvC/9tJikHQto5fPs1uuzEh6Moc77wBMQshr3GgWtRU=; h=Message-Id:Date:In-Reply-To:Cc:Subject:References:To:From; b=Taapu9TS9GV0qVSSt9O8TQ/AmR7C46VFynXpPEoKwgK52Gdg1+GD17eLE13l+QMPx XwNKZS0v+LQS+58IwqzQtzYlCpAV/UeiSS+xiphFnGia5uEPAnWeodbDEnipLSB6NQ hcMEj3KcjYChirdgcbgOuE1c4EDU7C5mTe5D5qGQ= Authentication-Results: mail-nwsmtp-smtp-corp-main-44.iva.yp-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Cc: qemu-devel@nongnu.org, kwolf@redhat.com, hreitz@redhat.com, vsementsov@yandex-team.ru, den@openvz.org, alexander.ivanov@virtuozzo.com Subject: [PATCH v9 6/6] blockdev: qmp_transaction: drop extra generic layer Date: Wed, 10 May 2023 18:06:24 +0300 Message-Id: <20230510150624.310640-7-vsementsov@yandex-team.ru> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230510150624.310640-1-vsementsov@yandex-team.ru> References: <20230510150624.310640-1-vsementsov@yandex-team.ru> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=178.154.239.200; envelope-from=vsementsov@yandex-team.ru; helo=forwardcorp1c.mail.yandex.net X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @yandex-team.ru) X-ZM-MESSAGEID: 1683731308697100007 Content-Type: text/plain; charset="utf-8" Let's simplify things: First, actions generally don't need access to common BlkActionState structure. The only exclusion are backup actions that need block_job_txn. Next, for transaction actions of Transaction API is more native to allocated state structure in the action itself. So, do the following transformation: 1. Let all actions be represented by a function with corresponding structure as arguments. 2. Instead of array-map marshaller, let's make a function, that calls corresponding action directly. 3. BlkActionOps and BlkActionState structures become unused Signed-off-by: Vladimir Sementsov-Ogievskiy --- blockdev.c | 266 +++++++++++++++++------------------------------------ 1 file changed, 85 insertions(+), 181 deletions(-) diff --git a/blockdev.c b/blockdev.c index 10003bdc52..75f7e209a9 100644 --- a/blockdev.c +++ b/blockdev.c @@ -1178,54 +1178,8 @@ out_aio_context: return NULL; } =20 -/* New and old BlockDriverState structs for atomic group operations */ - -typedef struct BlkActionState BlkActionState; - -/** - * BlkActionOps: - * Table of operations that define an Action. - * - * @instance_size: Size of state struct, in bytes. - * @prepare: Prepare the work, must NOT be NULL. - * @commit: Commit the changes, can be NULL. - * @abort: Abort the changes on fail, can be NULL. - * @clean: Clean up resources after all transaction actions have called - * commit() or abort(). Can be NULL. - * - * Only prepare() may fail. In a single transaction, only one of commit() = or - * abort() will be called. clean() will always be called if it is present. - * - * Always run under BQL. - */ -typedef struct BlkActionOps { - size_t instance_size; - void (*action)(BlkActionState *common, Transaction *tran, Error **errp= ); -} BlkActionOps; - -/** - * BlkActionState: - * Describes one Action's state within a Transaction. - * - * @action: QAPI-defined enum identifying which Action to perform. - * @ops: Table of ActionOps this Action can perform. - * @block_job_txn: Transaction which this action belongs to. - * @entry: List membership for all Actions in this Transaction. - * - * This structure must be arranged as first member in a subclassed type, - * assuming that the compiler will also arrange it to the same offsets as = the - * base class. - */ -struct BlkActionState { - TransactionAction *action; - const BlkActionOps *ops; - JobTxn *block_job_txn; - QTAILQ_ENTRY(BlkActionState) entry; -}; - /* internal snapshot private data */ typedef struct InternalSnapshotState { - BlkActionState common; BlockDriverState *bs; QEMUSnapshotInfo sn; bool created; @@ -1238,7 +1192,7 @@ TransactionActionDrv internal_snapshot_drv =3D { .clean =3D internal_snapshot_clean, }; =20 -static void internal_snapshot_action(BlkActionState *common, +static void internal_snapshot_action(BlockdevSnapshotInternal *internal, Transaction *tran, Error **errp) { Error *local_err =3D NULL; @@ -1248,16 +1202,10 @@ static void internal_snapshot_action(BlkActionState= *common, QEMUSnapshotInfo old_sn, *sn; bool ret; int64_t rt; - BlockdevSnapshotInternal *internal; - InternalSnapshotState *state; + InternalSnapshotState *state =3D g_new0(InternalSnapshotState, 1); AioContext *aio_context; int ret1; =20 - g_assert(common->action->type =3D=3D - TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_INTERNAL_SYNC); - internal =3D common->action->u.blockdev_snapshot_internal_sync.data; - state =3D DO_UPCAST(InternalSnapshotState, common, common); - tran_add(tran, &internal_snapshot_drv, state); =20 device =3D internal->device; @@ -1383,7 +1331,6 @@ static void internal_snapshot_clean(void *opaque) =20 /* external snapshot private data */ typedef struct ExternalSnapshotState { - BlkActionState common; BlockDriverState *old_bs; BlockDriverState *new_bs; bool overlay_appended; @@ -1398,8 +1345,8 @@ TransactionActionDrv external_snapshot_drv =3D { .clean =3D external_snapshot_clean, }; =20 -static void external_snapshot_action(BlkActionState *common, Transaction *= tran, - Error **errp) +static void external_snapshot_action(TransactionAction *action, + Transaction *tran, Error **errp) { int ret; int flags =3D 0; @@ -1412,9 +1359,7 @@ static void external_snapshot_action(BlkActionState *= common, Transaction *tran, const char *snapshot_ref; /* File name of the new image (for 'blockdev-snapshot-sync') */ const char *new_image_file; - ExternalSnapshotState *state =3D - DO_UPCAST(ExternalSnapshotState, common, comm= on); - TransactionAction *action =3D common->action; + ExternalSnapshotState *state =3D g_new0(ExternalSnapshotState, 1); AioContext *aio_context; uint64_t perm, shared; =20 @@ -1648,7 +1593,6 @@ static void external_snapshot_clean(void *opaque) } =20 typedef struct DriveBackupState { - BlkActionState common; BlockDriverState *bs; BlockJob *job; } DriveBackupState; @@ -1668,11 +1612,11 @@ TransactionActionDrv drive_backup_drv =3D { .clean =3D drive_backup_clean, }; =20 -static void drive_backup_action(BlkActionState *common, Transaction *tran, - Error **errp) +static void drive_backup_action(DriveBackup *backup, + JobTxn *block_job_txn, + Transaction *tran, Error **errp) { - DriveBackupState *state =3D DO_UPCAST(DriveBackupState, common, common= ); - DriveBackup *backup; + DriveBackupState *state =3D g_new0(DriveBackupState, 1); BlockDriverState *bs; BlockDriverState *target_bs; BlockDriverState *source =3D NULL; @@ -1688,9 +1632,6 @@ static void drive_backup_action(BlkActionState *commo= n, Transaction *tran, =20 tran_add(tran, &drive_backup_drv, state); =20 - assert(common->action->type =3D=3D TRANSACTION_ACTION_KIND_DRIVE_BACKU= P); - backup =3D common->action->u.drive_backup.data; - if (!backup->has_mode) { backup->mode =3D NEW_IMAGE_MODE_ABSOLUTE_PATHS; } @@ -1810,7 +1751,7 @@ static void drive_backup_action(BlkActionState *commo= n, Transaction *tran, =20 state->job =3D do_backup_common(qapi_DriveBackup_base(backup), bs, target_bs, aio_context, - common->block_job_txn, errp); + block_job_txn, errp); =20 unref: bdrv_unref(target_bs); @@ -1859,7 +1800,6 @@ static void drive_backup_clean(void *opaque) } =20 typedef struct BlockdevBackupState { - BlkActionState common; BlockDriverState *bs; BlockJob *job; } BlockdevBackupState; @@ -1873,11 +1813,11 @@ TransactionActionDrv blockdev_backup_drv =3D { .clean =3D blockdev_backup_clean, }; =20 -static void blockdev_backup_action(BlkActionState *common, Transaction *tr= an, - Error **errp) +static void blockdev_backup_action(BlockdevBackup *backup, + JobTxn *block_job_txn, + Transaction *tran, Error **errp) { - BlockdevBackupState *state =3D DO_UPCAST(BlockdevBackupState, common, = common); - BlockdevBackup *backup; + BlockdevBackupState *state =3D g_new0(BlockdevBackupState, 1); BlockDriverState *bs; BlockDriverState *target_bs; AioContext *aio_context; @@ -1886,9 +1826,6 @@ static void blockdev_backup_action(BlkActionState *co= mmon, Transaction *tran, =20 tran_add(tran, &blockdev_backup_drv, state); =20 - assert(common->action->type =3D=3D TRANSACTION_ACTION_KIND_BLOCKDEV_BA= CKUP); - backup =3D common->action->u.blockdev_backup.data; - bs =3D bdrv_lookup_bs(backup->device, backup->device, errp); if (!bs) { return; @@ -1919,7 +1856,7 @@ static void blockdev_backup_action(BlkActionState *co= mmon, Transaction *tran, =20 state->job =3D do_backup_common(qapi_BlockdevBackup_base(backup), bs, target_bs, aio_context, - common->block_job_txn, errp); + block_job_txn, errp); =20 aio_context_release(aio_context); } @@ -1965,11 +1902,9 @@ static void blockdev_backup_clean(void *opaque) } =20 typedef struct BlockDirtyBitmapState { - BlkActionState common; BdrvDirtyBitmap *bitmap; BlockDriverState *bs; HBitmap *backup; - bool prepared; bool was_enabled; } BlockDirtyBitmapState; =20 @@ -1979,17 +1914,14 @@ TransactionActionDrv block_dirty_bitmap_add_drv =3D= { .clean =3D g_free, }; =20 -static void block_dirty_bitmap_add_action(BlkActionState *common, +static void block_dirty_bitmap_add_action(BlockDirtyBitmapAdd *action, Transaction *tran, Error **errp) { Error *local_err =3D NULL; - BlockDirtyBitmapAdd *action; - BlockDirtyBitmapState *state =3D DO_UPCAST(BlockDirtyBitmapState, - common, common); + BlockDirtyBitmapState *state =3D g_new0(BlockDirtyBitmapState, 1); =20 tran_add(tran, &block_dirty_bitmap_add_drv, state); =20 - action =3D common->action->u.block_dirty_bitmap_add.data; /* AIO context taken and released within qmp_block_dirty_bitmap_add */ qmp_block_dirty_bitmap_add(action->node, action->name, action->has_granularity, action->granularit= y, @@ -2022,16 +1954,13 @@ TransactionActionDrv block_dirty_bitmap_clear_drv = =3D { .clean =3D g_free, }; =20 -static void block_dirty_bitmap_clear_action(BlkActionState *common, +static void block_dirty_bitmap_clear_action(BlockDirtyBitmap *action, Transaction *tran, Error **err= p) { - BlockDirtyBitmapState *state =3D DO_UPCAST(BlockDirtyBitmapState, - common, common); - BlockDirtyBitmap *action; + BlockDirtyBitmapState *state =3D g_new0(BlockDirtyBitmapState, 1); =20 tran_add(tran, &block_dirty_bitmap_clear_drv, state); =20 - action =3D common->action->u.block_dirty_bitmap_clear.data; state->bitmap =3D block_dirty_bitmap_lookup(action->node, action->name, &state->bs, @@ -2069,16 +1998,13 @@ TransactionActionDrv block_dirty_bitmap_enable_drv = =3D { .clean =3D g_free, }; =20 -static void block_dirty_bitmap_enable_action(BlkActionState *common, +static void block_dirty_bitmap_enable_action(BlockDirtyBitmap *action, Transaction *tran, Error **er= rp) { - BlockDirtyBitmap *action; - BlockDirtyBitmapState *state =3D DO_UPCAST(BlockDirtyBitmapState, - common, common); + BlockDirtyBitmapState *state =3D g_new0(BlockDirtyBitmapState, 1); =20 tran_add(tran, &block_dirty_bitmap_enable_drv, state); =20 - action =3D common->action->u.block_dirty_bitmap_enable.data; state->bitmap =3D block_dirty_bitmap_lookup(action->node, action->name, NULL, @@ -2110,16 +2036,13 @@ TransactionActionDrv block_dirty_bitmap_disable_drv= =3D { .clean =3D g_free, }; =20 -static void block_dirty_bitmap_disable_action(BlkActionState *common, +static void block_dirty_bitmap_disable_action(BlockDirtyBitmap *action, Transaction *tran, Error **e= rrp) { - BlockDirtyBitmap *action; - BlockDirtyBitmapState *state =3D DO_UPCAST(BlockDirtyBitmapState, - common, common); + BlockDirtyBitmapState *state =3D g_new0(BlockDirtyBitmapState, 1); =20 tran_add(tran, &block_dirty_bitmap_disable_drv, state); =20 - action =3D common->action->u.block_dirty_bitmap_disable.data; state->bitmap =3D block_dirty_bitmap_lookup(action->node, action->name, NULL, @@ -2151,17 +2074,13 @@ TransactionActionDrv block_dirty_bitmap_merge_drv = =3D { .clean =3D g_free, }; =20 -static void block_dirty_bitmap_merge_action(BlkActionState *common, +static void block_dirty_bitmap_merge_action(BlockDirtyBitmapMerge *action, Transaction *tran, Error **err= p) { - BlockDirtyBitmapMerge *action; - BlockDirtyBitmapState *state =3D DO_UPCAST(BlockDirtyBitmapState, - common, common); + BlockDirtyBitmapState *state =3D g_new0(BlockDirtyBitmapState, 1); =20 tran_add(tran, &block_dirty_bitmap_merge_drv, state); =20 - action =3D common->action->u.block_dirty_bitmap_merge.data; - state->bitmap =3D block_dirty_bitmap_merge(action->node, action->targe= t, action->bitmaps, &state->back= up, errp); @@ -2175,16 +2094,13 @@ TransactionActionDrv block_dirty_bitmap_remove_drv = =3D { .clean =3D g_free, }; =20 -static void block_dirty_bitmap_remove_action(BlkActionState *common, +static void block_dirty_bitmap_remove_action(BlockDirtyBitmap *action, Transaction *tran, Error **er= rp) { - BlockDirtyBitmap *action; - BlockDirtyBitmapState *state =3D DO_UPCAST(BlockDirtyBitmapState, - common, common); + BlockDirtyBitmapState *state =3D g_new0(BlockDirtyBitmapState, 1); =20 tran_add(tran, &block_dirty_bitmap_remove_drv, state); =20 - action =3D common->action->u.block_dirty_bitmap_remove.data; =20 state->bitmap =3D block_dirty_bitmap_remove(action->node, action->name, false, &state->bs, errp); @@ -2215,13 +2131,11 @@ static void block_dirty_bitmap_remove_commit(void *= opaque) static void abort_commit(void *opaque); TransactionActionDrv abort_drv =3D { .commit =3D abort_commit, - .clean =3D g_free, }; =20 -static void abort_action(BlkActionState *common, Transaction *tran, - Error **errp) +static void abort_action(Transaction *tran, Error **errp) { - tran_add(tran, &abort_drv, common); + tran_add(tran, &abort_drv, NULL); error_setg(errp, "Transaction aborted using Abort action"); } =20 @@ -2230,62 +2144,66 @@ static void abort_commit(void *opaque) g_assert_not_reached(); /* this action never succeeds */ } =20 -static const BlkActionOps actions_map[] =3D { - [TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT] =3D { - .instance_size =3D sizeof(ExternalSnapshotState), - .action =3D external_snapshot_action, - }, - [TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_SYNC] =3D { - .instance_size =3D sizeof(ExternalSnapshotState), - .action =3D external_snapshot_action, - }, - [TRANSACTION_ACTION_KIND_DRIVE_BACKUP] =3D { - .instance_size =3D sizeof(DriveBackupState), - .action =3D drive_backup_action, - }, - [TRANSACTION_ACTION_KIND_BLOCKDEV_BACKUP] =3D { - .instance_size =3D sizeof(BlockdevBackupState), - .action =3D blockdev_backup_action, - }, - [TRANSACTION_ACTION_KIND_ABORT] =3D { - .instance_size =3D sizeof(BlkActionState), - .action =3D abort_action, - }, - [TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_INTERNAL_SYNC] =3D { - .instance_size =3D sizeof(InternalSnapshotState), - .action =3D internal_snapshot_action, - }, - [TRANSACTION_ACTION_KIND_BLOCK_DIRTY_BITMAP_ADD] =3D { - .instance_size =3D sizeof(BlockDirtyBitmapState), - .action =3D block_dirty_bitmap_add_action, - }, - [TRANSACTION_ACTION_KIND_BLOCK_DIRTY_BITMAP_CLEAR] =3D { - .instance_size =3D sizeof(BlockDirtyBitmapState), - .action =3D block_dirty_bitmap_clear_action, - }, - [TRANSACTION_ACTION_KIND_BLOCK_DIRTY_BITMAP_ENABLE] =3D { - .instance_size =3D sizeof(BlockDirtyBitmapState), - .action =3D block_dirty_bitmap_enable_action, - }, - [TRANSACTION_ACTION_KIND_BLOCK_DIRTY_BITMAP_DISABLE] =3D { - .instance_size =3D sizeof(BlockDirtyBitmapState), - .action =3D block_dirty_bitmap_disable_action, - }, - [TRANSACTION_ACTION_KIND_BLOCK_DIRTY_BITMAP_MERGE] =3D { - .instance_size =3D sizeof(BlockDirtyBitmapState), - .action =3D block_dirty_bitmap_merge_action, - }, - [TRANSACTION_ACTION_KIND_BLOCK_DIRTY_BITMAP_REMOVE] =3D { - .instance_size =3D sizeof(BlockDirtyBitmapState), - .action =3D block_dirty_bitmap_remove_action, - }, - /* Where are transactions for MIRROR, COMMIT and STREAM? +static void transaction_action(TransactionAction *act, JobTxn *block_job_t= xn, + Transaction *tran, Error **errp) +{ + switch (act->type) { + case TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT: + case TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_SYNC: + external_snapshot_action(act, tran, errp); + return; + case TRANSACTION_ACTION_KIND_DRIVE_BACKUP: + drive_backup_action(act->u.drive_backup.data, + block_job_txn, tran, errp); + return; + case TRANSACTION_ACTION_KIND_BLOCKDEV_BACKUP: + blockdev_backup_action(act->u.blockdev_backup.data, + block_job_txn, tran, errp); + return; + case TRANSACTION_ACTION_KIND_ABORT: + abort_action(tran, errp); + return; + case TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT_INTERNAL_SYNC: + internal_snapshot_action(act->u.blockdev_snapshot_internal_sync.da= ta, + tran, errp); + return; + case TRANSACTION_ACTION_KIND_BLOCK_DIRTY_BITMAP_ADD: + block_dirty_bitmap_add_action(act->u.block_dirty_bitmap_add.data, + tran, errp); + return; + case TRANSACTION_ACTION_KIND_BLOCK_DIRTY_BITMAP_CLEAR: + block_dirty_bitmap_clear_action(act->u.block_dirty_bitmap_clear.da= ta, + tran, errp); + return; + case TRANSACTION_ACTION_KIND_BLOCK_DIRTY_BITMAP_ENABLE: + block_dirty_bitmap_enable_action(act->u.block_dirty_bitmap_enable.= data, + tran, errp); + return; + case TRANSACTION_ACTION_KIND_BLOCK_DIRTY_BITMAP_DISABLE: + block_dirty_bitmap_disable_action( + act->u.block_dirty_bitmap_disable.data, tran, errp); + return; + case TRANSACTION_ACTION_KIND_BLOCK_DIRTY_BITMAP_MERGE: + block_dirty_bitmap_merge_action(act->u.block_dirty_bitmap_merge.da= ta, + tran, errp); + return; + case TRANSACTION_ACTION_KIND_BLOCK_DIRTY_BITMAP_REMOVE: + block_dirty_bitmap_remove_action(act->u.block_dirty_bitmap_remove.= data, + tran, errp); + return; + /* + * 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. * These jobs may not fully undo all of their actions on abort, nor do= they * necessarily work in transactions with more than one job in them. */ -}; + case TRANSACTION_ACTION_KIND__MAX: + default: + g_assert_not_reached(); + }; +} + =20 /* * 'Atomic' group operations. The operations are performed as a set, and = if @@ -2336,21 +2254,7 @@ void qmp_transaction(TransactionActionList *actions, =20 /* We don't do anything in this loop that commits us to the operations= */ for (act =3D actions; act; act =3D act->next) { - TransactionAction *dev_info =3D act->value; - const BlkActionOps *ops; - BlkActionState *state; - - assert(dev_info->type < ARRAY_SIZE(actions_map)); - - ops =3D &actions_map[dev_info->type]; - assert(ops->instance_size > 0); - - state =3D g_malloc0(ops->instance_size); - state->ops =3D ops; - state->action =3D dev_info; - state->block_job_txn =3D block_job_txn; - - state->ops->action(state, tran, &local_err); + transaction_action(act->value, block_job_txn, tran, &local_err); if (local_err) { error_propagate(errp, local_err); goto delete_and_fail; --=20 2.34.1