From nobody Sat Feb 7 10:15:25 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) client-ip=170.10.129.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=quarantine dis=quarantine) header.from=virtuozzo.com Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by mx.zohomail.com with SMTPS id 1645832668676516.1456499912827; Fri, 25 Feb 2022 15:44:28 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-57-lPQqaKQ4PfWIJPEbyw02gg-1; Fri, 25 Feb 2022 18:44:26 -0500 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 1F5B780EDAC; Fri, 25 Feb 2022 23:44:19 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id E6E518BD70; Fri, 25 Feb 2022 23:44:18 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id BA4331807D65; Fri, 25 Feb 2022 23:44:18 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.rdu2.redhat.com [10.11.54.7]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 21PNhuTc027636 for ; Fri, 25 Feb 2022 18:43:56 -0500 Received: by smtp.corp.redhat.com (Postfix) id 8812B141DC2B; Fri, 25 Feb 2022 23:43:56 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast01.extmail.prod.ext.rdu2.redhat.com [10.11.55.17]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 8368B141DC28 for ; Fri, 25 Feb 2022 23:43:56 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 6655085A5A8 for ; Fri, 25 Feb 2022 23:43:56 +0000 (UTC) Received: from EUR04-VI1-obe.outbound.protection.outlook.com (mail-eopbgr80095.outbound.protection.outlook.com [40.107.8.95]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-486-tLSQHdIJMTepsJLN_31PeA-6; Fri, 25 Feb 2022 18:43:50 -0500 Received: from AM9PR08MB6737.eurprd08.prod.outlook.com (2603:10a6:20b:304::18) by DB8PR08MB4172.eurprd08.prod.outlook.com (2603:10a6:10:af::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5017.21; Fri, 25 Feb 2022 23:43:41 +0000 Received: from AM9PR08MB6737.eurprd08.prod.outlook.com ([fe80::49c:67e9:3e24:8714]) by AM9PR08MB6737.eurprd08.prod.outlook.com ([fe80::49c:67e9:3e24:8714%3]) with mapi id 15.20.5017.021; Fri, 25 Feb 2022 23:43:41 +0000 X-MC-Unique: lPQqaKQ4PfWIJPEbyw02gg-1 X-MC-Unique: tLSQHdIJMTepsJLN_31PeA-6 From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v3 06/11] qapi: add x-blockdev-replace transaction action Date: Sat, 26 Feb 2022 00:43:03 +0100 Message-ID: <20220225234308.1754763-7-vsementsov@virtuozzo.com> In-Reply-To: <20220225234308.1754763-1-vsementsov@virtuozzo.com> References: <20220225234308.1754763-1-vsementsov@virtuozzo.com> X-ClientProxiedBy: VE1PR03CA0006.eurprd03.prod.outlook.com (2603:10a6:802:a0::18) To AM9PR08MB6737.eurprd08.prod.outlook.com (2603:10a6:20b:304::18) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: cee00592-6548-446c-74cd-08d9f8b8a733 X-MS-TrafficTypeDiagnostic: DB8PR08MB4172:EE_ X-Microsoft-Antispam-PRVS: X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0 X-Microsoft-Antispam-Message-Info: WO6fAP8VrfijoWZc+i67vFSH+hvuyd/0dn2tYM+vDjJHSB5BA2C5gEag5EA1+EPOhBJGTv0O+lSChXOGZioerd6wTHDc4ISn3NhmmQ9M+z/1ezrX67UPIFwPL1Cq75UbEqK7EuEUHVhL7U4oaj4goB/mek7MdDr1xua6VFL1jPRL5YQiyszG+yfo1qzJpEfv3XZSvF772cCd2Z9pY5pIe3Wnp7bMPzK4ptu2+o93ka5//IOfsHrbGoioypFj9cyoi9r8Vq+4lT2dVpdfeWq7VHjro4uSyDRn7bUMG5ir/KEBPONNfhbEQDSJcq8VSFG9h+E6EFZ/6kRS8DqAUVujZhWasy9CmokOYfReFCUYzOHYBfiOExBCdiuJOZxSQZeD0G5rUz8cQLgxh8RUleZ0ujc7zlQjj+HHzHc6rAOf2lB5wd0F96LDJv890/gm8Ht4bqf+sckXd/Lj+9hF4toE4tJFz2UNGoS6SePyCjehbrc8j0FXjwU4diJ3VzLtP4z/2m9/BaJLIuD6SGzl1zYXA/34HXVapMAyjMu/tZo6NOeribdGDPaUMrykLQukGErX/idTsQMV0rwad2sdMgZGRYXshnMUSBI0xxv8QEL0JYsTdLetITxNQ6wAxvTtYn3FCn9RsG/8t1YUBxR+fNP6KyH3ENTdrsPCdPIUfWCxTWsuo5V10mZEsOWkCl5fDrgOLt+nWiQkfz8ILgPkGLXgsw== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:AM9PR08MB6737.eurprd08.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230001)(4636009)(366004)(6916009)(6506007)(8676002)(66556008)(5660300002)(83380400001)(6666004)(7416002)(8936002)(52116002)(508600001)(6486002)(6512007)(2616005)(26005)(316002)(36756003)(38350700002)(1076003)(38100700002)(2906002)(86362001)(4326008)(186003)(66946007)(66476007); DIR:OUT; SFP:1102 X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?PAzmZr6IrNyjGYk1mS0Y3vnuTpkzDvP/sX+9ogFsf6EeVsk0ArvKD7WWjQQ8?= =?us-ascii?Q?5Np4E3r+FFA79tSaedExHqPQUIX/q9LMk4fY2IKfxfgg+1lKs2b/b2zxl4x4?= =?us-ascii?Q?KQ3mbR2AkA888s2DQ2Tz3c0VYOtTlnTP1NX7yuHC4p2EA6RoGJsmuEXFfw6x?= =?us-ascii?Q?HlJ5ABtpbe6VlqN/jGCd0t97xXdCvpdOal5Htc1nBux2N85LJC8xZU6eDl3J?= =?us-ascii?Q?pGV29Ua6h5fPpZ4qR9ibG8cBCJlwePgAvxBb7xlToFlXH3VesMWc0ELM6PS/?= =?us-ascii?Q?LVAWeM31Ra+e1lXAQdYUZ52M5PJQTctyPntgleIi1B/CVRwt9AGDP95cUYmN?= =?us-ascii?Q?j96xsTrf9ts/KCWtgEoT+00Jta2EFTiemhBJEDTLNcUiq9EGKwZviRo8+cNs?= =?us-ascii?Q?xFsTevVti1lgSka1INz80zmrTeG3yVIvr0P3hqhmmbsmQLaAVC1UNdNvDcEI?= =?us-ascii?Q?AgZcqlViUwCcXmgJ45oLNXshJlwf4m2F+kvE1JAmV3s2I8QSFGZW7zolgtsK?= =?us-ascii?Q?5PJAtdtNdE2CzjrVm/qT5l/DLO15WGdFhj2PyL1E9J1GYLa+AnqB1KVj0xXN?= =?us-ascii?Q?fEvi1+ytULzKmrBW/whJ6EvJE+AtqvSI9IPmr2fAGApKcy++3/DT9NN/ybl7?= =?us-ascii?Q?h3b1Gg0WX9voa3hoqzJGD/PrGMLuTGvoxcrZJGu+rWieljGHWumB4MSaxKmr?= =?us-ascii?Q?1hSE30PiXv022nrfBUdmkS0afmCVvvaWF6OxVt7cQjSVx4tRnrlsY5l1/Cgf?= =?us-ascii?Q?Q63u3x97l2GEDiZ26UjO+Rzr7XyPhl1LNuGVXcpuL7xsjJhwUwETYFuSIGVH?= =?us-ascii?Q?miJ5y3fO7CIix/UQQOFq9WJMS8P/8jchGjD3nAmsPd4O2u6+SnD3IguPCUmp?= =?us-ascii?Q?+kQqfPMGMRSkzaGanUMOnAhKeEmDvB4lYtJ8P4Rv2BIf/O5/bYpr+RjHVmdN?= =?us-ascii?Q?nysjJYa/+WrBlJASe8DdMlfOXlJaWf62yktIPsRU7Xg1eD9Th1P8Ubc8M4yD?= =?us-ascii?Q?NDzYsO2I3wV6bY6TTW1ZiTaSn0Le0/cSECR+2ecW7vdTkP+IFo9JGMX0jxY/?= =?us-ascii?Q?VPltxCl4seGq0wkdd2F7Ufc1Ta3nh2SJjDQOGDce5hbrwk35TwsgzUyv1EBC?= =?us-ascii?Q?pg5iXsKq06HIjyDgZJkHgf9Ij/MrkZCd7/rvzS97n4ENyDmIU5KNjAj8uFp3?= =?us-ascii?Q?BZq9cyId8J2DiN+aNPtoPGeFky4sS7qGxCMxgtbz9ECYpnyZZ3EgbtyaOt8i?= =?us-ascii?Q?nly5t8vQUwNh2bXdJjtEoH0YSK/u1hoM4dCMP8N/aG5hxoxRzuJIUfgdF4Bs?= =?us-ascii?Q?3cujU11w1Bkklrfp7q620K9y6boN2T9crcj6IvjudQ0IKlxPVoufpnOBYAl2?= =?us-ascii?Q?+HqezjvNrgPLFtUBc7toYdBD+QBeqtVEXl5svQLUIBaY37fD06kgbzcchh7Z?= =?us-ascii?Q?PwXpvIWCV0ao++1tguy+CLoTKcvWLVHkZgKCKMwDQXzDGwPz17zxwFmqu9m6?= =?us-ascii?Q?S7Nd+MJ53dZyVWP7j5FKe0Z4MW2+JCOQqZobkTdw6RMbKAvQGFVuEU8mGx4Y?= =?us-ascii?Q?7pKe/0L4P8hIYFERIxxlIIzvCgZO4UrnmOLk4C5HCKeZSbrHsy5CYxU/5WZR?= =?us-ascii?Q?xpkpM61wD0AkDAXtf3X8Pyz5jB8rswn7Le+lksQLH79lagIa9K5jKgc6MNui?= =?us-ascii?Q?Fsd5iw=3D=3D?= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: cee00592-6548-446c-74cd-08d9f8b8a733 X-MS-Exchange-CrossTenant-AuthSource: AM9PR08MB6737.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Feb 2022 23:43:41.5914 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: CGdplenZhS757+r7l0lR8qI8vIIszG7C0aPK6+9sV1HIwVbHrRBKd6UCsxaOT1pJf+xqF7ZrQNrkoNt9k7fLT3OJNne/QicVt2b5eNVFNFA= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB8PR08MB4172 X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.85 on 10.11.54.7 X-MIME-Autoconverted: from quoted-printable to 8bit by lists01.pubmisc.prod.ext.phx2.redhat.com id 21PNhuTc027636 X-loop: libvir-list@redhat.com Cc: kwolf@redhat.com, vsementsov@virtuozzo.com, libvir-list@redhat.com, dim@virtuozzo.com, igor@virtuozzo.com, qemu-devel@nongnu.org, armbru@redhat.com, hreitz@redhat.com, pkrempa@redhat.com, yur@virtuozzo.com, nshirokovskiy@virtuozzo.com, stefanha@redhat.com, den@openvz.org, pbonzini@redhat.com, eblake@redhat.com X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1645832670111100001 Content-Type: text/plain; charset="utf-8" Support blockdev-replace in a transaction. Signed-off-by: Vladimir Sementsov-Ogievskiy --- qapi/transaction.json | 14 +++++++++++++- blockdev.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/qapi/transaction.json b/qapi/transaction.json index a938dc7d10..48dd2db1ed 100644 --- a/qapi/transaction.json +++ b/qapi/transaction.json @@ -54,10 +54,12 @@ # @blockdev-snapshot-sync: since 1.1 # @drive-backup: Since 1.6 # @blockdev-add: since 7.0 +# @x-blockdev-replace: since 7.0 # # Features: # @deprecated: Member @drive-backup is deprecated. Use member # @blockdev-backup instead. +# @unstable: Member @x-blockdev-replace is experimental # # Since: 1.1 ## @@ -68,6 +70,7 @@ 'blockdev-backup', 'blockdev-snapshot', 'blockdev-snapshot-internal-sync', 'blockdev-snapshot-sync', 'blockdev-add', + { 'name': 'x-blockdev-replace', 'features': [ 'unstable' ] }, { 'name': 'drive-backup', 'features': [ 'deprecated' ] } ] } =20 ## @@ -150,6 +153,14 @@ { 'struct': 'BlockdevAddWrapper', 'data': { 'data': 'BlockdevOptions' } } =20 +## +# @BlockdevReplaceWrapper: +# +# Since: 7.0 +## +{ 'struct': 'BlockdevReplaceWrapper', + 'data': { 'data': 'BlockdevReplace' } } + ## # @TransactionAction: # @@ -174,7 +185,8 @@ 'blockdev-snapshot-internal-sync': 'BlockdevSnapshotInternalWrapper= ', 'blockdev-snapshot-sync': 'BlockdevSnapshotSyncWrapper', 'blockdev-add': 'BlockdevAddWrapper', - 'drive-backup': 'DriveBackupWrapper' + 'drive-backup': 'DriveBackupWrapper', + 'x-blockdev-replace': 'BlockdevReplaceWrapper' } } =20 ## diff --git a/blockdev.c b/blockdev.c index 9fd1783be2..8ff0e2afe8 100644 --- a/blockdev.c +++ b/blockdev.c @@ -2294,6 +2294,34 @@ void qmp_x_blockdev_replace(BlockdevReplace *repl, E= rror **errp) tran_finalize(tran, ret); } =20 +typedef struct TranObjState { + BlkActionState common; + Transaction *tran; +} TranObjState; + +static void tran_obj_commit(BlkActionState *common) +{ + TranObjState *s =3D DO_UPCAST(TranObjState, common, common); + + tran_commit(s->tran); +} + +static void tran_obj_abort(BlkActionState *common) +{ + TranObjState *s =3D DO_UPCAST(TranObjState, common, common); + + tran_abort(s->tran); +} + +static void blockdev_replace_prepare(BlkActionState *common, Error **errp) +{ + TranObjState *s =3D DO_UPCAST(TranObjState, common, common); + + s->tran =3D tran_new(); + + blockdev_replace(common->action->u.x_blockdev_replace.data, s->tran, e= rrp); +} + static const BlkActionOps actions[] =3D { [TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT] =3D { .instance_size =3D sizeof(ExternalSnapshotState), @@ -2372,6 +2400,12 @@ static const BlkActionOps actions[] =3D { .prepare =3D blockdev_add_prepare, .abort =3D blockdev_add_abort, }, + [TRANSACTION_ACTION_KIND_X_BLOCKDEV_REPLACE] =3D { + .instance_size =3D sizeof(TranObjState), + .prepare =3D blockdev_replace_prepare, + .commit =3D tran_obj_commit, + .abort =3D tran_obj_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. --=20 2.31.1