From nobody Sun Feb 8 09:11:04 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 1645832657716854.0690760498915; Fri, 25 Feb 2022 15:44:17 -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-367-gmSVQ3LHP6OiTYQZ_QzFPw-1; Fri, 25 Feb 2022 18:44:13 -0500 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 49CD080D6AC; Fri, 25 Feb 2022 23:44:08 +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 276EF34B59; Fri, 25 Feb 2022 23:44:08 +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 EAF0C18087F0; Fri, 25 Feb 2022 23:44:07 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 21PNhopA027583 for ; Fri, 25 Feb 2022 18:43:50 -0500 Received: by smtp.corp.redhat.com (Postfix) id 3561FC08F24; Fri, 25 Feb 2022 23:43:50 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast10.extmail.prod.ext.rdu2.redhat.com [10.11.55.26]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 30B00C202D1 for ; Fri, 25 Feb 2022 23:43:50 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-2.mimecast.com [207.211.31.81]) (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 12A501C05AA3 for ; Fri, 25 Feb 2022 23:43:50 +0000 (UTC) Received: from EUR01-DB5-obe.outbound.protection.outlook.com (mail-eopbgr150095.outbound.protection.outlook.com [40.107.15.95]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-209-yl9BGgFtNXy350Fzhc-rUQ-1; Fri, 25 Feb 2022 18:43:48 -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:40 +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:40 +0000 X-MC-Unique: gmSVQ3LHP6OiTYQZ_QzFPw-1 X-MC-Unique: yl9BGgFtNXy350Fzhc-rUQ-1 From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v3 05/11] qapi: add x-blockdev-replace command Date: Sat, 26 Feb 2022 00:43:02 +0100 Message-ID: <20220225234308.1754763-6-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: 9147b8a1-faef-4e4e-15c2-08d9f8b8a5ef 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: Wy59rUT3EIcAqt+5WzkX9sluJgQPiPuzypp8R4gMXJjf7vDANhppYmkXOpOInXcM8U37tK0bqop5805xflIY6UtITPN2YogeOXbw8PIHbsCpaLelzKR5wVa5/THYyvYBkiZ/yaYXJj7svcxtyLCxaS5oUCwcOfieETZwM9QpoHH05Il8vLXI1AcdTuHz6tti2CAJDabQOfmvpgYDW8iM2aE5WFcR+HqrrguC2SJUFkM+bCv4hRqntStTNjwC7JKb0EXf0bz2NbnniFUFfwodABSRs9OgnUA0jZy88c6Spng89u57NYzleo8vwkvr17qX/wo3PNcMFGMzp8aO1o7kPCUu8adhQ3tI1eHM5dEBm3g6CcYPu/FyElMc1/Wp6T8sdfkGqZzspMxusGAznd+Z5rImTgjkUMbKEcgirn/7dXTZ7RcVL0uwnXFQ5fChbvirOE2FjWTTkpP5g2pBjk75wWpn4l66ZS0rpIdvWz5W4AxrQeMt3g35qWD2QAAy7PQ+FTWFzuxJFoKbmDW7dO9lJUuuJmUzCdAR77pTbGi1N5qyCKzGhHUi+OCwUNkrE3iGDMzkVHZtgh2EIyjZnZvgaJulfpdNOYyy5lQOzPDZqExCe0RYhCeWppGQoK4SMkZyPG+4gpMajetu/f7iwk0fwlR9OxdBe+FDD1536sz1UoQdGXALct9/iRh3t57Du/4zytFxvvKa4V8zCbk4ybfapA== 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?4WRgi3XRD5e7Kz4z52q4E65sN5Ifi0tKI0PCTmdOM68Ie9Lp0SH7j8ZbpJqU?= =?us-ascii?Q?BP5HNwHNixnTWtZpmEA3EHfWhIHjQOu9BUaz1Ia22Jo57hQwN4gwz0UFe107?= =?us-ascii?Q?isrylz/nsQacIF/lOD2Y3ld4dZhejCVjpbMuPnTm92YSzzrbZ/AiTvG0lMVP?= =?us-ascii?Q?H4YoWznFNJk8k3VXjjPZ/2+FkYk2xZbpFffE1dw1HMxzYNqTD7xX+ElYlhg/?= =?us-ascii?Q?3ROgRSaZoNJy6thOgXftPEfPhfbHUjeThxtB5Y+Kzpk6bvBpNarYf9maEbJb?= =?us-ascii?Q?KYazOIWowz6aY0UJT7GwzC6raGlxAoPCWQ/6grss/cwPOvjKc88gotihp9ij?= =?us-ascii?Q?HwTz0JZ9ryU1n30d9SwXOjnGHEMEgqraeVrP0uAF3X0JlNisHKrXGl7wKuEn?= =?us-ascii?Q?SykDWiR+SSd8FrO3342Qc5V9s9TxcQoKQEgjH0pFPOhTFq5ArfJFuymxJEsy?= =?us-ascii?Q?c6o30BuI79I/46L44zWpFcAhGI4+GRJjefDftk1lLzVuWiFjmcRz4F3BGvUX?= =?us-ascii?Q?K0/ncMUWYS7EvkEDbwwT4j8M/+cz1jK1Xdr83hxITrgOI4zd7BuyQiBfno99?= =?us-ascii?Q?SjMTwR0kVo6XUn7OuC8kPsAtVvvYeEpXf8hYzk0U7ocVPvkXH27cjCR5ysVM?= =?us-ascii?Q?az1X7FvGrU1asaNpUNnRrdCLwCdVtSHMrwe1PvcSoy5S0zqroJRN6ViFsJYw?= =?us-ascii?Q?AttxkGchCPgUV2QQiym5awxE7+SrONkYdGivBr7gfa1tUEONUejI+7G7xm0d?= =?us-ascii?Q?1OM6u++13WJDPJUc8gyPlZ+3eZaVldD04USgINVLl9EiCdX9NQWUq3aWk+yk?= =?us-ascii?Q?IiZaxidX/Q/e+2czaxTVLVRxSoV4TiiNBdheHmIQCGVSYtgg7sx1QN6L4A/3?= =?us-ascii?Q?GBll+H+zz/jdCae2+mzLluQTAxMroDZyMZbBoe4okaESuANcMQX6pmnlEDQk?= =?us-ascii?Q?7W/GWU8SNqhzBZuCoO5FwSTKj93YdxNFMJU83WqvSEeRgIcASLRQTD0E0yZA?= =?us-ascii?Q?F4MOA3ptyRDNqfhPtqtl1YX2h91MuxPzYzv/K+HCCO0+60GNSBq6uIPotB7x?= =?us-ascii?Q?YwHOiKCi0rLMOi7hdx3z+cwAn/ddDbIa4OdDAp5Xja75qdwB6hb2BtzyZksf?= =?us-ascii?Q?vbQCs6IOB06RAod5DVP7HCXg4RQJS8fH7aP1wRy94gyLXPCrd40dsvXW4xBk?= =?us-ascii?Q?Nub4/Epo5gJdrNHSyHq7DllBr24pfX4zxYeGec5dVZDJwciQJNlZvaLIVV0/?= =?us-ascii?Q?qZPckmCRwUVjp4nMIhwp9hEn1YlV2BbngX4x05++J3uB+kch3ln+1v6+4jTI?= =?us-ascii?Q?oqNLeEeBAVViFSHJ6WwnQl2AOLgJB9Vr0ahhXEsMAiCvqWcquiTsNYpUC0/H?= =?us-ascii?Q?UO6wXzGvEmFRHFWnzG9q3yGcy8thBRemCRb6xgmjnFaVJoNSfuNqCqdsYqBW?= =?us-ascii?Q?h4Ddr3BUC3iBFVezH72hpxNT1U/LgDZrVkVbeayYDJ65nw2Hb69aTcYsRs/N?= =?us-ascii?Q?jHZ/bicA7FcJssCocpyv6Z0H5PP+YS0/bVxNf4joX+pnteTEj/e3Y9+ZNLVN?= =?us-ascii?Q?ubwtixLV1S6a25SfLTUAWtgn6R3ZPStv3Vwtadw6tdRUrwDkE+3x+gb2PuM/?= =?us-ascii?Q?OATYyTBhDcMf8BKffNgp2ENKYXBlUtKRWzfLyp07PstFOFReED7rNd886SRD?= =?us-ascii?Q?uPiV9A=3D=3D?= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9147b8a1-faef-4e4e-15c2-08d9f8b8a5ef 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:39.9663 (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: DytduTaBRl8tfr6gcfsJspzBIorwNaKQ3KEX28+KNLDX83j7F48EK9wPTt/6BVdbC3tglGOs5svxJGj2ACusPXHpC31I4hOXN4Xk4ft4/JY= 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.8 X-MIME-Autoconverted: from quoted-printable to 8bit by lists01.pubmisc.prod.ext.phx2.redhat.com id 21PNhopA027583 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.84 on 10.5.11.23 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: 1645832660176100004 Content-Type: text/plain; charset="utf-8" Add a command that can replace bs in following BdrvChild structures: - qdev blk root child - block-export blk root child - any child BlockDriverState selected by child-name Signed-off-by: Vladimir Sementsov-Ogievskiy --- qapi/block-core.json | 62 ++++++++++++++++++++++++++++++++++++++++ blockdev.c | 65 ++++++++++++++++++++++++++++++++++++++++++ stubs/blk-by-qdev-id.c | 9 ++++++ stubs/meson.build | 1 + 4 files changed, 137 insertions(+) create mode 100644 stubs/blk-by-qdev-id.c diff --git a/qapi/block-core.json b/qapi/block-core.json index 9a5a3641d0..f760dc21f5 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -5574,3 +5574,65 @@ { 'command': 'blockdev-snapshot-delete-internal-sync', 'data': { 'device': 'str', '*id': 'str', '*name': 'str'}, 'returns': 'SnapshotInfo' } + +## +# @BlockParentType: +# +# Since 7.0 +## +{ 'enum': 'BlockParentType', + 'data': ['qdev', 'driver', 'export'] } + +## +# @BdrvChildRefQdev: +# +# Since 7.0 +## +{ 'struct': 'BdrvChildRefQdev', + 'data': { 'qdev-id': 'str' } } + +## +# @BdrvChildRefExport: +# +# Since 7.0 +## +{ 'struct': 'BdrvChildRefExport', + 'data': { 'export-id': 'str' } } + +## +# @BdrvChildRefDriver: +# +# Since 7.0 +## +{ 'struct': 'BdrvChildRefDriver', + 'data': { 'node-name': 'str', 'child': 'str' } } + +## +# @BlockdevReplace: +# +# Since 7.0 +## +{ 'union': 'BlockdevReplace', + 'base': { + 'parent-type': 'BlockParentType', + 'new-child': 'str' + }, + 'discriminator': 'parent-type', + 'data': { + 'qdev': 'BdrvChildRefQdev', + 'export': 'BdrvChildRefExport', + 'driver': 'BdrvChildRefDriver' + } } + +## +# @x-blockdev-replace: +# +# Replace a block-node associated with device (selected by +# @qdev-id) or with block-export (selected by @export-id) or +# any child of block-node (selected by @node-name and @child) +# with @new-child block-node. +# +# Since 7.0 +## +{ 'command': 'x-blockdev-replace', 'boxed': true, + 'data': 'BlockdevReplace' } diff --git a/blockdev.c b/blockdev.c index d20963be2a..9fd1783be2 100644 --- a/blockdev.c +++ b/blockdev.c @@ -2229,6 +2229,71 @@ static void blockdev_add_abort(BlkActionState *commo= n) bdrv_unref(s->bs); } =20 +static int blockdev_replace(BlockdevReplace *repl, Transaction *tran, + Error **errp) +{ + BdrvChild *child =3D NULL; + BlockDriverState *new_child_bs; + + if (repl->parent_type =3D=3D BLOCK_PARENT_TYPE_DRIVER) { + BlockDriverState *parent_bs; + + parent_bs =3D bdrv_find_node(repl->u.driver.node_name); + if (!parent_bs) { + error_setg(errp, "Block driver node with node-name '%s' not " + "found", repl->u.driver.node_name); + return -EINVAL; + } + + child =3D bdrv_find_child(parent_bs, repl->u.driver.child); + if (!child) { + error_setg(errp, "Block driver node '%s' doesn't have child " + "named '%s'", repl->u.driver.node_name, + repl->u.driver.child); + return -EINVAL; + } + } else { + /* Other types are similar, they work through blk */ + BlockBackend *blk; + bool is_qdev =3D repl->parent_type =3D=3D BLOCK_PARENT_TYPE_QDEV; + const char *id =3D + is_qdev ? repl->u.qdev.qdev_id : repl->u.export.export_id; + + assert(is_qdev || repl->parent_type =3D=3D BLOCK_PARENT_TYPE_EXPOR= T); + + blk =3D is_qdev ? blk_by_qdev_id(id, errp) : blk_by_export_id(id, = errp); + if (!blk) { + return -EINVAL; + } + + child =3D blk_root(blk); + if (!child) { + error_setg(errp, "%s '%s' is empty, nothing to replace", + is_qdev ? "Device" : "Export", id); + return -EINVAL; + } + } + + assert(child); + assert(child->bs); + + new_child_bs =3D bdrv_find_node(repl->new_child); + if (!new_child_bs) { + error_setg(errp, "Node '%s' not found", repl->new_child); + return -EINVAL; + } + + return bdrv_replace_child_bs(child, new_child_bs, tran, errp); +} + +void qmp_x_blockdev_replace(BlockdevReplace *repl, Error **errp) +{ + Transaction *tran =3D tran_new(); + int ret =3D blockdev_replace(repl, tran, errp); + + tran_finalize(tran, ret); +} + static const BlkActionOps actions[] =3D { [TRANSACTION_ACTION_KIND_BLOCKDEV_SNAPSHOT] =3D { .instance_size =3D sizeof(ExternalSnapshotState), diff --git a/stubs/blk-by-qdev-id.c b/stubs/blk-by-qdev-id.c new file mode 100644 index 0000000000..0e751ce4f7 --- /dev/null +++ b/stubs/blk-by-qdev-id.c @@ -0,0 +1,9 @@ +#include "qemu/osdep.h" +#include "qapi/error.h" +#include "sysemu/block-backend.h" + +BlockBackend *blk_by_qdev_id(const char *id, Error **errp) +{ + error_setg(errp, "blk '%s' not found", id); + return NULL; +} diff --git a/stubs/meson.build b/stubs/meson.build index d359cbe1ad..90358823fc 100644 --- a/stubs/meson.build +++ b/stubs/meson.build @@ -1,6 +1,7 @@ stub_ss.add(files('bdrv-next-monitor-owned.c')) stub_ss.add(files('blk-commit-all.c')) stub_ss.add(files('blk-exp-close-all.c')) +stub_ss.add(files('blk-by-qdev-id.c')) stub_ss.add(files('blockdev-close-all-bdrv-states.c')) stub_ss.add(files('change-state-handler.c')) stub_ss.add(files('cmos.c')) --=20 2.31.1