From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 164868246576640.6825309669141; Wed, 30 Mar 2022 16:21:05 -0700 (PDT) Received: from localhost ([::1]:50644 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZhcd-0000SG-Ql for importer@patchew.org; Wed, 30 Mar 2022 19:21:03 -0400 Received: from eggs.gnu.org ([209.51.188.92]:34406) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZfsn-0007rj-0S for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:37 -0400 Received: from [2a00:1450:4864:20::131] (port=37757 helo=mail-lf1-x131.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZfsj-000393-QT for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:36 -0400 Received: by mail-lf1-x131.google.com with SMTP id k21so38084119lfe.4 for ; Wed, 30 Mar 2022 14:29:32 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=QNnC0TQU0ReP+KGfor31X/vaX8OqceFn3K2Y/AEfmEs=; b=brLI2MrAmu+dQrZeAgllnXPpTeq9LjaOLdYyacGYK/cWSJAhca6pjrxc1Dcjp4HdSK 1WNomNG+hdH3lEeVcipGDZJIRsVv6XlO3vRKEDgq/lNTPVX1ttii7/cwRoh7vcV7Vk82 I/Frae3Pqo1vm+GGxzlCvvtLlUGpG3RbOfOLtDqGEVYJMc8UG1SBGyLCmwww6W95ye11 /ogN0BJoX+fO+5dfScXkJKb9V+puMADHqBMkCMQn2M8+bis0tJsLyxjEo2zU5lFhsRdf fExmnsa3oDISI7EqhkG8rEarMcsu6bJGDv0rzou6dk8vrgmABw01CDZ59TUdbJuGcEuc 9GpQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=QNnC0TQU0ReP+KGfor31X/vaX8OqceFn3K2Y/AEfmEs=; b=CtGfSQyv8FW2A6634tsHoPEjf6NklDaW92CRSOd6O034exyAqW7VdWVoQd79iC2agg GhMAD75sWT50reMlu1JCuccoLEDq6vDmP0R/T5ecSEi+D0ENnE7poLY+VyQjuwZntT4I UD0140dLc6fXZsXAQMLg+YJS8+RS2VC8n1HJdyQHGgddLTMpfuFlEZp9uBodkgRJLed5 w0PZ7FGpwQDUy4QRwDAJl89J9AV8rdsp9j5oS3IeTrZBdaxfwAzgvLLwwBnVRLBRezrL V/szefOkIwFxJvzHEIrgg1hWcS7Br3mCl3jQowqbAbm82fUNPVy6RNYp8IAn4epR5sYx u7FQ== X-Gm-Message-State: AOAM532DJsnzedg3Z+UFSZg6wq1m6lZyU/wo6/k3CM3MoXM5TnR/ONcU FbBsPgIJC2ATaiZsUhpK17QRtw== X-Google-Smtp-Source: ABdhPJwbmkx/sb7yJjCVqaaRiueADNb83Pd2nBtoKBId/4+xiIL5K9dYsIRbBlzMv6PLgwP30aTTdw== X-Received: by 2002:ac2:5cd9:0:b0:44a:2586:a2a2 with SMTP id f25-20020ac25cd9000000b0044a2586a2a2mr8475706lfq.611.1648675771414; Wed, 30 Mar 2022 14:29:31 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 01/45] block: BlockDriver: add .filtered_child_is_backing field Date: Thu, 31 Mar 2022 00:28:18 +0300 Message-Id: <20220330212902.590099-2-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::131 (failed) 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=2a00:1450:4864:20::131; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lf1-x131.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:14 -0400 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: , Cc: kwolf@redhat.com, v.sementsov-og@mail.ru, qemu-devel@nongnu.org, hreitz@redhat.com, vsementsov@openvz.org, John Snow Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648682468631100001 Content-Type: text/plain; charset="utf-8" Unfortunately not all filters use .file child as filtered child. Two exclusions are mirror_top and commit_top. Happily they both are private filters. Bad thing is that this inconsistency is observable through qmp commands query-block / query-named-block-nodes. So, could we just change mirror_top and commit_top to use file child as all other filter driver is an open question. Probably, we could do that with some kind of deprecation period, but how to warn users during it? For now, let's just add a field so we can distinguish them in generic code, it will be used in further commits. Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Hanna Reitz --- block/commit.c | 1 + block/mirror.c | 1 + include/block/block_int-common.h | 13 +++++++++++++ 3 files changed, 15 insertions(+) diff --git a/block/commit.c b/block/commit.c index 851d1c557a..7722a392af 100644 --- a/block/commit.c +++ b/block/commit.c @@ -238,6 +238,7 @@ static BlockDriver bdrv_commit_top =3D { .bdrv_child_perm =3D bdrv_commit_top_child_perm, =20 .is_filter =3D true, + .filtered_child_is_backing =3D true, }; =20 void commit_start(const char *job_id, BlockDriverState *bs, diff --git a/block/mirror.c b/block/mirror.c index d8ecb9efa2..824b273fc7 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -1578,6 +1578,7 @@ static BlockDriver bdrv_mirror_top =3D { .bdrv_child_perm =3D bdrv_mirror_top_child_perm, =20 .is_filter =3D true, + .filtered_child_is_backing =3D true, }; =20 static BlockJob *mirror_start_job( diff --git a/include/block/block_int-common.h b/include/block/block_int-com= mon.h index 8947abab76..9d91ccbcbf 100644 --- a/include/block/block_int-common.h +++ b/include/block/block_int-common.h @@ -119,6 +119,19 @@ struct BlockDriver { * (And this filtered child must then be bs->file or bs->backing.) */ bool is_filter; + /* + * Only make sense for filter drivers, for others must be false. + * If true, filtered child is bs->backing. Otherwise it's bs->file. + * Only two internal filters use bs->backing as filtered child and has= this + * field set to true: mirror_top and commit_top. + * + * Never create any more such filters! + * + * TODO: imagine how to deprecate this behavior and make all filters w= ork + * similarly using bs->file as filtered child. + */ + bool filtered_child_is_backing; + /* * Set to true if the BlockDriver is a format driver. Format nodes * generally do not expect their children to be other format nodes --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648682860960346.1886869978018; Wed, 30 Mar 2022 16:27:40 -0700 (PDT) Received: from localhost ([::1]:44126 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZhj1-0006ba-US for importer@patchew.org; Wed, 30 Mar 2022 19:27:39 -0400 Received: from eggs.gnu.org ([209.51.188.92]:34444) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZfsn-0007sK-Ps for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:37 -0400 Received: from [2a00:1450:4864:20::230] (port=38717 helo=mail-lj1-x230.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZfsk-00039F-4O for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:37 -0400 Received: by mail-lj1-x230.google.com with SMTP id s13so12413099ljd.5 for ; Wed, 30 Mar 2022 14:29:33 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=vNNdHTPn1DUv74tlqYf7JLxDRsIrqUmTToAPG0Th9yo=; b=Y4NguSOOc0Yk3oPa81yyiTsq9/jz5Ukg7XzbAx6GPLMDIW+Ar8rEMYJbfjGshGavBC S4cdoMjAHXwtJ97gtqpfeIglPTvSdoXVcLDUB/Uzoj1lRyOGPbETN+EN+I/XTESRAJWA hheKXrSJ8F3/0DkhWhrgKTuigw8Dj4x9K8yPRKQ99oIWtFdu1yAzAIY9URabNyJEdxS8 jkCVj/qMyYych2InJf2OS1N5wgNODv+meeU8xWSMVkceihHdkL7XTY7RQdioaCpW/k7X wCLEJaG1+6OAFSssUk9V/9V9iqT0HOCO4Uq5zhaITmxVGyCb8EBPTlCTILcixYb9Qkka BrnA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=vNNdHTPn1DUv74tlqYf7JLxDRsIrqUmTToAPG0Th9yo=; b=ws5Q8t4ifJyhuXcfFSGuVA9GOTkF6BPsjaz1Ui2tSaqmADwiMF72y8uBeHW460+Oaj 6qg2Wd0s6pbMzvZrponoE6bZPW+kA7CXAXFiLRq5kx4XONdNcsQMoBc8qE78BRnCF5ZB 8yIKKp49gxd6/Sj4S/Z6yioobcIpjMD1ydhm1YuGsXE3B4FpL4550Qyub8wo8Z8uww+b ulwraXgPnInLBKnICJqZgZxo1rsZb5uVwT37DIwPg0zItP+Sn0HvshcSb+qgl9ebVlL1 h5XLu2rR6hRCDObpRvNh2US8HhP2sUG9Tfuyb5CN3Iwy8IeO4ueKpM6ExtlX7QulonUp 0YtA== X-Gm-Message-State: AOAM532B7sk3HurFFSMzU65uDxxeUvRxx3IBS+Ih60JrPS5zMXUsbI5g jUrmLufAFCgrCRhJnZgax21Rug== X-Google-Smtp-Source: ABdhPJzo1MtEfZ6B/UH3741I+qEx1eTd9rnpCwHWaqTeys1T0IJyupnHkEsE/uH7F5gwKucUcGzSqg== X-Received: by 2002:a2e:22c5:0:b0:249:b8c6:282e with SMTP id i188-20020a2e22c5000000b00249b8c6282emr8434868lji.140.1648675772445; Wed, 30 Mar 2022 14:29:32 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 02/45] block: introduce bdrv_open_file_child() helper Date: Thu, 31 Mar 2022 00:28:19 +0300 Message-Id: <20220330212902.590099-3-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::230 (failed) 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=2a00:1450:4864:20::230; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lj1-x230.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:14 -0400 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: , Cc: kwolf@redhat.com, Fam Zheng , v.sementsov-og@mail.ru, Stefan Hajnoczi , Jeff Cody , Wen Congyang , Xie Changlong , qemu-devel@nongnu.org, hreitz@redhat.com, vsementsov@openvz.org, Pavel Dovgalyuk , "Denis V. Lunev" , Paolo Bonzini , Stefan Weil , John Snow , Ari Sundholm Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648682862592100001 Content-Type: text/plain; charset="utf-8" Almost all drivers call bdrv_open_child() similarly. Let's create a helper for this. The only not updated driver that call bdrv_open_child() to set bs->file is raw-format, as it sometimes want to have filtered child but don't set drv->is_filter to true. Possibly we should implement drv->is_filter_func() handler, to consider raw-format as filter when it works as filter.. But it's another story. Note also, that we decrease assignments to bs->file in code: it helps us restrict modifying this field in further commit. Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Hanna Reitz --- block.c | 21 +++++++++++++++++++++ block/blkdebug.c | 9 +++------ block/blklogwrites.c | 7 ++----- block/blkreplay.c | 7 ++----- block/blkverify.c | 9 +++------ block/bochs.c | 7 +++---- block/cloop.c | 7 +++---- block/copy-before-write.c | 9 ++++----- block/copy-on-read.c | 9 ++++----- block/crypto.c | 11 ++++++----- block/dmg.c | 7 +++---- block/filter-compress.c | 6 ++---- block/parallels.c | 7 +++---- block/preallocate.c | 9 ++++----- block/qcow.c | 6 ++---- block/qcow2.c | 8 ++++---- block/qed.c | 8 ++++---- block/replication.c | 8 +++----- block/throttle.c | 8 +++----- block/vdi.c | 7 +++---- block/vhdx.c | 7 +++---- block/vmdk.c | 7 +++---- block/vpc.c | 7 +++---- include/block/block-global-state.h | 3 +++ 24 files changed, 94 insertions(+), 100 deletions(-) diff --git a/block.c b/block.c index 718e4cae8b..8110b1b330 100644 --- a/block.c +++ b/block.c @@ -3666,6 +3666,27 @@ BdrvChild *bdrv_open_child(const char *filename, errp); } =20 +/* + * Wrapper on bdrv_open_child() for most popular case: open primary child = of bs. + */ +int bdrv_open_file_child(const char *filename, + QDict *options, const char *bdref_key, + BlockDriverState *parent, Error **errp) +{ + BdrvChildRole role; + + /* commit_top and mirror_top don't use this function */ + assert(!parent->drv->filtered_child_is_backing); + + role =3D parent->drv->is_filter ? + (BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY) : BDRV_CHILD_IMAGE; + + parent->file =3D bdrv_open_child(filename, options, bdref_key, parent, + &child_of_bds, role, false, errp); + + return parent->file ? 0 : -EINVAL; +} + /* * TODO Future callers may need to specify parent/child_class in order for * option inheritance to work. Existing callers use it for the root node. diff --git a/block/blkdebug.c b/block/blkdebug.c index bbf2948703..5fcfc8ac6f 100644 --- a/block/blkdebug.c +++ b/block/blkdebug.c @@ -503,12 +503,9 @@ static int blkdebug_open(BlockDriverState *bs, QDict *= options, int flags, } =20 /* Open the image file */ - bs->file =3D bdrv_open_child(qemu_opt_get(opts, "x-image"), options, "= image", - bs, &child_of_bds, - BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY, - false, errp); - if (!bs->file) { - ret =3D -EINVAL; + ret =3D bdrv_open_file_child(qemu_opt_get(opts, "x-image"), options, "= image", + bs, errp); + if (ret < 0) { goto out; } =20 diff --git a/block/blklogwrites.c b/block/blklogwrites.c index f7a251e91f..f66a617eb3 100644 --- a/block/blklogwrites.c +++ b/block/blklogwrites.c @@ -155,11 +155,8 @@ static int blk_log_writes_open(BlockDriverState *bs, Q= Dict *options, int flags, } =20 /* Open the file */ - bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_of_bds, - BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY, f= alse, - errp); - if (!bs->file) { - ret =3D -EINVAL; + ret =3D bdrv_open_file_child(NULL, options, "file", bs, errp); + if (ret < 0) { goto fail; } =20 diff --git a/block/blkreplay.c b/block/blkreplay.c index dcbe780ddb..76a0b8d12a 100644 --- a/block/blkreplay.c +++ b/block/blkreplay.c @@ -26,11 +26,8 @@ static int blkreplay_open(BlockDriverState *bs, QDict *o= ptions, int flags, int ret; =20 /* Open the image file */ - bs->file =3D bdrv_open_child(NULL, options, "image", bs, &child_of_bds, - BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY, - false, errp); - if (!bs->file) { - ret =3D -EINVAL; + ret =3D bdrv_open_file_child(NULL, options, "image", bs, errp); + if (ret < 0) { goto fail; } =20 diff --git a/block/blkverify.c b/block/blkverify.c index e4a37af3b2..e4d40a63aa 100644 --- a/block/blkverify.c +++ b/block/blkverify.c @@ -122,12 +122,9 @@ static int blkverify_open(BlockDriverState *bs, QDict = *options, int flags, } =20 /* Open the raw file */ - bs->file =3D bdrv_open_child(qemu_opt_get(opts, "x-raw"), options, "ra= w", - bs, &child_of_bds, - BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY, - false, errp); - if (!bs->file) { - ret =3D -EINVAL; + ret =3D bdrv_open_file_child(qemu_opt_get(opts, "x-raw"), options, "ra= w", + bs, errp); + if (ret < 0) { goto fail; } =20 diff --git a/block/bochs.c b/block/bochs.c index 4d68658087..b2dc06bbfd 100644 --- a/block/bochs.c +++ b/block/bochs.c @@ -110,10 +110,9 @@ static int bochs_open(BlockDriverState *bs, QDict *opt= ions, int flags, return ret; } =20 - bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_of_bds, - BDRV_CHILD_IMAGE, false, errp); - if (!bs->file) { - return -EINVAL; + ret =3D bdrv_open_file_child(NULL, options, "file", bs, errp); + if (ret < 0) { + return ret; } =20 ret =3D bdrv_pread(bs->file, 0, &bochs, sizeof(bochs)); diff --git a/block/cloop.c b/block/cloop.c index b8c6d0eccd..bee87da173 100644 --- a/block/cloop.c +++ b/block/cloop.c @@ -71,10 +71,9 @@ static int cloop_open(BlockDriverState *bs, QDict *optio= ns, int flags, return ret; } =20 - bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_of_bds, - BDRV_CHILD_IMAGE, false, errp); - if (!bs->file) { - return -EINVAL; + ret =3D bdrv_open_file_child(NULL, options, "file", bs, errp); + if (ret < 0) { + return ret; } =20 /* read header */ diff --git a/block/copy-before-write.c b/block/copy-before-write.c index a8a06fdc09..4fad564691 100644 --- a/block/copy-before-write.c +++ b/block/copy-before-write.c @@ -376,12 +376,11 @@ static int cbw_open(BlockDriverState *bs, QDict *opti= ons, int flags, BDRVCopyBeforeWriteState *s =3D bs->opaque; BdrvDirtyBitmap *bitmap =3D NULL; int64_t cluster_size; + int ret; =20 - bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_of_bds, - BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY, - false, errp); - if (!bs->file) { - return -EINVAL; + ret =3D bdrv_open_file_child(NULL, options, "file", bs, errp); + if (ret < 0) { + return ret; } =20 s->target =3D bdrv_open_child(NULL, options, "target", bs, &child_of_b= ds, diff --git a/block/copy-on-read.c b/block/copy-on-read.c index 1fc7fb3333..815ac1d835 100644 --- a/block/copy-on-read.c +++ b/block/copy-on-read.c @@ -41,12 +41,11 @@ static int cor_open(BlockDriverState *bs, QDict *option= s, int flags, BDRVStateCOR *state =3D bs->opaque; /* Find a bottom node name, if any */ const char *bottom_node =3D qdict_get_try_str(options, "bottom"); + int ret; =20 - bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_of_bds, - BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY, - false, errp); - if (!bs->file) { - return -EINVAL; + ret =3D bdrv_open_file_child(NULL, options, "file", bs, errp); + if (ret < 0) { + return ret; } =20 bs->supported_read_flags =3D BDRV_REQ_PREFETCH; diff --git a/block/crypto.c b/block/crypto.c index 1ba82984ef..e165447a5b 100644 --- a/block/crypto.c +++ b/block/crypto.c @@ -261,15 +261,14 @@ static int block_crypto_open_generic(QCryptoBlockForm= at format, { BlockCrypto *crypto =3D bs->opaque; QemuOpts *opts =3D NULL; - int ret =3D -EINVAL; + int ret; QCryptoBlockOpenOptions *open_opts =3D NULL; unsigned int cflags =3D 0; QDict *cryptoopts =3D NULL; =20 - bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_of_bds, - BDRV_CHILD_IMAGE, false, errp); - if (!bs->file) { - return -EINVAL; + ret =3D bdrv_open_file_child(NULL, options, "file", bs, errp); + if (ret < 0) { + return ret; } =20 bs->supported_write_flags =3D BDRV_REQ_FUA & @@ -277,6 +276,7 @@ static int block_crypto_open_generic(QCryptoBlockFormat= format, =20 opts =3D qemu_opts_create(opts_spec, NULL, 0, &error_abort); if (!qemu_opts_absorb_qdict(opts, options, errp)) { + ret =3D -EINVAL; goto cleanup; } =20 @@ -285,6 +285,7 @@ static int block_crypto_open_generic(QCryptoBlockFormat= format, =20 open_opts =3D block_crypto_open_opts_init(cryptoopts, errp); if (!open_opts) { + ret =3D -EINVAL; goto cleanup; } =20 diff --git a/block/dmg.c b/block/dmg.c index c626587f9c..f91c5d3980 100644 --- a/block/dmg.c +++ b/block/dmg.c @@ -440,10 +440,9 @@ static int dmg_open(BlockDriverState *bs, QDict *optio= ns, int flags, return ret; } =20 - bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_of_bds, - BDRV_CHILD_IMAGE, false, errp); - if (!bs->file) { - return -EINVAL; + ret =3D bdrv_open_file_child(NULL, options, "file", bs, errp); + if (ret < 0) { + return ret; } =20 block_module_load_one("dmg-bz2"); diff --git a/block/filter-compress.c b/block/filter-compress.c index d5be538619..b2cfa9a9a5 100644 --- a/block/filter-compress.c +++ b/block/filter-compress.c @@ -30,10 +30,8 @@ static int compress_open(BlockDriverState *bs, QDict *options, int flags, Error **errp) { - bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_of_bds, - BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY, - false, errp); - if (!bs->file) { + int ret =3D bdrv_open_file_child(NULL, options, "file", bs, errp); + if (ret < 0) { return -EINVAL; } =20 diff --git a/block/parallels.c b/block/parallels.c index cd23e02d06..c55f1af5da 100644 --- a/block/parallels.c +++ b/block/parallels.c @@ -736,10 +736,9 @@ static int parallels_open(BlockDriverState *bs, QDict = *options, int flags, Error *local_err =3D NULL; char *buf; =20 - bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_of_bds, - BDRV_CHILD_IMAGE, false, errp); - if (!bs->file) { - return -EINVAL; + ret =3D bdrv_open_file_child(NULL, options, "file", bs, errp); + if (ret < 0) { + return ret; } =20 ret =3D bdrv_pread(bs->file, 0, &ph, sizeof(ph)); diff --git a/block/preallocate.c b/block/preallocate.c index e15cb8c74a..d50ee7f49b 100644 --- a/block/preallocate.c +++ b/block/preallocate.c @@ -134,6 +134,7 @@ static int preallocate_open(BlockDriverState *bs, QDict= *options, int flags, Error **errp) { BDRVPreallocateState *s =3D bs->opaque; + int ret; =20 /* * s->data_end and friends should be initialized on permission update. @@ -141,11 +142,9 @@ static int preallocate_open(BlockDriverState *bs, QDic= t *options, int flags, */ s->file_end =3D s->zero_start =3D s->data_end =3D -EINVAL; =20 - bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_of_bds, - BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY, - false, errp); - if (!bs->file) { - return -EINVAL; + ret =3D bdrv_open_file_child(NULL, options, "file", bs, errp); + if (ret < 0) { + return ret; } =20 if (!preallocate_absorb_opts(&s->opts, options, bs->file->bs, errp)) { diff --git a/block/qcow.c b/block/qcow.c index 4fba1b9e36..b4033c0db9 100644 --- a/block/qcow.c +++ b/block/qcow.c @@ -121,10 +121,8 @@ static int qcow_open(BlockDriverState *bs, QDict *opti= ons, int flags, qdict_extract_subqdict(options, &encryptopts, "encrypt."); encryptfmt =3D qdict_get_try_str(encryptopts, "format"); =20 - bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_of_bds, - BDRV_CHILD_IMAGE, false, errp); - if (!bs->file) { - ret =3D -EINVAL; + ret =3D bdrv_open_file_child(NULL, options, "file", bs, errp); + if (ret < 0) { goto fail; } =20 diff --git a/block/qcow2.c b/block/qcow2.c index b5c47931ef..6de8dbef32 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -1891,11 +1891,11 @@ static int qcow2_open(BlockDriverState *bs, QDict *= options, int flags, .errp =3D errp, .ret =3D -EINPROGRESS }; + int ret; =20 - bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_of_bds, - BDRV_CHILD_IMAGE, false, errp); - if (!bs->file) { - return -EINVAL; + ret =3D bdrv_open_file_child(NULL, options, "file", bs, errp); + if (ret < 0) { + return ret; } =20 /* Initialise locks */ diff --git a/block/qed.c b/block/qed.c index f34d9a3ac1..1ff024f16d 100644 --- a/block/qed.c +++ b/block/qed.c @@ -559,11 +559,11 @@ static int bdrv_qed_open(BlockDriverState *bs, QDict = *options, int flags, .errp =3D errp, .ret =3D -EINPROGRESS }; + int ret; =20 - bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_of_bds, - BDRV_CHILD_IMAGE, false, errp); - if (!bs->file) { - return -EINVAL; + ret =3D bdrv_open_file_child(NULL, options, "file", bs, errp); + if (ret < 0) { + return ret; } =20 bdrv_qed_init_state(bs); diff --git a/block/replication.c b/block/replication.c index 55c8f894aa..2f17397764 100644 --- a/block/replication.c +++ b/block/replication.c @@ -88,11 +88,9 @@ static int replication_open(BlockDriverState *bs, QDict = *options, const char *mode; const char *top_id; =20 - bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_of_bds, - BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY, - false, errp); - if (!bs->file) { - return -EINVAL; + ret =3D bdrv_open_file_child(NULL, options, "file", bs, errp); + if (ret < 0) { + return ret; } =20 ret =3D -EINVAL; diff --git a/block/throttle.c b/block/throttle.c index 6e8d52fa24..4fb5798c27 100644 --- a/block/throttle.c +++ b/block/throttle.c @@ -78,11 +78,9 @@ static int throttle_open(BlockDriverState *bs, QDict *op= tions, char *group; int ret; =20 - bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_of_bds, - BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY, - false, errp); - if (!bs->file) { - return -EINVAL; + ret =3D bdrv_open_file_child(NULL, options, "file", bs, errp); + if (ret < 0) { + return ret; } bs->supported_write_flags =3D bs->file->bs->supported_write_flags | BDRV_REQ_WRITE_UNCHANGED; diff --git a/block/vdi.c b/block/vdi.c index cca3a3a356..a539081138 100644 --- a/block/vdi.c +++ b/block/vdi.c @@ -377,10 +377,9 @@ static int vdi_open(BlockDriverState *bs, QDict *optio= ns, int flags, int ret; QemuUUID uuid_link, uuid_parent; =20 - bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_of_bds, - BDRV_CHILD_IMAGE, false, errp); - if (!bs->file) { - return -EINVAL; + ret =3D bdrv_open_file_child(NULL, options, "file", bs, errp); + if (ret < 0) { + return ret; } =20 logout("\n"); diff --git a/block/vhdx.c b/block/vhdx.c index 410c6f9610..994f8b91cc 100644 --- a/block/vhdx.c +++ b/block/vhdx.c @@ -997,10 +997,9 @@ static int vhdx_open(BlockDriverState *bs, QDict *opti= ons, int flags, uint64_t signature; Error *local_err =3D NULL; =20 - bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_of_bds, - BDRV_CHILD_IMAGE, false, errp); - if (!bs->file) { - return -EINVAL; + ret =3D bdrv_open_file_child(NULL, options, "file", bs, errp); + if (ret < 0) { + return ret; } =20 s->bat =3D NULL; diff --git a/block/vmdk.c b/block/vmdk.c index 37c0946066..9fd417b4a3 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -1263,10 +1263,9 @@ static int vmdk_open(BlockDriverState *bs, QDict *op= tions, int flags, BDRVVmdkState *s =3D bs->opaque; uint32_t magic; =20 - bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_of_bds, - BDRV_CHILD_IMAGE, false, errp); - if (!bs->file) { - return -EINVAL; + ret =3D bdrv_open_file_child(NULL, options, "file", bs, errp); + if (ret < 0) { + return ret; } =20 buf =3D vmdk_read_desc(bs->file, 0, errp); diff --git a/block/vpc.c b/block/vpc.c index 4d8f16e199..cd82eb7f92 100644 --- a/block/vpc.c +++ b/block/vpc.c @@ -233,10 +233,9 @@ static int vpc_open(BlockDriverState *bs, QDict *optio= ns, int flags, int ret; int64_t bs_size; =20 - bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_of_bds, - BDRV_CHILD_IMAGE, false, errp); - if (!bs->file) { - return -EINVAL; + ret =3D bdrv_open_file_child(NULL, options, "file", bs, errp); + if (ret < 0) { + return ret; } =20 opts =3D qemu_opts_create(&vpc_runtime_opts, NULL, 0, &error_abort); diff --git a/include/block/block-global-state.h b/include/block/block-globa= l-state.h index 25bb69bbef..600afcf5bd 100644 --- a/include/block/block-global-state.h +++ b/include/block/block-global-state.h @@ -76,6 +76,9 @@ BdrvChild *bdrv_open_child(const char *filename, const BdrvChildClass *child_class, BdrvChildRole child_role, bool allow_none, Error **errp); +int bdrv_open_file_child(const char *filename, + QDict *options, const char *bdref_key, + BlockDriverState *parent, Error **errp); BlockDriverState *bdrv_open_blockdev_ref(BlockdevRef *ref, Error **errp); int bdrv_set_backing_hd(BlockDriverState *bs, BlockDriverState *backing_hd, Error **errp); --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648682682610208.08509568756926; Wed, 30 Mar 2022 16:24:42 -0700 (PDT) Received: from localhost ([::1]:35634 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZhg9-0000sW-Jz for importer@patchew.org; Wed, 30 Mar 2022 19:24:41 -0400 Received: from eggs.gnu.org ([209.51.188.92]:34390) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZfsm-0007rc-PN for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:36 -0400 Received: from [2a00:1450:4864:20::12c] (port=39794 helo=mail-lf1-x12c.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZfsk-00039N-KL for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:36 -0400 Received: by mail-lf1-x12c.google.com with SMTP id w7so38087193lfd.6 for ; Wed, 30 Mar 2022 14:29:34 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=E4WZxi2Hv1Mu9evftq2+HMaOyt8YOtbqwpKKMvDGn5w=; b=jgiqym3eyRavWH4NLio6f/vZpS9aw12fvrFkHC+9r3YWEkqEozFAB5i+cRoxMq4+fi v6sJJ3XGL/J8Pqj7RBsJtMm88xTT+AiWreXSthry7/Jb5yMZIohgksHpCFV0QbmSR7HR DPd67MRetyiDmVbRN/xXgfbfaEMXRxtb0hG2Q0dVkoCueEC5gDG3Aw/5MEwkbAAEZCVd z7mQXhtqYOGxAA1NVAzhAWG1nSuGmmyJdoSixeTyQwU6LEPZ8JtCGbMX7tnRIVC6R2gY YAuCTQN67c0Q022XTrt3eFFDGYSd/eknxoFvhC2Vi6yb9liigCBlsWNyfmH/Yl468u/G AOPA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=E4WZxi2Hv1Mu9evftq2+HMaOyt8YOtbqwpKKMvDGn5w=; b=G1wnLcWkDGT7hl9lwrlKA7PzlleFx0cU4O3wdNdPMkNgT7gKhzxTOuHrnjOdHqjH9e gB5JCuA8Hj4jqgRZdQjzXYw1+s33RMaCcnNcHo3K6z/nSiMlU3CCEZc4WmXKB9uz4ChE xgnoK+84CrvdPKIJOHY7i41TW2rqzTyH+WoesiNl/7IedwFxSOF8jjZq22YyoylHmxgv KW+S1dmUtR9gb/6tGxOog1r14IQvvp9moCpSDAUGBcy2YL6TknkXNj0xKum1eE6sOV4Q okmImmwcr8yZHuhcVoTD603ZMlDkzs5Te91G8Rua7TayajCkauclBxN9U+HoIYezjxi+ AVaw== X-Gm-Message-State: AOAM530/16f9Wpsk6re5IkR5vrakDRwktVDaD6gO5XMSHV9op9P2p3fv yvBuJxhoLUd+O2dKiJJ6Lct1NQ== X-Google-Smtp-Source: ABdhPJxhqk/Qu7sQeNlHk3LF6eEFUqHW2BqUCTCewU1RMlHOcpZyb30V9QmC9/n5mvRmqvpx1gdCzA== X-Received: by 2002:a05:6512:2256:b0:44a:9868:c02f with SMTP id i22-20020a056512225600b0044a9868c02fmr8543429lfu.501.1648675773077; Wed, 30 Mar 2022 14:29:33 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 03/45] block/blklogwrites: don't care to remove bs->file child on failure Date: Thu, 31 Mar 2022 00:28:20 +0300 Message-Id: <20220330212902.590099-4-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::12c (failed) 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=2a00:1450:4864:20::12c; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lf1-x12c.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:13 -0400 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: , Cc: kwolf@redhat.com, v.sementsov-og@mail.ru, qemu-devel@nongnu.org, hreitz@redhat.com, vsementsov@openvz.org, Ari Sundholm Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648682683774100001 Content-Type: text/plain; charset="utf-8" We don't need to remove bs->file, generic layer takes care of it. No other driver cares to remove bs->file on failure by hand. Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Hanna Reitz --- block/blklogwrites.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/block/blklogwrites.c b/block/blklogwrites.c index f66a617eb3..7d25df97cc 100644 --- a/block/blklogwrites.c +++ b/block/blklogwrites.c @@ -254,10 +254,6 @@ fail_log: s->log_file =3D NULL; } fail: - if (ret < 0) { - bdrv_unref_child(bs, bs->file); - bs->file =3D NULL; - } qemu_opts_del(opts); return ret; } --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648682596485988.6589719542251; Wed, 30 Mar 2022 16:23:16 -0700 (PDT) Received: from localhost ([::1]:58950 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZhel-00063C-Cx for importer@patchew.org; Wed, 30 Mar 2022 19:23:15 -0400 Received: from eggs.gnu.org ([209.51.188.92]:34488) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZfso-0007t2-Gy for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:38 -0400 Received: from [2a00:1450:4864:20::133] (port=34615 helo=mail-lf1-x133.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZfsl-00039Z-Ha for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:38 -0400 Received: by mail-lf1-x133.google.com with SMTP id 5so38079656lfp.1 for ; Wed, 30 Mar 2022 14:29:35 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=OyOe9IHk32wXpt1lyEECx4DZ0roDPHO4SQyPjhiHFIk=; b=AkXoLHWE3LmdEq51WNmjw9pPqtK0kWxw2ilWD6OIOxzCguLOuo2nnyNdiZpHxQRiUs 6D6tkecY6dPm1yVti+yEG7a0K2lgyDRRq+3Xob4PK9+SxdxAosKhfOF/zOGGGMPYeRW7 WQ5KAqUiCD05/RAX9MhK5ZZuGMiNjLseANw6D49JrIMWpJxgWgfts1ugCJ6gbVFJOQeV K62W/OjvFfRmKXVaX1GD2L6/+hDmnNnrZHgYHbzsxHuu5RPV2oUd3pbSjr8G+ST4DrGe N/YJj5gLZ/Sw70xUYkKO5gWMkS3QKN2xpwdIII7BLLvNV3VqRPTjUUo+k9a3eRRPFnKv IJQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=OyOe9IHk32wXpt1lyEECx4DZ0roDPHO4SQyPjhiHFIk=; b=7Kh4xSvO0yH/cH/Nr04oZ6sHrybu2/iDVJ7KuYJMKK06kMDRQk6CYrMElVjp5GX2/k h5vZVgN+FCmdGubNk292K9lYQHXXEGBQO8MYKEA6lQRbgTnkeZsU1rWtXw2NxV/ihbNI ogDvo5R5fulRRwOm2H6XbDT712QSLgunSmMzZ1xkrdQw4BBAwoD2H6LVKXwyvPpz4tf2 9nIVbDOQYkLyUZKBotiBCQhm2jySIS07ZYls0P6mAHmYmqkWUlyMMsbmMeh/gpzXb04f pKI0NHxphkfw/zZnDYqHKJ+U7v0VtPu9grWY18wYJgtRcWpmsKeSb7qtZGN/Ib5sMkBB 6R8Q== X-Gm-Message-State: AOAM530S7JD5JrRkATUMI0J//LvkVLkHkcfvAi1S/Khhux93c6lpZxuX nWsj16EeKG+w4xtBAskxlr2Pzw== X-Google-Smtp-Source: ABdhPJxlwTD3RJO/wQjgXwk9ycK8UeC9U+Al0EF4KEd+I+aG5OFA6djtmM8IuHqM+ni77FnlnPkK6g== X-Received: by 2002:a05:6512:2214:b0:44a:348a:d72 with SMTP id h20-20020a056512221400b0044a348a0d72mr8585285lfu.416.1648675773887; Wed, 30 Mar 2022 14:29:33 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 04/45] test-bdrv-graph-mod: update test_parallel_perm_update test case Date: Thu, 31 Mar 2022 00:28:21 +0300 Message-Id: <20220330212902.590099-5-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::133 (failed) 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=2a00:1450:4864:20::133; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lf1-x133.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:15 -0400 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: , Cc: kwolf@redhat.com, hreitz@redhat.com, vsementsov@openvz.org, v.sementsov-og@mail.ru, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648682597022100001 test_parallel_perm_update() does two things that we are going to restrict in the near future: 1. It updates bs->file field by hand. bs->file will be managed automatically by generic code (together with bs->children list). Let's better refactor our "tricky" bds to have own state where one of children is linked as "selected". This also looks less "tricky", so avoid using this word. 2. It create FILTERED children that are not PRIMARY. Except for tests all FILTERED children in the Qemu block layer are always PRIMARY as well. We are going to formalize this rule, so let's better use DATA children here. While being here, update the picture to better correspond to the test code. Signed-off-by: Vladimir Sementsov-Ogievskiy --- tests/unit/test-bdrv-graph-mod.c | 70 ++++++++++++++++++++------------ 1 file changed, 44 insertions(+), 26 deletions(-) diff --git a/tests/unit/test-bdrv-graph-mod.c b/tests/unit/test-bdrv-graph-= mod.c index a6e3bb79be..40795d3c04 100644 --- a/tests/unit/test-bdrv-graph-mod.c +++ b/tests/unit/test-bdrv-graph-mod.c @@ -241,13 +241,26 @@ static void test_parallel_exclusive_write(void) bdrv_unref(top); } =20 -static void write_to_file_perms(BlockDriverState *bs, BdrvChild *c, - BdrvChildRole role, - BlockReopenQueue *reopen_queue, - uint64_t perm, uint64_t shared, - uint64_t *nperm, uint64_t *nshared) +/* + * write-to-selected node may have several DATA children, one of them may = be + * "selected". Exclusive write permission is taken on selected child. + * + * We don't realize write handler itself, as we need only to test how perm= ission + * update works. + */ +typedef struct BDRVWriteToSelectedState { + BdrvChild *selected; +} BDRVWriteToSelectedState; + +static void write_to_selected_perms(BlockDriverState *bs, BdrvChild *c, + BdrvChildRole role, + BlockReopenQueue *reopen_queue, + uint64_t perm, uint64_t shared, + uint64_t *nperm, uint64_t *nshared) { - if (bs->file && c =3D=3D bs->file) { + BDRVWriteToSelectedState *s =3D bs->opaque; + + if (s->selected && c =3D=3D s->selected) { *nperm =3D BLK_PERM_WRITE; *nshared =3D BLK_PERM_ALL & ~BLK_PERM_WRITE; } else { @@ -256,9 +269,10 @@ static void write_to_file_perms(BlockDriverState *bs, = BdrvChild *c, } } =20 -static BlockDriver bdrv_write_to_file =3D { - .format_name =3D "tricky-perm", - .bdrv_child_perm =3D write_to_file_perms, +static BlockDriver bdrv_write_to_selected =3D { + .format_name =3D "write-to-selected", + .instance_size =3D sizeof(BDRVWriteToSelectedState), + .bdrv_child_perm =3D write_to_selected_perms, }; =20 =20 @@ -266,15 +280,18 @@ static BlockDriver bdrv_write_to_file =3D { * The following test shows that topological-sort order is required for * permission update, simple DFS is not enough. * - * Consider the block driver which has two filter children: one active - * with exclusive write access and one inactive with no specific - * permissions. + * Consider the block driver (write-to-selected) which has two children: o= ne is + * selected so we have exclusive write access to it and for the other one = we + * don't need any specific permissions. * * And, these two children has a common base child, like this: + * (additional "top" on top is used in test just because the only public + * function to update permission should get a specific child to update. + * Making bdrv_refresh_perms() public just for this test doesn't worth = it) * - * =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=90 =E2= =94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=90 - * =E2=94=82 fl2 =E2=94=82 =E2=97=80=E2=94=80=E2=94=80 =E2=94=82 top =E2= =94=82 - * =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=98 =E2= =94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=98 + * =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=90 =E2= =94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=90 =E2=94=8C=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=90 + * =E2=94=82 fl2 =E2=94=82 =E2=97=80=E2=94=80=E2=94=80 =E2=94=82 write-to-= selected =E2=94=82 =E2=97=80=E2=94=80=E2=94=80 =E2=94=82 top =E2=94=82 + * =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=98 =E2= =94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=98 =E2=94=94=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=98 * =E2=94=82 =E2=94=82 * =E2=94=82 =E2=94=82 w * =E2=94=82 =E2=96=BC @@ -290,7 +307,7 @@ static BlockDriver bdrv_write_to_file =3D { * * So, exclusive write is propagated. * - * Assume, we want to make fl2 active instead of fl1. + * Assume, we want to select fl2 instead of fl1. * So, we set some option for top driver and do permission update. * * With simple DFS, if permission update goes first through @@ -306,9 +323,10 @@ static BlockDriver bdrv_write_to_file =3D { static void test_parallel_perm_update(void) { BlockDriverState *top =3D no_perm_node("top"); - BlockDriverState *tricky =3D - bdrv_new_open_driver(&bdrv_write_to_file, "tricky", BDRV_O_RDW= R, + BlockDriverState *ws =3D + bdrv_new_open_driver(&bdrv_write_to_selected, "ws", BDRV_O_RDW= R, &error_abort); + BDRVWriteToSelectedState *s =3D ws->opaque; BlockDriverState *base =3D no_perm_node("base"); BlockDriverState *fl1 =3D pass_through_node("fl1"); BlockDriverState *fl2 =3D pass_through_node("fl2"); @@ -320,33 +338,33 @@ static void test_parallel_perm_update(void) */ bdrv_ref(base); =20 - bdrv_attach_child(top, tricky, "file", &child_of_bds, BDRV_CHILD_DATA, + bdrv_attach_child(top, ws, "file", &child_of_bds, BDRV_CHILD_DATA, &error_abort); - c_fl1 =3D bdrv_attach_child(tricky, fl1, "first", &child_of_bds, - BDRV_CHILD_FILTERED, &error_abort); - c_fl2 =3D bdrv_attach_child(tricky, fl2, "second", &child_of_bds, - BDRV_CHILD_FILTERED, &error_abort); + c_fl1 =3D bdrv_attach_child(ws, fl1, "first", &child_of_bds, + BDRV_CHILD_DATA, &error_abort); + c_fl2 =3D bdrv_attach_child(ws, fl2, "second", &child_of_bds, + BDRV_CHILD_DATA, &error_abort); bdrv_attach_child(fl1, base, "backing", &child_of_bds, BDRV_CHILD_FILT= ERED, &error_abort); bdrv_attach_child(fl2, base, "backing", &child_of_bds, BDRV_CHILD_FILT= ERED, &error_abort); =20 /* Select fl1 as first child to be active */ - tricky->file =3D c_fl1; + s->selected =3D c_fl1; bdrv_child_refresh_perms(top, top->children.lh_first, &error_abort); =20 assert(c_fl1->perm & BLK_PERM_WRITE); assert(!(c_fl2->perm & BLK_PERM_WRITE)); =20 /* Now, try to switch active child and update permissions */ - tricky->file =3D c_fl2; + s->selected =3D c_fl2; bdrv_child_refresh_perms(top, top->children.lh_first, &error_abort); =20 assert(c_fl2->perm & BLK_PERM_WRITE); assert(!(c_fl1->perm & BLK_PERM_WRITE)); =20 /* Switch once more, to not care about real child order in the list */ - tricky->file =3D c_fl1; + s->selected =3D c_fl1; bdrv_child_refresh_perms(top, top->children.lh_first, &error_abort); =20 assert(c_fl1->perm & BLK_PERM_WRITE); --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648682774986144.47453825997297; Wed, 30 Mar 2022 16:26:14 -0700 (PDT) Received: from localhost ([::1]:39236 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZhhd-0003H2-Gz for importer@patchew.org; Wed, 30 Mar 2022 19:26:13 -0400 Received: from eggs.gnu.org ([209.51.188.92]:34504) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZfso-0007tW-SS for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:38 -0400 Received: from [2a00:1450:4864:20::22d] (port=43578 helo=mail-lj1-x22d.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZfsm-00039j-5G for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:38 -0400 Received: by mail-lj1-x22d.google.com with SMTP id b43so24945398ljr.10 for ; Wed, 30 Mar 2022 14:29:35 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=d9OJ5RXIXg4BtdAWW5pGtNxedO+9gKWycHuEOgw/Gm8=; b=LcEAg7mmGFfZ/2L8Y2Ccz6hlkFtQz4N6TGMjk6tDlhWcJRi6xVCDlP7B+mTvrHrDLb Rhs8sbrJjNNDar+nwjFsUMhjaPeo1nlgBz9la3ukz6BQGFjjTdJl7if1RrqzQ8wjAeDe 7EtzqAdja9r0EmsOL9HP9Yl3FwiVCiYgPlHISVNkhhyeGcfegubpB+7QoRSJ8RP7SjhR AraZbndC8CZK5bubo2Pm2mu+d5ANy8jAtN/pKM7fXgednm0+AE+PimaelOxt4Y7WvUlK F7fMYWwnfBvI9ATfTmj6WDIG6VVE5LLNHzY9Hjub+A4uYYRsr8n3rwbRUGXJJvgIR0rN JdYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=d9OJ5RXIXg4BtdAWW5pGtNxedO+9gKWycHuEOgw/Gm8=; b=4g6wxMj+5mfqowprsjs7RQiWyJxyZyXUET3FnwyTAnyNN5KeFYFM2qiepGJny65bXi RvVpwSpFFSpvXSw0DHF3KWdjGSbmh1OoZX+L5ZFhVbHOsj60IcjMXwBs4ArDow+x3d1+ PlB4EFMy15qyDO+eeknss5f4MRMh6J2NAy1V/e4ZbXzMQ9UbR7g5aaIAxgU0az4mE7uA ODTAyRVzPwL9B0bcYCNigz5wf+5iv2MnOg3lHkRs09KVaeCG7cJiFherriHBjEoe/U/5 EiuqGoWynZ7bMcyiAm1IHKC3NiH/GUz6w/YbeUTLrXCj1VysX21zcTANMN6o7iMF201m ACcQ== X-Gm-Message-State: AOAM5320uLy8UE+hShgxKtpy4Ii2daRRb/kxWhYp/pFULs1bBz7ohfDY afarzaqgyZ5V4C9J8GvBeVhEWA== X-Google-Smtp-Source: ABdhPJygFBcJUg+3Z4yh7tTnM34yWgXgcv4fFKZwolJI6zAJS3pLvzOONRn4ugSP6uDllUNUlxw4/w== X-Received: by 2002:a2e:9053:0:b0:24a:f0ac:bd7f with SMTP id n19-20020a2e9053000000b0024af0acbd7fmr2216414ljg.425.1648675774646; Wed, 30 Mar 2022 14:29:34 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 05/45] tests-bdrv-drain: bdrv_replace_test driver: declare supports_backing Date: Thu, 31 Mar 2022 00:28:22 +0300 Message-Id: <20220330212902.590099-6-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::22d (failed) 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=2a00:1450:4864:20::22d; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lj1-x22d.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:15 -0400 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: , Cc: kwolf@redhat.com, v.sementsov-og@mail.ru, Nikita Lapshin , qemu-devel@nongnu.org, hreitz@redhat.com, vsementsov@openvz.org, Eric Blake Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648682777214100001 Content-Type: text/plain; charset="utf-8" We do add COW child to the node. In future we are going to forbid adding COW child to the node that doesn't support backing. So, fix it here now. Don't worry about setting bs->backing itself: it further commit we'll update the block-layer to automatically set/unset this field in generic code. Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Hanna Reitz --- tests/unit/test-bdrv-drain.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/unit/test-bdrv-drain.c b/tests/unit/test-bdrv-drain.c index 36be84ae55..23d425a494 100644 --- a/tests/unit/test-bdrv-drain.c +++ b/tests/unit/test-bdrv-drain.c @@ -1948,6 +1948,7 @@ static void coroutine_fn bdrv_replace_test_co_drain_e= nd(BlockDriverState *bs) static BlockDriver bdrv_replace_test =3D { .format_name =3D "replace_test", .instance_size =3D sizeof(BDRVReplaceTestState), + .supports_backing =3D true, =20 .bdrv_close =3D bdrv_replace_test_close, .bdrv_co_preadv =3D bdrv_replace_test_co_preadv, --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648682924624575.1672213210513; Wed, 30 Mar 2022 16:28:44 -0700 (PDT) Received: from localhost ([::1]:47714 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZhk3-0001TR-85 for importer@patchew.org; Wed, 30 Mar 2022 19:28:43 -0400 Received: from eggs.gnu.org ([209.51.188.92]:34530) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZfsp-0007u2-8K for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:39 -0400 Received: from [2a00:1450:4864:20::22f] (port=43580 helo=mail-lj1-x22f.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZfsm-0003A3-T7 for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:38 -0400 Received: by mail-lj1-x22f.google.com with SMTP id b43so24945424ljr.10 for ; Wed, 30 Mar 2022 14:29:36 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=SJBZlblYQ0uvGPZOGYGUOIC4FWi1YI6/gm26RCeaZU0=; b=Qgk8lMGsLIM9rfjNNU+S3U0iDRtCdT93nWaHkYK6BL+odYfLlPFEK6Wtsr4H0mQqRR jhrMpD3CLp91vJWin04CN94Gva6EhJ09aRSG7MWA8I2+Cjw4IlmHMO5l7CRkx9afBiQZ poD/Fml3fFyHPWFkCouRe6Ah+Ux2JyuA4uCk4r1RbCM7IYKH5xfFqujcZdF3scsscy3x InPbDF86ACjip3GsH3J1Ilxamr1E03fIPZbX9+M6Rkjf2FkGVVxTlEOwc1z0pRMp2HV3 AvoLhsAWNERSgxpHzjnzF9zN5nhz6INrKNNVkx7y9T785zFmdpolntmtpcn+EL1AMveZ Q4rQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=SJBZlblYQ0uvGPZOGYGUOIC4FWi1YI6/gm26RCeaZU0=; b=UNm8yPDkd2VFhDavRoHbyA5tteJt1hKTHdtWZlJRsOssmYXDQir0Rv794fNJ5Q32OT m3Dm6E3y7XLylr3qDEbwe/gBSKZplsiUk1Pc3Cm9Z3BYc8diV5A6ODCkj3GeT7lsi3EW nFXQrPkXGqlf1BHksz7giY9lX9Z7GFkEZfAGh5Wn2BPYhuGHGO+vBg0b/yLEJCxLkU23 vr9KfhLvr+J1zscUvgzZ/5vEw2t6ayHSsTbjwp/rNcMqsVW6YFuIFxAgYy4T+FItSHq6 tH5wJAp+Vx9+NTuya3iK/WL8ahBRCXDvYW61yJ9hPxekl05/WxvQESUBaV2S8SY9hvvX bm2g== X-Gm-Message-State: AOAM531uTxBXLKUGtUkVsjHSo6BmTnAY7jaDlEkgXJ6ob89tQfdLs8ZR 848GLmlWZqKUpZvZ2EF2NrtkQg== X-Google-Smtp-Source: ABdhPJzR78iH1ZHG0UQNJI/IVAo5RscB4SuhTrzI2sTt7Do+dv95LXBBI5WZChn3DgeSk/zSySb4Uw== X-Received: by 2002:a2e:7d18:0:b0:247:f205:96fa with SMTP id y24-20020a2e7d18000000b00247f20596famr8685795ljc.269.1648675775249; Wed, 30 Mar 2022 14:29:35 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 06/45] test-bdrv-graph-mod: fix filters to be filters Date: Thu, 31 Mar 2022 00:28:23 +0300 Message-Id: <20220330212902.590099-7-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::22f (failed) 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=2a00:1450:4864:20::22f; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lj1-x22f.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:14 -0400 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: , Cc: kwolf@redhat.com, hreitz@redhat.com, vsementsov@openvz.org, v.sementsov-og@mail.ru, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648682926587100001 Content-Type: text/plain; charset="utf-8" bdrv_pass_through is used as filter, even all node variables has corresponding names. We want to append it, so it should be backing-child-based filter like mirror_top. So, in test_update_perm_tree, first child should be DATA, as we don't want filters with two filtered children. bdrv_exclusive_writer is used as a filter once. So it should be filter anyway. We want to append it, so it should be backing-child-based fitler too. Make all FILTERED children to be PRIMARY as well. We are going to force this rule by assertion soon. Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Hanna Reitz --- include/block/block_int-common.h | 5 +++-- tests/unit/test-bdrv-graph-mod.c | 24 +++++++++++++++++------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/include/block/block_int-common.h b/include/block/block_int-com= mon.h index 9d91ccbcbf..d68adc6ff3 100644 --- a/include/block/block_int-common.h +++ b/include/block/block_int-common.h @@ -122,8 +122,9 @@ struct BlockDriver { /* * Only make sense for filter drivers, for others must be false. * If true, filtered child is bs->backing. Otherwise it's bs->file. - * Only two internal filters use bs->backing as filtered child and has= this - * field set to true: mirror_top and commit_top. + * Two internal filters use bs->backing as filtered child and has this + * field set to true: mirror_top and commit_top. There also two such t= est + * filters in tests/unit/test-bdrv-graph-mod.c. * * Never create any more such filters! * diff --git a/tests/unit/test-bdrv-graph-mod.c b/tests/unit/test-bdrv-graph-= mod.c index 40795d3c04..7265971013 100644 --- a/tests/unit/test-bdrv-graph-mod.c +++ b/tests/unit/test-bdrv-graph-mod.c @@ -26,6 +26,8 @@ =20 static BlockDriver bdrv_pass_through =3D { .format_name =3D "pass-through", + .is_filter =3D true, + .filtered_child_is_backing =3D true, .bdrv_child_perm =3D bdrv_default_perms, }; =20 @@ -57,6 +59,8 @@ static void exclusive_write_perms(BlockDriverState *bs, B= drvChild *c, =20 static BlockDriver bdrv_exclusive_writer =3D { .format_name =3D "exclusive-writer", + .is_filter =3D true, + .filtered_child_is_backing =3D true, .bdrv_child_perm =3D exclusive_write_perms, }; =20 @@ -134,7 +138,7 @@ static void test_update_perm_tree(void) blk_insert_bs(root, bs, &error_abort); =20 bdrv_attach_child(filter, bs, "child", &child_of_bds, - BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY, &error_abo= rt); + BDRV_CHILD_DATA, &error_abort); =20 ret =3D bdrv_append(filter, bs, NULL); g_assert_cmpint(ret, <, 0); @@ -228,11 +232,14 @@ static void test_parallel_exclusive_write(void) */ bdrv_ref(base); =20 - bdrv_attach_child(top, fl1, "backing", &child_of_bds, BDRV_CHILD_DATA, + bdrv_attach_child(top, fl1, "backing", &child_of_bds, + BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY, &error_abort); - bdrv_attach_child(fl1, base, "backing", &child_of_bds, BDRV_CHILD_FILT= ERED, + bdrv_attach_child(fl1, base, "backing", &child_of_bds, + BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY, &error_abort); - bdrv_attach_child(fl2, base, "backing", &child_of_bds, BDRV_CHILD_FILT= ERED, + bdrv_attach_child(fl2, base, "backing", &child_of_bds, + BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY, &error_abort); =20 bdrv_replace_node(fl1, fl2, &error_abort); @@ -344,9 +351,11 @@ static void test_parallel_perm_update(void) BDRV_CHILD_DATA, &error_abort); c_fl2 =3D bdrv_attach_child(ws, fl2, "second", &child_of_bds, BDRV_CHILD_DATA, &error_abort); - bdrv_attach_child(fl1, base, "backing", &child_of_bds, BDRV_CHILD_FILT= ERED, + bdrv_attach_child(fl1, base, "backing", &child_of_bds, + BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY, &error_abort); - bdrv_attach_child(fl2, base, "backing", &child_of_bds, BDRV_CHILD_FILT= ERED, + bdrv_attach_child(fl2, base, "backing", &child_of_bds, + BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY, &error_abort); =20 /* Select fl1 as first child to be active */ @@ -397,7 +406,8 @@ static void test_append_greedy_filter(void) BlockDriverState *base =3D no_perm_node("base"); BlockDriverState *fl =3D exclusive_writer_node("fl1"); =20 - bdrv_attach_child(top, base, "backing", &child_of_bds, BDRV_CHILD_COW, + bdrv_attach_child(top, base, "backing", &child_of_bds, + BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY, &error_abort); =20 bdrv_append(fl, base, &error_abort); --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 164868309017426.086039825135913; Wed, 30 Mar 2022 16:31:30 -0700 (PDT) Received: from localhost ([::1]:56230 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZhmi-0007Nj-VP for importer@patchew.org; Wed, 30 Mar 2022 19:31:29 -0400 Received: from eggs.gnu.org ([209.51.188.92]:34564) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZfsp-0007ut-U8 for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:39 -0400 Received: from [2a00:1450:4864:20::143] (port=44548 helo=mail-lf1-x143.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZfsn-0003AG-FS for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:39 -0400 Received: by mail-lf1-x143.google.com with SMTP id m3so38065070lfj.11 for ; Wed, 30 Mar 2022 14:29:37 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=oBtEQJ45kQI05tOh3SKMvr4vDTTUhOlBeGizKxkbGs4=; b=b5dkbVII2N8tIX5kPuaHhDLAND7hwH1GN824h5fvGCTXFhHfpenKPpABjDkCmf4xPu u1L1MewYkbY7Zf1N6BfQpdOgn8mOY6ilkoUNK1KKDhr84OAEIjIJNPd75ttROmqr+UOx dvDXbvNoDAso+sD5cqHCy3r/nI4EjtGLODCdUovJ/8EjDnyfQNmLtd63yn1m41vBg+fK GMwq2FukmxDrdsosmdlvBWwtv9SEsVSW3wC6nTX9sG1MTLeypzwNGbgsyxg0Y3ElFd+F 3tgo66YnJcRCTRoE85pO9ALtV1IqDyaB/K6N0WCOjbs9GclHo72s3BjCIkAvz+bm+X21 R3Bg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=oBtEQJ45kQI05tOh3SKMvr4vDTTUhOlBeGizKxkbGs4=; b=AByg5DdB5YBwLGWy232VG9RDYYGwuHXgZra8ylNdIwMGZlqAw3Advt3bXNxD0haSqi po4U+Clf1wjIpkuv/unqOw5+vpYmI6QWTCJZ6M0t4qnmF73XoxOmMbwvj7eGm1wMQmWf WM9wU4VzKA4lGHqIw2lLLsZq/imHsD65H+zk2D0p8bYlq8y6iTN5T+xd5ilF9MDkP/9e zmDbYRGLajlKwG8LGHr0F4hvFsZmxtldBMYRQRBK25ctfeuRkQkd0Vc/UXmFf5q3yeNQ raVHmSIE8wysQsvB/IkQF2QR9TJDwTUOG7QBGFtoIO3DctpgFzc49MLvac944cftLAnv jTyA== X-Gm-Message-State: AOAM533q/Ucyw5zQeJ4+G5JQ9Y7/WUySb6cG9V4ObehaziZXWjvZOItU xvRb8Zje/Px+WnmjRxKvsjjcwWQaetHh5A== X-Google-Smtp-Source: ABdhPJwWHQ/HU5jd2ebwIGSOeive4Ltg4KqdPhNYBIk0Sz6/MOo3a9LEvdUC42FTL+SI9gRC2V3rQQ== X-Received: by 2002:a05:6512:3f90:b0:446:6b95:24aa with SMTP id x16-20020a0565123f9000b004466b9524aamr8534262lfa.610.1648675775840; Wed, 30 Mar 2022 14:29:35 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 07/45] block: document connection between child roles and bs->backing/bs->file Date: Thu, 31 Mar 2022 00:28:24 +0300 Message-Id: <20220330212902.590099-8-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::143 (failed) 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=2a00:1450:4864:20::143; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lf1-x143.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:15 -0400 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: , Cc: kwolf@redhat.com, hreitz@redhat.com, vsementsov@openvz.org, v.sementsov-og@mail.ru, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648683091803100001 Content-Type: text/plain; charset="utf-8" Make the informal rules formal. In further commit we'll add corresponding assertions. Signed-off-by: Vladimir Sementsov-Ogievskiy --- include/block/block-common.h | 42 ++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/include/block/block-common.h b/include/block/block-common.h index fdb7306e78..2687a2519c 100644 --- a/include/block/block-common.h +++ b/include/block/block-common.h @@ -313,6 +313,48 @@ enum { * * At least one of DATA, METADATA, FILTERED, or COW must be set for * every child. + * + * + * =3D Connection with bs->children, bs->file and bs->backing fields =3D + * + * 1. Filters + * + * Filter drivers has drv->is_filter =3D true. + * + * Filter driver has exactly one FILTERED|PRIMARY child, any may have other + * children which must not have these bits (the example is copy-before-wri= te + * filter that also has target DATA child). + * + * Filter driver never has COW children. + * + * For all filters except for mirror_top and commit_top, the filtered chil= d is + * linked in bs->file, bs->backing is NULL. + * + * For mirror_top and commit_top filtered child is linked in bs->backing a= nd + * their bs->file is NULL. These two filters has drv->filtered_child_is_ba= cking + * =3D true. + * + * 2. "raw" driver (block/raw-format.c) + * + * Formally it's not a filter (drv->is_filter =3D false) + * + * bs->backing is always NULL + * + * Only has one child, linked in bs->file. It's role is either FILTERED|PR= IMARY + * (like filter) either DATA|PRIMARY depending on options. + * + * 3. Other drivers + * + * Doesn't have any FILTERED children. + * + * May have at most one COW child. In this case it's linked in bs->backing. + * Otherwise bs->backing is NULL. COW child is never PRIMARY. + * + * May have at most one PRIMARY child. In this case it's linked in bs->fil= e. + * Otherwise bs->file is NULL. + * + * May also have some other children that don't have neither PRIMARY nor C= OW + * bits set. */ enum BdrvChildRoleBits { /* --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648683291395952.0124554559998; Wed, 30 Mar 2022 16:34:51 -0700 (PDT) Received: from localhost ([::1]:36390 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZhpy-0004dA-DG for importer@patchew.org; Wed, 30 Mar 2022 19:34:50 -0400 Received: from eggs.gnu.org ([209.51.188.92]:34578) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZfsq-0007vA-6r for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:40 -0400 Received: from [2a00:1450:4864:20::22e] (port=44897 helo=mail-lj1-x22e.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZfsn-0003AY-Uw for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:39 -0400 Received: by mail-lj1-x22e.google.com with SMTP id q5so29458798ljb.11 for ; Wed, 30 Mar 2022 14:29:37 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=tJxefvmvICc2d2KjZ05ktJv/JuR+f3W8BBrPMJJ+LrE=; b=juuyao2yg6tZjt1NhOmaV65mGIlLe+URlsxEyrT81lBOmN9sUXYFHXuBnfwuKd7bRs J9CS8xSek6Weol38Nrt1JkbXnNg9QTZHh1yg9SVMi6JEeRCs38MJn7c6acNeuP/7/SGC xR7ghsBcFD8LOireiUXbBYkWmHvfbjkCUTDOqI3G3GQupYo2nSXfA+9nqZ4Wbt6J7LBV jUOX9th8dIrlGRZcQXJjvbdzJmDifhePnfGfkKh7ET0S8eFT4nc5tN6gucnX4Q3vOq+g sJBcIusrYa91c4BTyq7t10dYxxITexlr3/WTDWJB6LobukLY+mxFugEssnnYGpLkSNPu eevw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=tJxefvmvICc2d2KjZ05ktJv/JuR+f3W8BBrPMJJ+LrE=; b=IMqGXVrLgb7MYsSUyVIai8npZr4bCxp8txdWLwUMdWKvSxJx+5w2x/HJzjQk2TWAzg pQfLBwaPByQJtMdZoOpfu0DkWAgciMz7Bnybwhz5n7GA0FfExZJaCEMgRTZe/0IJ1Rrf yc2O17XKsJHpQfGHP83dGiBsuwd39Mu58kdr56E8obTpPllUQJw7BAZTwuLjL29W9YoY wF3uWDw0t19I7bybeQfCZaUrHlPBxSLJT/UhqMUg2bJeQcoddULNVHByV9ejDI5dd1PS BcaRBOC8Bi5EEAGOf6wy9EqmlYAC0Y7ThAWEeXIL7uqtAv3wOY6D+Fo5yur9sm0ehYXj xkrQ== X-Gm-Message-State: AOAM530GtfTYDxvnbGCW/ZgodS0tNFxOg9yzu7M9L86/+vg7tsBTEdto E78pYr+r0wMCmXh8MS9foqkevp8GY0zGUg== X-Google-Smtp-Source: ABdhPJz3CLGFWrdZaKdq97h6uPCmnzB9tra7AwMvp+ULVabn0oyzyNu+pqkojUXt1uyMWBGBmGN91Q== X-Received: by 2002:a2e:96c4:0:b0:249:30d1:77a1 with SMTP id d4-20020a2e96c4000000b0024930d177a1mr8164404ljj.264.1648675776420; Wed, 30 Mar 2022 14:29:36 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 08/45] block/snapshot: stress that we fallback to primary child Date: Thu, 31 Mar 2022 00:28:25 +0300 Message-Id: <20220330212902.590099-9-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::22e (failed) 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=2a00:1450:4864:20::22e; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lj1-x22e.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:15 -0400 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: , Cc: kwolf@redhat.com, hreitz@redhat.com, vsementsov@openvz.org, v.sementsov-og@mail.ru, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648683293716100001 Content-Type: text/plain; charset="utf-8" Actually what we chose is a primary child. Let's stress it in the code. We are going to drop indirect pointer logic here in future. Actually this commit simplifies the future work: we drop use of indirection in the assertion now. Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Hanna Reitz --- block/snapshot.c | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/block/snapshot.c b/block/snapshot.c index d6f53c3065..f4ec4f9ef3 100644 --- a/block/snapshot.c +++ b/block/snapshot.c @@ -161,21 +161,14 @@ bool bdrv_snapshot_find_by_id_and_name(BlockDriverSta= te *bs, static BdrvChild **bdrv_snapshot_fallback_ptr(BlockDriverState *bs) { BdrvChild **fallback; - BdrvChild *child; + BdrvChild *child =3D bdrv_primary_child(bs); =20 - /* - * The only BdrvChild pointers that are safe to modify (and which - * we can thus return a reference to) are bs->file and - * bs->backing. - */ - fallback =3D &bs->file; - if (!*fallback && bs->drv && bs->drv->is_filter) { - fallback =3D &bs->backing; - } - - if (!*fallback) { + /* We allow fallback only to primary child */ + if (!child) { return NULL; } + fallback =3D (child =3D=3D bs->file ? &bs->file : &bs->backing); + assert(*fallback =3D=3D child); =20 /* * Check that there are no other children that would need to be @@ -309,15 +302,12 @@ int bdrv_snapshot_goto(BlockDriverState *bs, } =20 /* - * fallback_ptr is &bs->file or &bs->backing. *fallback_ptr - * was closed above and set to NULL, but the .bdrv_open() call - * has opened it again, because we set the respective option - * (with the qdict_put_str() call above). - * Assert that .bdrv_open() has attached some child on - * *fallback_ptr, and that it has attached the one we wanted - * it to (i.e., fallback_bs). + * fallback was a primary child. It was closed above and set to NU= LL, + * but the .bdrv_open() call has opened it again, because we set t= he + * respective option (with the qdict_put_str() call above). + * Assert that .bdrv_open() has attached some BDS as primary child. */ - assert(*fallback_ptr && fallback_bs =3D=3D (*fallback_ptr)->bs); + assert(bdrv_primary_bs(bs) =3D=3D fallback_bs); bdrv_unref(fallback_bs); return ret; } --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648682620641816.4431220670036; Wed, 30 Mar 2022 16:23:40 -0700 (PDT) Received: from localhost ([::1]:60778 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZhf9-0007Gh-4T for importer@patchew.org; Wed, 30 Mar 2022 19:23:39 -0400 Received: from eggs.gnu.org ([209.51.188.92]:34650) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZfsr-0007wj-KT for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:41 -0400 Received: from [2a00:1450:4864:20::232] (port=43583 helo=mail-lj1-x232.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZfso-0003Av-OK for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:41 -0400 Received: by mail-lj1-x232.google.com with SMTP id b43so24945513ljr.10 for ; Wed, 30 Mar 2022 14:29:38 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=L2egmZ2jqAg2vevaHjypXExEs4iGwwAXDtmot3+0hf8=; b=fGRU3Q0NDHVUmwq4bOky7JJplxJ0l7b4rjxFwmJ4Ps58gd4ab69DNU8xMJlm+F+jue qKfZ5m1kGzRp0d240dYvoPz9NGzlLqAO1qD0jVT4l7YcwcDRWeKULMx1+IFbIOKYV/Vl ZfIqY5Vqk0/QZk9577pdkIAXh2HJRxplBYv099OsuQy0SHRiH+XRKGi1Q9R5+kO1yiFD 6DGQZkao+DmbnR4521sQHZ0X6ACbRudKXLATJzJwsjhnQ4Z4t7wshvyUHsRy6yK1R33n m7DuaCZJMiG6SPIeAi3MZwl4WB4yJorhNKen2fepDt+Pm6Tlarrl27HaFvkgNkWCssZn s4qQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=L2egmZ2jqAg2vevaHjypXExEs4iGwwAXDtmot3+0hf8=; b=YEvz/Nd6/+s3Ae6EFF0QA+JUpmmer2dLRVkGbRzuP/s1H7Re/SGqaNxWe486WwHC8w nigGjJZ44jgK5ju6SnAuVW7UuVC0QZPkIaXUvRfYAcmVPI31lnKOFpygBFOOdHo8+w6n afh8wst5hW61UHj787uIv4eWpZbpuT5Qp0MrM0UyAtOWZahG+ODMTjzBN6C1c33Dog7P coIBDEJoCG4JslBgXnR+SREYnd0TJlr1grav1rVslei7RJwuzi28szKdcvMDVc5A7tls yRCtNnjyaM0H1DhjdJhwRi5qvUf9DjfIgzWORn8kCvIaGqSihTT5GfSuaQtqpm2xCNuU C1pA== X-Gm-Message-State: AOAM5324JUcuSnQb8H6NSFPF5tTgJmhzJgexJoJ9isaXLF00ZrAHEfcv 2SjRWwGmQfeloStSZKCTVfWtiQ== X-Google-Smtp-Source: ABdhPJzvkRmIScVtrfbjCyAH+XmZV0gTps8phhmht69Fc5Wc3CvsArK74R6bY793Vk70nyc9H5VREQ== X-Received: by 2002:a05:651c:158e:b0:248:1ce:a2a with SMTP id h14-20020a05651c158e00b0024801ce0a2amr8004486ljq.172.1648675777000; Wed, 30 Mar 2022 14:29:37 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 09/45] Revert "block: Let replace_child_noperm free children" Date: Thu, 31 Mar 2022 00:28:26 +0300 Message-Id: <20220330212902.590099-10-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::232 (failed) 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=2a00:1450:4864:20::232; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lj1-x232.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:16 -0400 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: , Cc: kwolf@redhat.com, hreitz@redhat.com, vsementsov@openvz.org, v.sementsov-og@mail.ru, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648682621173100001 Content-Type: text/plain; charset="utf-8" We are going to reimplement this behavior (clear bs->file / bs->backing pointers automatically when child->bs is cleared) in a nicer way. This reverts commit b0a9f6fed3d80de610dcd04a7e66f9f30a04174f. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block.c | 102 +++++++++++++------------------------------------------- 1 file changed, 23 insertions(+), 79 deletions(-) diff --git a/block.c b/block.c index 8110b1b330..7f11ec4a80 100644 --- a/block.c +++ b/block.c @@ -90,10 +90,8 @@ static BlockDriverState *bdrv_open_inherit(const char *f= ilename, static bool bdrv_recurse_has_child(BlockDriverState *bs, BlockDriverState *child); =20 -static void bdrv_child_free(BdrvChild *child); static void bdrv_replace_child_noperm(BdrvChild **child, - BlockDriverState *new_bs, - bool free_empty_child); + BlockDriverState *new_bs); static void bdrv_remove_file_or_backing_child(BlockDriverState *bs, BdrvChild *child, Transaction *tran); @@ -2338,7 +2336,6 @@ typedef struct BdrvReplaceChildState { BdrvChild *child; BdrvChild **childp; BlockDriverState *old_bs; - bool free_empty_child; } BdrvReplaceChildState; =20 static void bdrv_replace_child_commit(void *opaque) @@ -2346,9 +2343,6 @@ static void bdrv_replace_child_commit(void *opaque) BdrvReplaceChildState *s =3D opaque; GLOBAL_STATE_CODE(); =20 - if (s->free_empty_child && !s->child->bs) { - bdrv_child_free(s->child); - } bdrv_unref(s->old_bs); } =20 @@ -2366,26 +2360,22 @@ static void bdrv_replace_child_abort(void *opaque) * modify the BdrvChild * pointer we indirectly pass to it, i.e. it * will not modify s->child. From that perspective, it does not m= atter * whether we pass s->childp or &s->child. + * (TODO: Right now, bdrv_replace_child_noperm() never modifies th= at + * pointer anyway (though it will in the future), so at this point= it + * absolutely does not matter whether we pass s->childp or &s->chi= ld.) * (2) If new_bs is not NULL, s->childp will be NULL. We then cannot = use * it here. * (3) If new_bs is NULL, *s->childp will have been NULLed by * bdrv_replace_child_tran()'s bdrv_replace_child_noperm() call, a= nd we * must not pass a NULL *s->childp here. + * (TODO: In its current state, bdrv_replace_child_noperm() will n= ot + * have NULLed *s->childp, so this does not apply yet. It will in= the + * future.) * * So whether new_bs was NULL or not, we cannot pass s->childp here; a= nd in * any case, there is no reason to pass it anyway. */ - bdrv_replace_child_noperm(&s->child, s->old_bs, true); - /* - * The child was pre-existing, so s->old_bs must be non-NULL, and - * s->child thus must not have been freed - */ - assert(s->child !=3D NULL); - if (!new_bs) { - /* As described above, *s->childp was cleared, so restore it */ - assert(s->childp !=3D NULL); - *s->childp =3D s->child; - } + bdrv_replace_child_noperm(&s->child, s->old_bs); bdrv_unref(new_bs); } =20 @@ -2402,44 +2392,30 @@ static TransactionActionDrv bdrv_replace_child_drv = =3D { * * The function doesn't update permissions, caller is responsible for this. * - * (*childp)->bs must not be NULL. - * * Note that if new_bs =3D=3D NULL, @childp is stored in a state object at= tached * to @tran, so that the old child can be reinstated in the abort handler. * Therefore, if @new_bs can be NULL, @childp must stay valid until the * transaction is committed or aborted. * - * If @free_empty_child is true and @new_bs is NULL, the BdrvChild is - * freed (on commit). @free_empty_child should only be false if the - * caller will free the BDrvChild themselves (which may be important - * if this is in turn called in another transactional context). + * (TODO: The reinstating does not happen yet, but it will once + * bdrv_replace_child_noperm() NULLs *childp when new_bs is NULL.) */ static void bdrv_replace_child_tran(BdrvChild **childp, BlockDriverState *new_bs, - Transaction *tran, - bool free_empty_child) + Transaction *tran) { BdrvReplaceChildState *s =3D g_new(BdrvReplaceChildState, 1); *s =3D (BdrvReplaceChildState) { .child =3D *childp, .childp =3D new_bs =3D=3D NULL ? childp : NULL, .old_bs =3D (*childp)->bs, - .free_empty_child =3D free_empty_child, }; tran_add(tran, &bdrv_replace_child_drv, s); =20 - /* The abort handler relies on this */ - assert(s->old_bs !=3D NULL); - if (new_bs) { bdrv_ref(new_bs); } - /* - * Pass free_empty_child=3Dfalse, we will free the child (if - * necessary) in bdrv_replace_child_commit() (if our - * @free_empty_child parameter was true). - */ - bdrv_replace_child_noperm(childp, new_bs, false); + bdrv_replace_child_noperm(childp, new_bs); /* old_bs reference is transparently moved from *childp to @s */ } =20 @@ -2821,22 +2797,8 @@ uint64_t bdrv_qapi_perm_to_blk_perm(BlockPermission = qapi_perm) return permissions[qapi_perm]; } =20 -/** - * Replace (*childp)->bs by @new_bs. - * - * If @new_bs is NULL, *childp will be set to NULL, too: BDS parents - * generally cannot handle a BdrvChild with .bs =3D=3D NULL, so clearing - * BdrvChild.bs should generally immediately be followed by the - * BdrvChild pointer being cleared as well. - * - * If @free_empty_child is true and @new_bs is NULL, the BdrvChild is - * freed. @free_empty_child should only be false if the caller will - * free the BdrvChild themselves (this may be important in a - * transactional context, where it may only be freed on commit). - */ static void bdrv_replace_child_noperm(BdrvChild **childp, - BlockDriverState *new_bs, - bool free_empty_child) + BlockDriverState *new_bs) { BdrvChild *child =3D *childp; BlockDriverState *old_bs =3D child->bs; @@ -2875,9 +2837,6 @@ static void bdrv_replace_child_noperm(BdrvChild **chi= ldp, } =20 child->bs =3D new_bs; - if (!new_bs) { - *childp =3D NULL; - } =20 if (new_bs) { assert_bdrv_graph_writable(new_bs); @@ -2908,10 +2867,6 @@ static void bdrv_replace_child_noperm(BdrvChild **ch= ildp, bdrv_parent_drained_end_single(child); drain_saldo++; } - - if (free_empty_child && !child->bs) { - bdrv_child_free(child); - } } =20 /** @@ -2943,14 +2898,7 @@ static void bdrv_attach_child_common_abort(void *opa= que) BlockDriverState *bs =3D child->bs; =20 GLOBAL_STATE_CODE(); - /* - * Pass free_empty_child=3Dfalse, because we still need the child - * for the AioContext operations on the parent below; those - * BdrvChildClass methods all work on a BdrvChild object, so we - * need to keep it as an empty shell (after this function, it will - * not be attached to any parent, and it will not have a .bs). - */ - bdrv_replace_child_noperm(s->child, NULL, false); + bdrv_replace_child_noperm(s->child, NULL); =20 if (bdrv_get_aio_context(bs) !=3D s->old_child_ctx) { bdrv_try_set_aio_context(bs, s->old_child_ctx, &error_abort); @@ -2972,6 +2920,7 @@ static void bdrv_attach_child_common_abort(void *opaq= ue) =20 bdrv_unref(bs); bdrv_child_free(child); + *s->child =3D NULL; } =20 static TransactionActionDrv bdrv_attach_child_common_drv =3D { @@ -3050,9 +2999,7 @@ static int bdrv_attach_child_common(BlockDriverState = *child_bs, } =20 bdrv_ref(child_bs); - bdrv_replace_child_noperm(&new_child, child_bs, true); - /* child_bs was non-NULL, so new_child must not have been freed */ - assert(new_child !=3D NULL); + bdrv_replace_child_noperm(&new_child, child_bs); =20 *child =3D new_child; =20 @@ -3113,7 +3060,8 @@ static void bdrv_detach_child(BdrvChild **childp) BlockDriverState *old_bs =3D (*childp)->bs; =20 GLOBAL_STATE_CODE(); - bdrv_replace_child_noperm(childp, NULL, true); + bdrv_replace_child_noperm(childp, NULL); + bdrv_child_free(*childp); =20 if (old_bs) { /* @@ -5167,11 +5115,7 @@ static void bdrv_remove_file_or_backing_child(BlockD= riverState *bs, } =20 if (child->bs) { - /* - * Pass free_empty_child=3Dfalse, we will free the child in - * bdrv_remove_filter_or_cow_child_commit() - */ - bdrv_replace_child_tran(childp, NULL, tran, false); + bdrv_replace_child_tran(childp, NULL, tran); } =20 s =3D g_new(BdrvRemoveFilterOrCowChild, 1); @@ -5181,6 +5125,8 @@ static void bdrv_remove_file_or_backing_child(BlockDr= iverState *bs, .is_backing =3D (childp =3D=3D &bs->backing), }; tran_add(tran, &bdrv_remove_filter_or_cow_child_drv, s); + + *childp =3D NULL; } =20 /* @@ -5224,7 +5170,7 @@ static int bdrv_replace_node_noperm(BlockDriverState = *from, * Passing a pointer to the local variable @c is fine here, because * @to is not NULL, and so &c will not be attached to the transact= ion. */ - bdrv_replace_child_tran(&c, to, tran, true); + bdrv_replace_child_tran(&c, to, tran); } =20 return 0; @@ -5389,9 +5335,7 @@ int bdrv_replace_child_bs(BdrvChild *child, BlockDriv= erState *new_bs, bdrv_drained_begin(old_bs); bdrv_drained_begin(new_bs); =20 - bdrv_replace_child_tran(&child, new_bs, tran, true); - /* @new_bs must have been non-NULL, so @child must not have been freed= */ - assert(child !=3D NULL); + bdrv_replace_child_tran(&child, new_bs, tran); =20 found =3D g_hash_table_new(NULL, NULL); refresh_list =3D bdrv_topological_dfs(refresh_list, found, old_bs); --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648682799629280.8480203532723; Wed, 30 Mar 2022 16:26:39 -0700 (PDT) Received: from localhost ([::1]:41082 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZhi2-0004Vf-BK for importer@patchew.org; Wed, 30 Mar 2022 19:26:38 -0400 Received: from eggs.gnu.org ([209.51.188.92]:34668) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZfsr-0007xZ-V3 for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:41 -0400 Received: from [2a00:1450:4864:20::136] (port=46631 helo=mail-lf1-x136.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZfsp-0003BQ-Bu for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:41 -0400 Received: by mail-lf1-x136.google.com with SMTP id e16so38033585lfc.13 for ; Wed, 30 Mar 2022 14:29:38 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=VMVNYGRX8UhibZ3B/gUjYsVOd8fQvksJC2CVc0J1YI4=; b=xNjKxyodUZ37W0aZAK4rAiLiQziUpIqJmKkkyVleZUbMRxZDKkWTwJ7q9J2SMrITu8 yWqZLSPW204D9QCxFeK8daJVaYfvczLbnZQ0QhuiAhw6xrYYM6EN9Th+K12/CemT9chG Ls7Y9+e1i79V2Ja6a4sn42EITFnHf0qjQp55hK8xXl3PoRKoItQWzu/Fm+CBvACuUhcu R5NgEruySSPOAxn92ZUneAzBh1qTfUcSjprxtDnPnY5hv3ktUKrkkB07m+MvGgXlrmS1 bmROV+Sg7A1SBzFwUXednnahbPk6xp8xHOJ9uCQwfauDzK3ZjryPrYi7rly5hEQmIJft RVQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=VMVNYGRX8UhibZ3B/gUjYsVOd8fQvksJC2CVc0J1YI4=; b=5T9Tq+t8JmreLBZCX15kLiN9qbB9aX6qhZ5WB6bSktZDihUy+fi9AaqUx6WwBP79v4 ICI5kvo5Iwk+lP9Idh5elFbdxmHMTsAuKDaBjAPm9S5GJtpfMTgllCQ5JEQaKY6z71eP 1+d1+ID+5naLxB2U2Htg7bAIg5JmStt1T8JNF9Hw0/VuKypVw7NxgWxBkV6i9zvXZIC7 TJC9oKISZWhWonFETlpT8HDrCXXyIEh5OUou6i5sWuHF3Jotvx3y9ZlKRGvVoz5e1EyA d7NYk3+++OPoWrahqmfRWjVFqEhWIahCsLtwtveu569pMep2wtSd/T/u0F/i1bEEZGwU Ktyg== X-Gm-Message-State: AOAM533cL9h0kXaIjTNNo8d+D3ntl763inZnw1hupiG8hyJskZ0seqPq NsKLrc5LNrRLvmBJep8hmk8jEA== X-Google-Smtp-Source: ABdhPJx4Y7+zmIIilDTh6oFMEu6Z9goagKCryoCr3wceX9jEDuevvmIHpnl/WuxXP/3bC+HEgK+U8g== X-Received: by 2002:a05:6512:322f:b0:44a:57a0:6950 with SMTP id f15-20020a056512322f00b0044a57a06950mr8684248lfe.74.1648675777630; Wed, 30 Mar 2022 14:29:37 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 10/45] Revert "block: Let replace_child_tran keep indirect pointer" Date: Thu, 31 Mar 2022 00:28:27 +0300 Message-Id: <20220330212902.590099-11-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::136 (failed) 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=2a00:1450:4864:20::136; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lf1-x136.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:16 -0400 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: , Cc: kwolf@redhat.com, hreitz@redhat.com, vsementsov@openvz.org, v.sementsov-og@mail.ru, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648682801274100001 Content-Type: text/plain; charset="utf-8" That's a preparation to previously reverted "block: Let replace_child_noperm free children". Drop it too, we don't need it for a new approach. This reverts commit 82b54cf51656bf3cd5ed1ac549e8a1085a0e3290. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block.c | 81 +++++++-------------------------------------------------- 1 file changed, 10 insertions(+), 71 deletions(-) diff --git a/block.c b/block.c index 7f11ec4a80..258851576a 100644 --- a/block.c +++ b/block.c @@ -2334,7 +2334,6 @@ static int bdrv_drv_set_perm(BlockDriverState *bs, ui= nt64_t perm, =20 typedef struct BdrvReplaceChildState { BdrvChild *child; - BdrvChild **childp; BlockDriverState *old_bs; } BdrvReplaceChildState; =20 @@ -2352,29 +2351,7 @@ static void bdrv_replace_child_abort(void *opaque) BlockDriverState *new_bs =3D s->child->bs; =20 GLOBAL_STATE_CODE(); - /* - * old_bs reference is transparently moved from @s to s->child. - * - * Pass &s->child here instead of s->childp, because: - * (1) s->old_bs must be non-NULL, so bdrv_replace_child_noperm() will= not - * modify the BdrvChild * pointer we indirectly pass to it, i.e. it - * will not modify s->child. From that perspective, it does not m= atter - * whether we pass s->childp or &s->child. - * (TODO: Right now, bdrv_replace_child_noperm() never modifies th= at - * pointer anyway (though it will in the future), so at this point= it - * absolutely does not matter whether we pass s->childp or &s->chi= ld.) - * (2) If new_bs is not NULL, s->childp will be NULL. We then cannot = use - * it here. - * (3) If new_bs is NULL, *s->childp will have been NULLed by - * bdrv_replace_child_tran()'s bdrv_replace_child_noperm() call, a= nd we - * must not pass a NULL *s->childp here. - * (TODO: In its current state, bdrv_replace_child_noperm() will n= ot - * have NULLed *s->childp, so this does not apply yet. It will in= the - * future.) - * - * So whether new_bs was NULL or not, we cannot pass s->childp here; a= nd in - * any case, there is no reason to pass it anyway. - */ + /* old_bs reference is transparently moved from @s to @s->child */ bdrv_replace_child_noperm(&s->child, s->old_bs); bdrv_unref(new_bs); } @@ -2391,32 +2368,22 @@ static TransactionActionDrv bdrv_replace_child_drv = =3D { * Note: real unref of old_bs is done only on commit. * * The function doesn't update permissions, caller is responsible for this. - * - * Note that if new_bs =3D=3D NULL, @childp is stored in a state object at= tached - * to @tran, so that the old child can be reinstated in the abort handler. - * Therefore, if @new_bs can be NULL, @childp must stay valid until the - * transaction is committed or aborted. - * - * (TODO: The reinstating does not happen yet, but it will once - * bdrv_replace_child_noperm() NULLs *childp when new_bs is NULL.) */ -static void bdrv_replace_child_tran(BdrvChild **childp, - BlockDriverState *new_bs, +static void bdrv_replace_child_tran(BdrvChild *child, BlockDriverState *ne= w_bs, Transaction *tran) { BdrvReplaceChildState *s =3D g_new(BdrvReplaceChildState, 1); *s =3D (BdrvReplaceChildState) { - .child =3D *childp, - .childp =3D new_bs =3D=3D NULL ? childp : NULL, - .old_bs =3D (*childp)->bs, + .child =3D child, + .old_bs =3D child->bs, }; tran_add(tran, &bdrv_replace_child_drv, s); =20 if (new_bs) { bdrv_ref(new_bs); } - bdrv_replace_child_noperm(childp, new_bs); - /* old_bs reference is transparently moved from *childp to @s */ + bdrv_replace_child_noperm(&child, new_bs); + /* old_bs reference is transparently moved from @child to @s */ } =20 /* @@ -5041,7 +5008,6 @@ static bool should_update_child(BdrvChild *c, BlockDr= iverState *to) =20 typedef struct BdrvRemoveFilterOrCowChild { BdrvChild *child; - BlockDriverState *bs; bool is_backing; } BdrvRemoveFilterOrCowChild; =20 @@ -5071,19 +5037,10 @@ static void bdrv_remove_filter_or_cow_child_commit(= void *opaque) bdrv_child_free(s->child); } =20 -static void bdrv_remove_filter_or_cow_child_clean(void *opaque) -{ - BdrvRemoveFilterOrCowChild *s =3D opaque; - - /* Drop the bs reference after the transaction is done */ - bdrv_unref(s->bs); - g_free(s); -} - static TransactionActionDrv bdrv_remove_filter_or_cow_child_drv =3D { .abort =3D bdrv_remove_filter_or_cow_child_abort, .commit =3D bdrv_remove_filter_or_cow_child_commit, - .clean =3D bdrv_remove_filter_or_cow_child_clean, + .clean =3D g_free, }; =20 /* @@ -5101,11 +5058,6 @@ static void bdrv_remove_file_or_backing_child(BlockD= riverState *bs, return; } =20 - /* - * Keep a reference to @bs so @childp will stay valid throughout the - * transaction (required by bdrv_replace_child_tran()) - */ - bdrv_ref(bs); if (child =3D=3D bs->backing) { childp =3D &bs->backing; } else if (child =3D=3D bs->file) { @@ -5115,13 +5067,12 @@ static void bdrv_remove_file_or_backing_child(Block= DriverState *bs, } =20 if (child->bs) { - bdrv_replace_child_tran(childp, NULL, tran); + bdrv_replace_child_tran(*childp, NULL, tran); } =20 s =3D g_new(BdrvRemoveFilterOrCowChild, 1); *s =3D (BdrvRemoveFilterOrCowChild) { .child =3D child, - .bs =3D bs, .is_backing =3D (childp =3D=3D &bs->backing), }; tran_add(tran, &bdrv_remove_filter_or_cow_child_drv, s); @@ -5147,7 +5098,6 @@ static int bdrv_replace_node_noperm(BlockDriverState = *from, { BdrvChild *c, *next; =20 - assert(to !=3D NULL); GLOBAL_STATE_CODE(); =20 QLIST_FOREACH_SAFE(c, &from->parents, next_parent, next) { @@ -5165,12 +5115,7 @@ static int bdrv_replace_node_noperm(BlockDriverState= *from, c->name, from->node_name); return -EPERM; } - - /* - * Passing a pointer to the local variable @c is fine here, because - * @to is not NULL, and so &c will not be attached to the transact= ion. - */ - bdrv_replace_child_tran(&c, to, tran); + bdrv_replace_child_tran(c, to, tran); } =20 return 0; @@ -5185,8 +5130,6 @@ static int bdrv_replace_node_noperm(BlockDriverState = *from, * * With @detach_subchain=3Dtrue @to must be in a backing chain of @from. I= n this * case backing link of the cow-parent of @to is removed. - * - * @to must not be NULL. */ static int bdrv_replace_node_common(BlockDriverState *from, BlockDriverState *to, @@ -5200,7 +5143,6 @@ static int bdrv_replace_node_common(BlockDriverState = *from, int ret; =20 GLOBAL_STATE_CODE(); - assert(to !=3D NULL); =20 if (detach_subchain) { assert(bdrv_chain_contains(from, to)); @@ -5257,9 +5199,6 @@ out: return ret; } =20 -/** - * Replace node @from by @to (where neither may be NULL). - */ int bdrv_replace_node(BlockDriverState *from, BlockDriverState *to, Error **errp) { @@ -5335,7 +5274,7 @@ int bdrv_replace_child_bs(BdrvChild *child, BlockDriv= erState *new_bs, bdrv_drained_begin(old_bs); bdrv_drained_begin(new_bs); =20 - bdrv_replace_child_tran(&child, new_bs, tran); + bdrv_replace_child_tran(child, new_bs, tran); =20 found =3D g_hash_table_new(NULL, NULL); refresh_list =3D bdrv_topological_dfs(refresh_list, found, old_bs); --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648682498180625.0621865278271; Wed, 30 Mar 2022 16:21:38 -0700 (PDT) Received: from localhost ([::1]:52754 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZhdB-0001wy-0j for importer@patchew.org; Wed, 30 Mar 2022 19:21:37 -0400 Received: from eggs.gnu.org ([209.51.188.92]:34712) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZfss-0007yt-Ny for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:42 -0400 Received: from [2a00:1450:4864:20::235] (port=39439 helo=mail-lj1-x235.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZfsp-0003Bp-UT for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:42 -0400 Received: by mail-lj1-x235.google.com with SMTP id bn33so29474807ljb.6 for ; Wed, 30 Mar 2022 14:29:39 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=wxu0Ad3k2MULhZ+YbYYmL+mmbXbe7FlGdUS31dOR4Ko=; b=Elt/axAEbhYpi90aLHeS2c8l2svxOWt9nZ56zxoeS96SSgdzTc1KP0LsJVzH7y+/Wy Ytqph+Qj2ENs8K9CSOYyYQzB1nKYRW2OhWSHtOQaknyZhKGGDbAKvhd5PGz4LT15MXXH LnG20AEgMaFXqshhy6q8KthjqELf0gEErT9qMjNoe5zCO6De4zy9LveQemQPgPc5WRru 1RqzYt1nxkfae5iJ4GPDJmJv7weqjd5e5uMDmPdvwTm/zZQp+xHQf5W1M3Xs69VnRUJx foY9bB3l97/Om3B/AwsayBghCaRFj3/hYGVczq5RYqloKmI4adDsKPPRRn0N6bL+9nWo as2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=wxu0Ad3k2MULhZ+YbYYmL+mmbXbe7FlGdUS31dOR4Ko=; b=0hBY3rgav0py48hQvcwJLbIu0+bU9XSq6j7MRZVFVkE1z3PhrbVbP0YWtKqwCXJ9A0 Vj8l+mJdtTUW6MCPrmycIHCBVXPeoMP7tbvjbZv9LlxCeLdmtN4Omu+UK1/Y8fwju9By ocLdqhfWV3E1UWjJSr0QhbeGO8vMCAcPC/EndNE0JsWUhZNBu1SX9ZOy+FRtxVXBAZUF rqg5ivg8rGxOlg82e/uUEh5u+RLRGjL1wraZnjxu6YEUwHexkjGLcDCaQNBzllYJowkX xUOj6ks6iuAcv7APUG+qVB/nWvp9BuEotyZxwSpu+bTbFCCuEhIk3FQzmFG3aZqkv/0B YWrA== X-Gm-Message-State: AOAM531DTrNk7WZ5B9rzL07XteG0Jy33GgBPqFEBGA5v01VIzniyE1x2 rEt5NL019+6icr5nJzioqiy0iYwu6Gd/7g== X-Google-Smtp-Source: ABdhPJw5jWbzm52duEyfw1rdjjwY/docPq8X5rrRO4kXO3C6wTjqlZm79TX7R5MJIZY7oKLRVQL3lg== X-Received: by 2002:a2e:145e:0:b0:249:7feb:58bd with SMTP id 30-20020a2e145e000000b002497feb58bdmr8452781lju.449.1648675778245; Wed, 30 Mar 2022 14:29:38 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 11/45] Revert "block: Restructure remove_file_or_backing_child()" Date: Thu, 31 Mar 2022 00:28:28 +0300 Message-Id: <20220330212902.590099-12-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::235 (failed) 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=2a00:1450:4864:20::235; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lj1-x235.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:17 -0400 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: , Cc: kwolf@redhat.com, hreitz@redhat.com, vsementsov@openvz.org, v.sementsov-og@mail.ru, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648682500181100001 Content-Type: text/plain; charset="utf-8" That's a preparation to previously reverted "block: Let replace_child_noperm free children". Drop it too, we don't need it for a new approach. This reverts commit 562bda8bb41879eeda0bd484dd3d55134579b28e. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block.c | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/block.c b/block.c index 258851576a..34eee40d48 100644 --- a/block.c +++ b/block.c @@ -5051,33 +5051,30 @@ static void bdrv_remove_file_or_backing_child(Block= DriverState *bs, BdrvChild *child, Transaction *tran) { - BdrvChild **childp; BdrvRemoveFilterOrCowChild *s; =20 + assert(child =3D=3D bs->backing || child =3D=3D bs->file); + if (!child) { return; } =20 - if (child =3D=3D bs->backing) { - childp =3D &bs->backing; - } else if (child =3D=3D bs->file) { - childp =3D &bs->file; - } else { - g_assert_not_reached(); - } - if (child->bs) { - bdrv_replace_child_tran(*childp, NULL, tran); + bdrv_replace_child_tran(child, NULL, tran); } =20 s =3D g_new(BdrvRemoveFilterOrCowChild, 1); *s =3D (BdrvRemoveFilterOrCowChild) { .child =3D child, - .is_backing =3D (childp =3D=3D &bs->backing), + .is_backing =3D (child =3D=3D bs->backing), }; tran_add(tran, &bdrv_remove_filter_or_cow_child_drv, s); =20 - *childp =3D NULL; + if (s->is_backing) { + bs->backing =3D NULL; + } else { + bs->file =3D NULL; + } } =20 /* --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648682637680483.9963026440572; Wed, 30 Mar 2022 16:23:57 -0700 (PDT) Received: from localhost ([::1]:33072 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZhfQ-0007bf-6s for importer@patchew.org; Wed, 30 Mar 2022 19:23:56 -0400 Received: from eggs.gnu.org ([209.51.188.92]:34716) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZfss-0007zD-Vp for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:42 -0400 Received: from [2a00:1450:4864:20::244] (port=43569 helo=mail-lj1-x244.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZfsq-0003CI-EJ for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:42 -0400 Received: by mail-lj1-x244.google.com with SMTP id b43so24945603ljr.10 for ; Wed, 30 Mar 2022 14:29:39 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Hgrx+O10M+cObYmv20+rJvbc8HXQCyD07lyL4PLsOa8=; b=gVGHINeE08F3BGot97mQM+Z7uWmdUJVTuQbNCqMcwcljFiOeAjKXJBigAXRfyq6jvA BNZup13daldSpPhLwHK6jP/2Od8N6FZgcCox0YNEEnOJsPxlZr3lEdJxL8soxpEefxKt J9DBoOt/gCL5hQKxK4t1ETBIxhEjIbu/a1P/5y1EN7aO5HYm1kMjdUpVu+Cxo47gXf2o Mx2mB1a8068iUusNw2tiXvG5cBEmErfrcK727eScKTDq9xiC5DbJdLT2h7MF2o5lgTIQ No4SNHJniPqeMunFQAIonM6W5drPhZSzzz1UuZP0y6qZPXq3XPZEkeoyy6tOsyghKcDJ i/4g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Hgrx+O10M+cObYmv20+rJvbc8HXQCyD07lyL4PLsOa8=; b=bBLmeTij8AgVIh2I8MCNErQLM1gxPQ6l5Vo1kWmOCw2LFZgAOz4RRaTnTBBqoPO6yI yE3mGJMAF48em1SfRmtTSTFcRQ5Uw+p/bwDQoszxozBGXv7HCP/bvlkUwgiRiLBIpOKx qXKXJihFNRO7Ta7WlRxsKGqf0n1wXeQRmJgjA9cs6Y36fQjz0lhzC4bXc2ddn2zsl6Yk ew6Tbc2ga16tqLhdj9a7+VpVUBXDv8VL6ASD19IekDDGETxa1D3+nzq/VSgyRhgMn5Qu P91f4oqie+iC16plZAf5L3+27zUQwKzPvNaMPDID3F3ekj83O80uwppHax3uuxGpDRp8 N/kg== X-Gm-Message-State: AOAM5330MdcHYQ+YLvyEQ0xrSyUKQfqoee+u853X+/8HFn9u9BylK2uF ZtHaiaKF+scJ9MD4FXoYU2iiCw== X-Google-Smtp-Source: ABdhPJzP5TK8DKLYIYDFTW/cH+q1IaO+Q3IYrVRpgcCvihs9LWe+cPRyPmHfa1y6b8oaMrA+BjubZA== X-Received: by 2002:a2e:9e95:0:b0:249:76e0:e86 with SMTP id f21-20020a2e9e95000000b0024976e00e86mr8341516ljk.232.1648675778839; Wed, 30 Mar 2022 14:29:38 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 12/45] Revert "block: Pass BdrvChild ** to replace_child_noperm" Date: Thu, 31 Mar 2022 00:28:29 +0300 Message-Id: <20220330212902.590099-13-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::244 (failed) 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=2a00:1450:4864:20::244; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lj1-x244.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:23 -0400 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: , Cc: kwolf@redhat.com, hreitz@redhat.com, vsementsov@openvz.org, v.sementsov-og@mail.ru, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648682639298100001 Content-Type: text/plain; charset="utf-8" That's a preparation to previously reverted "block: Let replace_child_noperm free children". Drop it too, we don't need it for a new approach. This reverts commit be64bbb0149748f3999c49b13976aafb8330ea86. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/block.c b/block.c index 34eee40d48..8e8ed639fe 100644 --- a/block.c +++ b/block.c @@ -90,7 +90,7 @@ static BlockDriverState *bdrv_open_inherit(const char *fi= lename, static bool bdrv_recurse_has_child(BlockDriverState *bs, BlockDriverState *child); =20 -static void bdrv_replace_child_noperm(BdrvChild **child, +static void bdrv_replace_child_noperm(BdrvChild *child, BlockDriverState *new_bs); static void bdrv_remove_file_or_backing_child(BlockDriverState *bs, BdrvChild *child, @@ -2352,7 +2352,7 @@ static void bdrv_replace_child_abort(void *opaque) =20 GLOBAL_STATE_CODE(); /* old_bs reference is transparently moved from @s to @s->child */ - bdrv_replace_child_noperm(&s->child, s->old_bs); + bdrv_replace_child_noperm(s->child, s->old_bs); bdrv_unref(new_bs); } =20 @@ -2382,7 +2382,7 @@ static void bdrv_replace_child_tran(BdrvChild *child,= BlockDriverState *new_bs, if (new_bs) { bdrv_ref(new_bs); } - bdrv_replace_child_noperm(&child, new_bs); + bdrv_replace_child_noperm(child, new_bs); /* old_bs reference is transparently moved from @child to @s */ } =20 @@ -2764,10 +2764,9 @@ uint64_t bdrv_qapi_perm_to_blk_perm(BlockPermission = qapi_perm) return permissions[qapi_perm]; } =20 -static void bdrv_replace_child_noperm(BdrvChild **childp, +static void bdrv_replace_child_noperm(BdrvChild *child, BlockDriverState *new_bs) { - BdrvChild *child =3D *childp; BlockDriverState *old_bs =3D child->bs; int new_bs_quiesce_counter; int drain_saldo; @@ -2865,7 +2864,7 @@ static void bdrv_attach_child_common_abort(void *opaq= ue) BlockDriverState *bs =3D child->bs; =20 GLOBAL_STATE_CODE(); - bdrv_replace_child_noperm(s->child, NULL); + bdrv_replace_child_noperm(child, NULL); =20 if (bdrv_get_aio_context(bs) !=3D s->old_child_ctx) { bdrv_try_set_aio_context(bs, s->old_child_ctx, &error_abort); @@ -2966,7 +2965,7 @@ static int bdrv_attach_child_common(BlockDriverState = *child_bs, } =20 bdrv_ref(child_bs); - bdrv_replace_child_noperm(&new_child, child_bs); + bdrv_replace_child_noperm(new_child, child_bs); =20 *child =3D new_child; =20 @@ -3022,13 +3021,13 @@ static int bdrv_attach_child_noperm(BlockDriverStat= e *parent_bs, return 0; } =20 -static void bdrv_detach_child(BdrvChild **childp) +static void bdrv_detach_child(BdrvChild *child) { - BlockDriverState *old_bs =3D (*childp)->bs; + BlockDriverState *old_bs =3D child->bs; =20 GLOBAL_STATE_CODE(); - bdrv_replace_child_noperm(childp, NULL); - bdrv_child_free(*childp); + bdrv_replace_child_noperm(child, NULL); + bdrv_child_free(child); =20 if (old_bs) { /* @@ -3140,7 +3139,7 @@ void bdrv_root_unref_child(BdrvChild *child) GLOBAL_STATE_CODE(); =20 child_bs =3D child->bs; - bdrv_detach_child(&child); + bdrv_detach_child(child); bdrv_unref(child_bs); } =20 --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648682820073453.2750374064651; Wed, 30 Mar 2022 16:27:00 -0700 (PDT) Received: from localhost ([::1]:41674 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZhiM-0004tq-LK for importer@patchew.org; Wed, 30 Mar 2022 19:26:58 -0400 Received: from eggs.gnu.org ([209.51.188.92]:34780) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZfsu-00081c-7k for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:44 -0400 Received: from [2a00:1450:4864:20::22b] (port=43577 helo=mail-lj1-x22b.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZfsr-0003Cv-A5 for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:43 -0400 Received: by mail-lj1-x22b.google.com with SMTP id b43so24945645ljr.10 for ; Wed, 30 Mar 2022 14:29:40 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=yxA16/0vHXnE0IYduXZZfLFZVO67I7ey+Qd97nmcKzs=; b=8ShyqqI+F118OYSRuIRF4jBftfAMmK32ogDXd3xbtzufEzyNYIeJB8/cwyWPb0G2ia 4HEx2j4lnGjpBR2YvlYCaJAba4xb59VC8cqy3UJxVilZA767PS4/v1KrBLbJUZT9FTrt P8anHmfhOOUqrObK7q4uNWO+bFUkzBZvAwln2uyMdkJgeqWovKjDm1e9ec0a64W9ZTxm vxMfsHzqosJHwAIQl6UPFHbuzG/R73OEjlRnFBWQDGVwKZUuirrfF18OrXIcLUY7vq6m Qk2dW3DwxmO0XCASePTAj0T5zBO//ImbUFjvMgdc2o0Nax23iUiddUhRlaw1eZ2MHJyK 55PA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=yxA16/0vHXnE0IYduXZZfLFZVO67I7ey+Qd97nmcKzs=; b=LwYvfyhYwiBA+ejA9M7ZvxnPKdgK+9GE+xVKWb2F5qnKNSZRa2ddz9LPfKzRquzp0P TSr3oUAs2yj6wlh2jmnug0CLV7rm/0IuevNkTq08uO9uikI830CED/Me+n3FZ7dKk3Qb B/jZW3uY148pHAdQzraK9pgeVgYQVLW2Iv0vs0VVWSPQrcnwLTCW9huLe+w+Y8VuCl6q TcG5YZkgKvLBliaA4Eiw8hDzBYERr587Gj36NISBoVhrg/YSHz6AVhlL+Mnq7isf4nrn OxPOlSyqYo34aK+WwaicmU66MYXiJNLSOuFdXj/jGP2HIhFkgSIVlp5DSMpEk6gdVkUt 3RqQ== X-Gm-Message-State: AOAM530mpmsjQt0zPAFtqfQVGzO36GonodchSFio+IAlBjDHKNt3F/x2 LVvrAnwgpEWN/XSlj816Mjs1cE6Rq9rvPA== X-Google-Smtp-Source: ABdhPJyBCgCLkiGaBXqm8LhVIJbakMV4Qb+qy6LLCihdM6mD0kiDtubvzBR0x32kbsuyunmhz7JslA== X-Received: by 2002:a05:651c:1a27:b0:249:8dd8:6ceb with SMTP id by39-20020a05651c1a2700b002498dd86cebmr8080458ljb.8.1648675779478; Wed, 30 Mar 2022 14:29:39 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 13/45] block: Manipulate bs->file / bs->backing pointers in .attach/.detach Date: Thu, 31 Mar 2022 00:28:30 +0300 Message-Id: <20220330212902.590099-14-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::22b (failed) 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=2a00:1450:4864:20::22b; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lj1-x22b.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:23 -0400 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: , Cc: kwolf@redhat.com, hreitz@redhat.com, vsementsov@openvz.org, v.sementsov-og@mail.ru, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648682821439100001 Content-Type: text/plain; charset="utf-8" bs->file and bs->backing are a kind of duplication of part of bs->children. But very useful diplication, so let's not drop them at all:) We should manage bs->file and bs->backing in same place, where we manage bs->children, to keep them in sync. Moreover, generic io paths are unprepared to BdrvChild without a bs, so it's double good to clear bs->file / bs->backing when we detach the child. Detach is simple: if we detach bs->file or bs->backing child, just set corresponding field to NULL. Attach is a bit more complicated. But we still can precisely detect should we set one of bs->file / bs->backing or not: - if role is BDRV_CHILD_COW, we definitely deal with bs->backing - else, if role is BDRV_CHILD_FILTERED (it must be also BDRV_CHILD_PRIMARY), it's a filtered child. Use bs->drv->filtered_child_is_backing to chose the pointer field to modify. - else, if role is BDRV_CHILD_PRIMARY, we deal with bs->file - in all other cases, it's neither bs->backing nor bs->file. It's some other child and we shouldn't care OK. This change brings one more good thing: we can (and should) get rid of all indirect pointers in the block-graph-change transactions: bdrv_attach_child_common() stores BdrvChild** into transaction to clear it on abort. bdrv_attach_child_common() has two callers: bdrv_attach_child_noperm() just pass-through this feature, bdrv_root_attach_child() doesn't need the feature. Look at bdrv_attach_child_noperm() callers: - bdrv_attach_child() doesn't need the feature - bdrv_set_file_or_backing_noperm() uses the feature to manage bs->file and bs->backing, we don't want it anymore - bdrv_append() uses the feature to manage bs->backing, again we don't want it anymore So, we should drop this stuff! Great! We still keep BdrvChild** argument to return the child and int return value, and not move to simply returning BdrvChild*, as we don't want to lose int return values. However we don't require *@child to be NULL anymore, and even allow @child to be NULL, if caller don't need the new child pointer. Finally, we now set .file / .backing automatically in generic code and want to restring setting them by hand outside of .attach/.detach. So, this patch cleanups all remaining places where they were set. To find such places I use: git grep '\->file =3D' git grep '\->backing =3D' git grep '&.*\' git grep '&.*\' Signed-off-by: Vladimir Sementsov-Ogievskiy --- block.c | 156 ++++++++++++++----------------- block/raw-format.c | 4 +- block/snapshot.c | 1 - include/block/block_int-common.h | 15 ++- tests/unit/test-bdrv-drain.c | 10 +- 5 files changed, 89 insertions(+), 97 deletions(-) diff --git a/block.c b/block.c index 8e8ed639fe..6b43e101a1 100644 --- a/block.c +++ b/block.c @@ -1438,9 +1438,33 @@ static void bdrv_child_cb_attach(BdrvChild *child) =20 assert_bdrv_graph_writable(bs); QLIST_INSERT_HEAD(&bs->children, child, next); - - if (child->role & BDRV_CHILD_COW) { + if (bs->drv->is_filter | (child->role & BDRV_CHILD_FILTERED)) { + /* + * Here we handle filters and block/raw-format.c when it behave li= ke + * filter. + */ + assert(!(child->role & BDRV_CHILD_COW)); + if (child->role & (BDRV_CHILD_PRIMARY | BDRV_CHILD_FILTERED)) { + assert(child->role & BDRV_CHILD_PRIMARY); + assert(child->role & BDRV_CHILD_FILTERED); + assert(!bs->backing); + assert(!bs->file); + + if (bs->drv->filtered_child_is_backing) { + bs->backing =3D child; + } else { + bs->file =3D child; + } + } + } else if (child->role & BDRV_CHILD_COW) { + assert(bs->drv->supports_backing); + assert(!(child->role & BDRV_CHILD_PRIMARY)); + assert(!bs->backing); + bs->backing =3D child; bdrv_backing_attach(child); + } else if (child->role & BDRV_CHILD_PRIMARY) { + assert(!bs->file); + bs->file =3D child; } =20 bdrv_apply_subtree_drain(child, bs); @@ -1458,6 +1482,12 @@ static void bdrv_child_cb_detach(BdrvChild *child) =20 assert_bdrv_graph_writable(bs); QLIST_REMOVE(child, next); + if (child =3D=3D bs->backing) { + assert(child !=3D bs->file); + bs->backing =3D NULL; + } else if (child =3D=3D bs->file) { + bs->file =3D NULL; + } } =20 static int bdrv_child_cb_update_filename(BdrvChild *c, BlockDriverState *b= ase, @@ -1663,7 +1693,7 @@ open_failed: bs->drv =3D NULL; if (bs->file !=3D NULL) { bdrv_unref_child(bs, bs->file); - bs->file =3D NULL; + assert(!bs->file); } g_free(bs->opaque); bs->opaque =3D NULL; @@ -2852,7 +2882,7 @@ static void bdrv_child_free(BdrvChild *child) } =20 typedef struct BdrvAttachChildCommonState { - BdrvChild **child; + BdrvChild *child; AioContext *old_parent_ctx; AioContext *old_child_ctx; } BdrvAttachChildCommonState; @@ -2860,33 +2890,31 @@ typedef struct BdrvAttachChildCommonState { static void bdrv_attach_child_common_abort(void *opaque) { BdrvAttachChildCommonState *s =3D opaque; - BdrvChild *child =3D *s->child; - BlockDriverState *bs =3D child->bs; + BlockDriverState *bs =3D s->child->bs; =20 GLOBAL_STATE_CODE(); - bdrv_replace_child_noperm(child, NULL); + bdrv_replace_child_noperm(s->child, NULL); =20 if (bdrv_get_aio_context(bs) !=3D s->old_child_ctx) { bdrv_try_set_aio_context(bs, s->old_child_ctx, &error_abort); } =20 - if (bdrv_child_get_parent_aio_context(child) !=3D s->old_parent_ctx) { + if (bdrv_child_get_parent_aio_context(s->child) !=3D s->old_parent_ctx= ) { GSList *ignore; =20 /* No need to ignore `child`, because it has been detached already= */ ignore =3D NULL; - child->klass->can_set_aio_ctx(child, s->old_parent_ctx, &ignore, - &error_abort); + s->child->klass->can_set_aio_ctx(s->child, s->old_parent_ctx, &ign= ore, + &error_abort); g_slist_free(ignore); =20 ignore =3D NULL; - child->klass->set_aio_ctx(child, s->old_parent_ctx, &ignore); + s->child->klass->set_aio_ctx(s->child, s->old_parent_ctx, &ignore); g_slist_free(ignore); } =20 bdrv_unref(bs); - bdrv_child_free(child); - *s->child =3D NULL; + bdrv_child_free(s->child); } =20 static TransactionActionDrv bdrv_attach_child_common_drv =3D { @@ -2897,11 +2925,11 @@ static TransactionActionDrv bdrv_attach_child_commo= n_drv =3D { /* * Common part of attaching bdrv child to bs or to blk or to job * - * Resulting new child is returned through @child. - * At start *@child must be NULL. - * @child is saved to a new entry of @tran, so that *@child could be rever= ted to - * NULL on abort(). So referenced variable must live at least until transa= ction - * end. + * If @child is not NULL, it's set to new created child. Note, that @child + * pointer is stored in the transaction and therefore not cleared on abort. + * Consider @child as part of return value: we may change the return value= of + * the function to BdrvChild* and return child directly, but this way we l= ose + * different return codes. * * Function doesn't update permissions, caller is responsible for this. */ @@ -2917,8 +2945,6 @@ static int bdrv_attach_child_common(BlockDriverState = *child_bs, AioContext *parent_ctx; AioContext *child_ctx =3D bdrv_get_aio_context(child_bs); =20 - assert(child); - assert(*child =3D=3D NULL); assert(child_class->get_parent_desc); GLOBAL_STATE_CODE(); =20 @@ -2967,22 +2993,25 @@ static int bdrv_attach_child_common(BlockDriverStat= e *child_bs, bdrv_ref(child_bs); bdrv_replace_child_noperm(new_child, child_bs); =20 - *child =3D new_child; - BdrvAttachChildCommonState *s =3D g_new(BdrvAttachChildCommonState, 1); *s =3D (BdrvAttachChildCommonState) { - .child =3D child, + .child =3D new_child, .old_parent_ctx =3D parent_ctx, .old_child_ctx =3D child_ctx, }; tran_add(tran, &bdrv_attach_child_common_drv, s); =20 + if (child) { + *child =3D new_child; + } + return 0; } =20 /* - * Variable referenced by @child must live at least until transaction end. - * (see bdrv_attach_child_common() doc for details) + * If @child is not NULL, it's set to new created child. @child is a part = of + * return value, not a part of transaction (see bdrv_attach_child_common()= doc + * for details). * * Function doesn't update permissions, caller is responsible for this. */ @@ -3063,7 +3092,7 @@ BdrvChild *bdrv_root_attach_child(BlockDriverState *c= hild_bs, void *opaque, Error **errp) { int ret; - BdrvChild *child =3D NULL; + BdrvChild *child; Transaction *tran =3D tran_new(); =20 GLOBAL_STATE_CODE(); @@ -3079,11 +3108,10 @@ BdrvChild *bdrv_root_attach_child(BlockDriverState = *child_bs, =20 out: tran_finalize(tran, ret); - /* child is unset on failure by bdrv_attach_child_common_abort() */ - assert((ret < 0) =3D=3D !child); =20 bdrv_unref(child_bs); - return child; + + return ret < 0 ? NULL : child; } =20 /* @@ -3105,7 +3133,7 @@ BdrvChild *bdrv_attach_child(BlockDriverState *parent= _bs, Error **errp) { int ret; - BdrvChild *child =3D NULL; + BdrvChild *child; Transaction *tran =3D tran_new(); =20 GLOBAL_STATE_CODE(); @@ -3123,12 +3151,10 @@ BdrvChild *bdrv_attach_child(BlockDriverState *pare= nt_bs, =20 out: tran_finalize(tran, ret); - /* child is unset on failure by bdrv_attach_child_common_abort() */ - assert((ret < 0) =3D=3D !child); =20 bdrv_unref(child_bs); =20 - return child; + return ret < 0 ? NULL : child; } =20 /* Callers must ensure that child->frozen is false. */ @@ -3331,9 +3357,7 @@ static int bdrv_set_file_or_backing_noperm(BlockDrive= rState *parent_bs, ret =3D bdrv_attach_child_noperm(parent_bs, child_bs, is_backing ? "backing" : "file", &child_of_bds, role, - is_backing ? &parent_bs->backing : - &parent_bs->file, - tran, errp); + NULL, tran, errp); if (ret < 0) { return ret; } @@ -3591,14 +3615,16 @@ int bdrv_open_file_child(const char *filename, =20 /* commit_top and mirror_top don't use this function */ assert(!parent->drv->filtered_child_is_backing); - role =3D parent->drv->is_filter ? (BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY) : BDRV_CHILD_IMAGE; =20 - parent->file =3D bdrv_open_child(filename, options, bdref_key, parent, - &child_of_bds, role, false, errp); + if (!bdrv_open_child(filename, options, bdref_key, parent, + &child_of_bds, role, false, errp)) + { + return -EINVAL; + } =20 - return parent->file ? 0 : -EINVAL; + return 0; } =20 /* @@ -4873,8 +4899,8 @@ static void bdrv_close(BlockDriverState *bs) bdrv_unref_child(bs, child); } =20 - bs->backing =3D NULL; - bs->file =3D NULL; + assert(!bs->backing); + assert(!bs->file); g_free(bs->opaque); bs->opaque =3D NULL; qatomic_set(&bs->copy_on_read, 0); @@ -5005,41 +5031,14 @@ static bool should_update_child(BdrvChild *c, Block= DriverState *to) return ret; } =20 -typedef struct BdrvRemoveFilterOrCowChild { - BdrvChild *child; - bool is_backing; -} BdrvRemoveFilterOrCowChild; - -static void bdrv_remove_filter_or_cow_child_abort(void *opaque) -{ - BdrvRemoveFilterOrCowChild *s =3D opaque; - BlockDriverState *parent_bs =3D s->child->opaque; - - if (s->is_backing) { - parent_bs->backing =3D s->child; - } else { - parent_bs->file =3D s->child; - } - - /* - * We don't have to restore child->bs here to undo bdrv_replace_child_= tran() - * because that function is transactionable and it registered own comp= letion - * entries in @tran, so .abort() for bdrv_replace_child_safe() will be - * called automatically. - */ -} - static void bdrv_remove_filter_or_cow_child_commit(void *opaque) { - BdrvRemoveFilterOrCowChild *s =3D opaque; GLOBAL_STATE_CODE(); - bdrv_child_free(s->child); + bdrv_child_free(opaque); } =20 static TransactionActionDrv bdrv_remove_filter_or_cow_child_drv =3D { - .abort =3D bdrv_remove_filter_or_cow_child_abort, .commit =3D bdrv_remove_filter_or_cow_child_commit, - .clean =3D g_free, }; =20 /* @@ -5050,8 +5049,6 @@ static void bdrv_remove_file_or_backing_child(BlockDr= iverState *bs, BdrvChild *child, Transaction *tran) { - BdrvRemoveFilterOrCowChild *s; - assert(child =3D=3D bs->backing || child =3D=3D bs->file); =20 if (!child) { @@ -5062,18 +5059,7 @@ static void bdrv_remove_file_or_backing_child(BlockD= riverState *bs, bdrv_replace_child_tran(child, NULL, tran); } =20 - s =3D g_new(BdrvRemoveFilterOrCowChild, 1); - *s =3D (BdrvRemoveFilterOrCowChild) { - .child =3D child, - .is_backing =3D (child =3D=3D bs->backing), - }; - tran_add(tran, &bdrv_remove_filter_or_cow_child_drv, s); - - if (s->is_backing) { - bs->backing =3D NULL; - } else { - bs->file =3D NULL; - } + tran_add(tran, &bdrv_remove_filter_or_cow_child_drv, child); } =20 /* @@ -5235,7 +5221,7 @@ int bdrv_append(BlockDriverState *bs_new, BlockDriver= State *bs_top, =20 ret =3D bdrv_attach_child_noperm(bs_new, bs_top, "backing", &child_of_bds, bdrv_backing_role(bs_new= ), - &bs_new->backing, tran, errp); + NULL, tran, errp); if (ret < 0) { goto out; } diff --git a/block/raw-format.c b/block/raw-format.c index 69fd650eaf..d8ca8ee3a9 100644 --- a/block/raw-format.c +++ b/block/raw-format.c @@ -457,8 +457,8 @@ static int raw_open(BlockDriverState *bs, QDict *option= s, int flags, file_role =3D BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY; } =20 - bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_of_bds, - file_role, false, errp); + bdrv_open_child(NULL, options, "file", bs, &child_of_bds, + file_role, false, errp); if (!bs->file) { return -EINVAL; } diff --git a/block/snapshot.c b/block/snapshot.c index f4ec4f9ef3..02a880911f 100644 --- a/block/snapshot.c +++ b/block/snapshot.c @@ -288,7 +288,6 @@ int bdrv_snapshot_goto(BlockDriverState *bs, =20 /* .bdrv_open() will re-attach it */ bdrv_unref_child(bs, *fallback_ptr); - *fallback_ptr =3D NULL; =20 ret =3D bdrv_snapshot_goto(fallback_bs, snapshot_id, errp); open_ret =3D drv->bdrv_open(bs, options, bs->open_flags, &local_er= r); diff --git a/include/block/block_int-common.h b/include/block/block_int-com= mon.h index d68adc6ff3..c4d8b11dbb 100644 --- a/include/block/block_int-common.h +++ b/include/block/block_int-common.h @@ -1056,9 +1056,6 @@ struct BlockDriverState { QDict *full_open_options; char exact_filename[PATH_MAX]; =20 - BdrvChild *backing; - BdrvChild *file; - /* I/O Limits */ BlockLimits bl; =20 @@ -1117,7 +1114,19 @@ struct BlockDriverState { * parent node of this node. */ BlockDriverState *inherits_from; + + /* + * @backing and @file are some of @children or NULL. All these three f= ields + * (@file, @backing and @children) are modified only in + * bdrv_child_cb_attach() and bdrv_child_cb_detach(). + * + * See also comment in include/block/block.h, to learn how backing and= file + * are connected with BdrvChildRole. + */ QLIST_HEAD(, BdrvChild) children; + BdrvChild *backing; + BdrvChild *file; + QLIST_HEAD(, BdrvChild) parents; =20 QDict *options; diff --git a/tests/unit/test-bdrv-drain.c b/tests/unit/test-bdrv-drain.c index 23d425a494..4cf99edf5b 100644 --- a/tests/unit/test-bdrv-drain.c +++ b/tests/unit/test-bdrv-drain.c @@ -1808,9 +1808,8 @@ static void test_drop_intermediate_poll(void) for (i =3D 0; i < 3; i++) { if (i) { /* Takes the reference to chain[i - 1] */ - chain[i]->backing =3D bdrv_attach_child(chain[i], chain[i - 1], - "chain", &chain_child_cl= ass, - BDRV_CHILD_COW, &error_a= bort); + bdrv_attach_child(chain[i], chain[i - 1], "chain", + &chain_child_class, BDRV_CHILD_COW, &error_a= bort); } } =20 @@ -2028,9 +2027,8 @@ static void do_test_replace_child_mid_drain(int old_d= rain_count, new_child_bs->total_sectors =3D 1; =20 bdrv_ref(old_child_bs); - parent_bs->backing =3D bdrv_attach_child(parent_bs, old_child_bs, "chi= ld", - &child_of_bds, BDRV_CHILD_COW, - &error_abort); + bdrv_attach_child(parent_bs, old_child_bs, "child", &child_of_bds, + BDRV_CHILD_COW, &error_abort); =20 for (i =3D 0; i < old_drain_count; i++) { bdrv_drained_begin(old_child_bs); --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648682990006593.8431046226157; Wed, 30 Mar 2022 16:29:50 -0700 (PDT) Received: from localhost ([::1]:51024 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZhl6-0003of-KZ for importer@patchew.org; Wed, 30 Mar 2022 19:29:48 -0400 Received: from eggs.gnu.org ([209.51.188.92]:34812) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZfsu-000823-OH for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:44 -0400 Received: from [2a00:1450:4864:20::234] (port=45607 helo=mail-lj1-x234.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZfsr-0003DS-PK for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:44 -0400 Received: by mail-lj1-x234.google.com with SMTP id q14so29438128ljc.12 for ; Wed, 30 Mar 2022 14:29:41 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=0BsZDlG5/Je7DCELDZn+xW6JtHGolaaxAhVN99vmYhA=; b=3G/Ljtv7JRbX4rsKOxUo4Z5I7mGhBX1LTz420qAk3nSOTWeIO3xN2WUlm5wMhQlm9C VjqzQjdhTwfRx7h2OjZua8fR5BMH8teY/jKGxyld7fd4r5F4VkWOHkPh/DGStmz6MUbi mt4VygQwNIyDUmNIgT8mHrhSN6HWNeBvUn8ehsftQ7j5DWcuDrJsHDbu/QzBUrvpUZS8 k41nsw92w30y4U2d7g+Jp54F9400oPoUIJnmh6LDCvcJZVxIAPRWt4SMZDCPV1Lz7IAc vqmH4QQxNxewA0pxlgP5tMEZJBhcabMfH6vhmfb+ocCa77dWqNKOk1KV9CIxn17fEeP6 r8FQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=0BsZDlG5/Je7DCELDZn+xW6JtHGolaaxAhVN99vmYhA=; b=Qtfn0mZQYpIDFVCCPLiF79KFEqFga6ztc8UNpIaiDVg3EJ3FG52CUgC1eYFhpYto55 GXBQWJEQl7B0JFAuBO1SWicHvt0jyFi104gGa56qj2/wMiku6tfck04X9uHrx6AXzvIM sFtNOUJNH8hYznnuK9wOv9YTPl9MreuYU2etWm+DIZdQRCiiJwWwRlNz/BCvBINaFrWq PRpLjtWbNxTAKEX8t541QcPxiJyxLa1qDO2oL/SDcGxG5ctZ1pmaAZytOtS4YPhnSkJ8 IxKpnUPaF6JURifVtyJzVUydr69OCQix3ytLRjqEPtRk6fln0JATQGI3Mi+TXOffKlLn 46mw== X-Gm-Message-State: AOAM53031UtzJiJi8fvoibCmsvi0wru3cj/JxVRRWjk6NecLMDq+x+ct WHozwvtSlAEB/aLhUJra/zcmww== X-Google-Smtp-Source: ABdhPJzOBsLxBoE7rWAuYk1Dzll8CDYOdFWbQRyUzhggnadaTMeyxNEIG+p2fJeuMEtuSbyzC27F9A== X-Received: by 2002:a05:651c:210d:b0:24a:cd05:921c with SMTP id a13-20020a05651c210d00b0024acd05921cmr8485228ljq.522.1648675780078; Wed, 30 Mar 2022 14:29:40 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 14/45] block/snapshot: drop indirection around bdrv_snapshot_fallback_ptr Date: Thu, 31 Mar 2022 00:28:31 +0300 Message-Id: <20220330212902.590099-15-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::234 (failed) 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=2a00:1450:4864:20::234; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lj1-x234.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:23 -0400 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: , Cc: kwolf@redhat.com, hreitz@redhat.com, vsementsov@openvz.org, v.sementsov-og@mail.ru, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648682991245100001 Content-Type: text/plain; charset="utf-8" Now the indirection is not actually used, we can safely reduce it to simple pointer. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block/snapshot.c | 39 +++++++++++++++++---------------------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/block/snapshot.c b/block/snapshot.c index 02a880911f..4eb9258de6 100644 --- a/block/snapshot.c +++ b/block/snapshot.c @@ -151,34 +151,29 @@ bool bdrv_snapshot_find_by_id_and_name(BlockDriverSta= te *bs, } =20 /** - * Return a pointer to the child BDS pointer to which we can fall + * Return a pointer to child of given BDS to which we can fall * back if the given BDS does not support snapshots. * Return NULL if there is no BDS to (safely) fall back to. - * - * We need to return an indirect pointer because bdrv_snapshot_goto() - * has to modify the BdrvChild pointer. */ -static BdrvChild **bdrv_snapshot_fallback_ptr(BlockDriverState *bs) +static BdrvChild *bdrv_snapshot_fallback_ptr(BlockDriverState *bs) { - BdrvChild **fallback; - BdrvChild *child =3D bdrv_primary_child(bs); + BdrvChild *fallback =3D bdrv_primary_child(bs); + BdrvChild *child; =20 /* We allow fallback only to primary child */ - if (!child) { + if (!fallback) { return NULL; } - fallback =3D (child =3D=3D bs->file ? &bs->file : &bs->backing); - assert(*fallback =3D=3D child); =20 /* * Check that there are no other children that would need to be * snapshotted. If there are, it is not safe to fall back to - * *fallback. + * fallback. */ QLIST_FOREACH(child, &bs->children, next) { if (child->role & (BDRV_CHILD_DATA | BDRV_CHILD_METADATA | BDRV_CHILD_FILTERED) && - child !=3D *fallback) + child !=3D fallback) { return NULL; } @@ -189,8 +184,8 @@ static BdrvChild **bdrv_snapshot_fallback_ptr(BlockDriv= erState *bs) =20 static BlockDriverState *bdrv_snapshot_fallback(BlockDriverState *bs) { - BdrvChild **child_ptr =3D bdrv_snapshot_fallback_ptr(bs); - return child_ptr ? (*child_ptr)->bs : NULL; + BdrvChild *child_ptr =3D bdrv_snapshot_fallback_ptr(bs); + return child_ptr ? child_ptr->bs : NULL; } =20 int bdrv_can_snapshot(BlockDriverState *bs) @@ -237,7 +232,7 @@ int bdrv_snapshot_goto(BlockDriverState *bs, Error **errp) { BlockDriver *drv =3D bs->drv; - BdrvChild **fallback_ptr; + BdrvChild *fallback; int ret, open_ret; =20 GLOBAL_STATE_CODE(); @@ -260,13 +255,13 @@ int bdrv_snapshot_goto(BlockDriverState *bs, return ret; } =20 - fallback_ptr =3D bdrv_snapshot_fallback_ptr(bs); - if (fallback_ptr) { + fallback =3D bdrv_snapshot_fallback_ptr(bs); + if (fallback) { QDict *options; QDict *file_options; Error *local_err =3D NULL; - BlockDriverState *fallback_bs =3D (*fallback_ptr)->bs; - char *subqdict_prefix =3D g_strdup_printf("%s.", (*fallback_ptr)->= name); + BlockDriverState *fallback_bs =3D fallback->bs; + char *subqdict_prefix =3D g_strdup_printf("%s.", fallback->name); =20 options =3D qdict_clone_shallow(bs->options); =20 @@ -277,8 +272,8 @@ int bdrv_snapshot_goto(BlockDriverState *bs, qobject_unref(file_options); g_free(subqdict_prefix); =20 - /* Force .bdrv_open() below to re-attach fallback_bs on *fallback_= ptr */ - qdict_put_str(options, (*fallback_ptr)->name, + /* Force .bdrv_open() below to re-attach fallback_bs on fallback */ + qdict_put_str(options, fallback->name, bdrv_get_node_name(fallback_bs)); =20 /* Now close bs, apply the snapshot on fallback_bs, and re-open bs= */ @@ -287,7 +282,7 @@ int bdrv_snapshot_goto(BlockDriverState *bs, } =20 /* .bdrv_open() will re-attach it */ - bdrv_unref_child(bs, *fallback_ptr); + bdrv_unref_child(bs, fallback); =20 ret =3D bdrv_snapshot_goto(fallback_bs, snapshot_id, errp); open_ret =3D drv->bdrv_open(bs, options, bs->open_flags, &local_er= r); --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648683169424546.5876317222045; Wed, 30 Mar 2022 16:32:49 -0700 (PDT) Received: from localhost ([::1]:59556 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZho0-0001Cb-Cb for importer@patchew.org; Wed, 30 Mar 2022 19:32:48 -0400 Received: from eggs.gnu.org ([209.51.188.92]:34854) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZfsv-00083K-GP for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:45 -0400 Received: from [2a00:1450:4864:20::22e] (port=41629 helo=mail-lj1-x22e.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZfss-0003Dq-BS for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:45 -0400 Received: by mail-lj1-x22e.google.com with SMTP id 17so29456221ljw.8 for ; Wed, 30 Mar 2022 14:29:41 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=w/XPFB50s2E7QmKXWVgr4ZxiBQcgFd5eEk1tVhq6TfI=; b=WMmknK1s9W5MJLo3aWzjUCx4mMDVQQgoJwAKuXA2jD1NRppiWLuE04VUOB8F19EApV 5rK4H4i9V8lULTzOijXh2cVc6138rgHZTGE886CVwLSqvjcCN6B7g2sD12g15a2I/vjn Y1zWvKFjSVmjlusMHNq+ryWagRGwCJRviRDrHcw22R8ERmLBcC/UKgHPWSu8+blp+XGi 4jsBqB1GxwMctxwXGMmJHD7LRGbueHbNSM7E41QqYpiVZKshCBIEgDgQ1u9Zkm3A/HzK w2CxvIZtVnPptTIW7hPAH2a9c081YFNFBKvDZc65QtS3BW/8RTN6hudOiPykYTOiYF86 ZmIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=w/XPFB50s2E7QmKXWVgr4ZxiBQcgFd5eEk1tVhq6TfI=; b=XC4qAbTS0p6eRXt0lXlO9pxp5lVFF1dxhmEzrXdkyDvZpQer+gA22cA482J4jlqGb+ E4xpdAuBolUuvoTxeIpdrgRuk2WqaZmRzUL6zTyM3ggRLbdHQFwzOIs//ufECbDliyxH Y5gvl5ulvCE86LkbaWO2oLh2iAyJ2iKR1+mGIlIOELWg0EN+QE1Ljo3AQxp0nId4iXIP eSlZrO+J/F496cPZ/h5zfkW1YfSH2TGu8Qd0m/rtlV1u6gVVmOI7TNMfr1I3Z0SWzGu3 u/Qu19BvKR9aREMlujhRODwsjmGf0yC1GXJD/5GLB/PXnRkNX317W/ZOlYiV3VekbvP7 YnWA== X-Gm-Message-State: AOAM533RvGJu/H/H8Ft5pOpAWgyAfUAeGDR+zm/W0czlXi9YuT8AiRh6 MThJ3ux1aB0FdRz4wjOG/a0iiw== X-Google-Smtp-Source: ABdhPJwwKJsuHeaWMxgIjhd1HoIfkfUGoXtBLpPmpT5Yaq+dfSiVetIFP9KfPcfWZ70USXLd0yOHdw== X-Received: by 2002:a2e:9ad6:0:b0:248:a4ed:cff4 with SMTP id p22-20020a2e9ad6000000b00248a4edcff4mr8199143ljj.156.1648675780758; Wed, 30 Mar 2022 14:29:40 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 15/45] block: refactor bdrv_remove_file_or_backing_child to bdrv_remove_child Date: Thu, 31 Mar 2022 00:28:32 +0300 Message-Id: <20220330212902.590099-16-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::22e (failed) 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=2a00:1450:4864:20::22e; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lj1-x22e.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:24 -0400 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: , Cc: kwolf@redhat.com, hreitz@redhat.com, vsementsov@openvz.org, v.sementsov-og@mail.ru, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648683170957100003 Content-Type: text/plain; charset="utf-8" Now the function can remove any child, so give it more common name. Drop assertions and drop bs argument which becomes unused. Function would be reused in a further commit. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/block.c b/block.c index 6b43e101a1..ea5687edc8 100644 --- a/block.c +++ b/block.c @@ -92,9 +92,7 @@ static bool bdrv_recurse_has_child(BlockDriverState *bs, =20 static void bdrv_replace_child_noperm(BdrvChild *child, BlockDriverState *new_bs); -static void bdrv_remove_file_or_backing_child(BlockDriverState *bs, - BdrvChild *child, - Transaction *tran); +static void bdrv_remove_child(BdrvChild *child, Transaction *tran); static void bdrv_remove_filter_or_cow_child(BlockDriverState *bs, Transaction *tran); =20 @@ -3347,7 +3345,7 @@ static int bdrv_set_file_or_backing_noperm(BlockDrive= rState *parent_bs, =20 if (child) { bdrv_unset_inherits_from(parent_bs, child, tran); - bdrv_remove_file_or_backing_child(parent_bs, child, tran); + bdrv_remove_child(child, tran); } =20 if (!child_bs) { @@ -5031,26 +5029,22 @@ static bool should_update_child(BdrvChild *c, Block= DriverState *to) return ret; } =20 -static void bdrv_remove_filter_or_cow_child_commit(void *opaque) +static void bdrv_remove_child_commit(void *opaque) { GLOBAL_STATE_CODE(); bdrv_child_free(opaque); } =20 -static TransactionActionDrv bdrv_remove_filter_or_cow_child_drv =3D { - .commit =3D bdrv_remove_filter_or_cow_child_commit, +static TransactionActionDrv bdrv_remove_child_drv =3D { + .commit =3D bdrv_remove_child_commit, }; =20 /* * A function to remove backing or file child of @bs. * Function doesn't update permissions, caller is responsible for this. */ -static void bdrv_remove_file_or_backing_child(BlockDriverState *bs, - BdrvChild *child, - Transaction *tran) +static void bdrv_remove_child(BdrvChild *child, Transaction *tran) { - assert(child =3D=3D bs->backing || child =3D=3D bs->file); - if (!child) { return; } @@ -5059,7 +5053,7 @@ static void bdrv_remove_file_or_backing_child(BlockDr= iverState *bs, bdrv_replace_child_tran(child, NULL, tran); } =20 - tran_add(tran, &bdrv_remove_filter_or_cow_child_drv, child); + tran_add(tran, &bdrv_remove_child_drv, child); } =20 /* @@ -5070,7 +5064,7 @@ static void bdrv_remove_file_or_backing_child(BlockDr= iverState *bs, static void bdrv_remove_filter_or_cow_child(BlockDriverState *bs, Transaction *tran) { - bdrv_remove_file_or_backing_child(bs, bdrv_filter_or_cow_child(bs), tr= an); + bdrv_remove_child(bdrv_filter_or_cow_child(bs), tran); } =20 static int bdrv_replace_node_noperm(BlockDriverState *from, --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648683437864422.55244363538975; Wed, 30 Mar 2022 16:37:17 -0700 (PDT) Received: from localhost ([::1]:44672 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZhsK-0001sM-Q1 for importer@patchew.org; Wed, 30 Mar 2022 19:37:16 -0400 Received: from eggs.gnu.org ([209.51.188.92]:34860) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZfsv-00083R-JC for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:45 -0400 Received: from [2a00:1450:4864:20::135] (port=42544 helo=mail-lf1-x135.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZfss-0003EL-V6 for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:45 -0400 Received: by mail-lf1-x135.google.com with SMTP id d5so38070206lfj.9 for ; Wed, 30 Mar 2022 14:29:42 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=uGuhODNDtdx0o1No7NswfaxfWsI5Jg2nwGbCTeve7eQ=; b=mFevxxABhstW6S+KZKTR1LlYTcAxvbkzF4ihs6IeBcSo89lgbN9a/HoBl8RUpZaDzy 7wYNE4VkUkNTtb9dfmkWAshvr2kz6OA1EYO1j63gmlyGwRF9AL1eGR+bBYFgh6+TWhFl j8E7m36LErbDqAK/KsMyJIFLC5aUpxDdLufYxT8ZyTBvNx1adWYKdjsWTzXrrjXFa+D3 NtuQE0GSdOzkbBO10BW7zOJjxqGi+MgzZrvYeQM3vg/anod0eBZV4fM9IWBLl0LwVm2v yur5YGJJsaTpjOaaJVHCqMlWvHkcdBER4yKFWJxaBCVCu1ODlSbTtTVVd3EpkDpZwjo6 3L6w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=uGuhODNDtdx0o1No7NswfaxfWsI5Jg2nwGbCTeve7eQ=; b=EYkUhmAXEaLzFq/EGtzdq+kMRXY2JYw30dc9U1me0IgENDcxPOYh/IduRusyq8q826 dHrpp9kjM+CnO+X+ELH08g80Cyjz88hZE+bLt6o06Q94AdEs6nNn1HyfP0BRoAOs1jD9 ONCg89J89jWtYS1A7lKBi+5MdyS88ZQiiVDed+4kLb35pmGK81z0dccQG4HF46mYRRql vIlKH+gOms/EwPp0ND/uTxFNiaFwvkFC1Qd+o1Zl8wKd7U7qSCSmnI9HoewzLgPjrjCa IKC7yKt502FhBIy0BW2j6N07K/vL4X1QKi+MjgQ1WnmqsfZWT1uCy3wx/7ZcsEes8UXO L77g== X-Gm-Message-State: AOAM530ZByFq7GawE49A4ATmQaOkg8VBGjVIMsq8qFNq18t7zKThYe+8 A/+O8o1DLc4dbbElMZ5h02eDjA== X-Google-Smtp-Source: ABdhPJwHJLNiJPJcYrMEHYRe+LnDMl3iliwgAlUz1+9oW+mNmGf+xrCdpnJ/o0cXeCf+IEFYak3W3w== X-Received: by 2002:a05:6512:11cc:b0:44a:5770:7425 with SMTP id h12-20020a05651211cc00b0044a57707425mr8206430lfr.406.1648675781349; Wed, 30 Mar 2022 14:29:41 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 16/45] block: drop bdrv_detach_child() Date: Thu, 31 Mar 2022 00:28:33 +0300 Message-Id: <20220330212902.590099-17-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::135 (failed) 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=2a00:1450:4864:20::135; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lf1-x135.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:25 -0400 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: , Cc: kwolf@redhat.com, hreitz@redhat.com, vsementsov@openvz.org, v.sementsov-og@mail.ru, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648683438518100001 Content-Type: text/plain; charset="utf-8" The only caller is bdrv_root_unref_child(), let's just do the logic directly in it. It simplifies further convertion of bdrv_root_unref_child() to transaction action. Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Hanna Reitz --- block.c | 45 ++++++++++++++++++--------------------------- 1 file changed, 18 insertions(+), 27 deletions(-) diff --git a/block.c b/block.c index ea5687edc8..34e89b277f 100644 --- a/block.c +++ b/block.c @@ -3048,30 +3048,6 @@ static int bdrv_attach_child_noperm(BlockDriverState= *parent_bs, return 0; } =20 -static void bdrv_detach_child(BdrvChild *child) -{ - BlockDriverState *old_bs =3D child->bs; - - GLOBAL_STATE_CODE(); - bdrv_replace_child_noperm(child, NULL); - bdrv_child_free(child); - - if (old_bs) { - /* - * Update permissions for old node. We're just taking a parent awa= y, so - * we're loosening restrictions. Errors of permission update are n= ot - * fatal in this case, ignore them. - */ - bdrv_refresh_perms(old_bs, NULL); - - /* - * When the parent requiring a non-default AioContext is removed, = the - * node moves back to the main AioContext - */ - bdrv_try_set_aio_context(old_bs, qemu_get_aio_context(), NULL); - } -} - /* * This function steals the reference to child_bs from the caller. * That reference is later dropped by bdrv_root_unref_child(). @@ -3158,12 +3134,27 @@ out: /* Callers must ensure that child->frozen is false. */ void bdrv_root_unref_child(BdrvChild *child) { - BlockDriverState *child_bs; + BlockDriverState *child_bs =3D child->bs; =20 GLOBAL_STATE_CODE(); + bdrv_replace_child_noperm(child, NULL); + bdrv_child_free(child); + + if (child_bs) { + /* + * Update permissions for old node. We're just taking a parent awa= y, so + * we're loosening restrictions. Errors of permission update are n= ot + * fatal in this case, ignore them. + */ + bdrv_refresh_perms(child_bs, NULL); + + /* + * When the parent requiring a non-default AioContext is removed, = the + * node moves back to the main AioContext + */ + bdrv_try_set_aio_context(child_bs, qemu_get_aio_context(), NULL); + } =20 - child_bs =3D child->bs; - bdrv_detach_child(child); bdrv_unref(child_bs); } =20 --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648683863914247.76182724735725; Wed, 30 Mar 2022 16:44:23 -0700 (PDT) Received: from localhost ([::1]:53030 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZhzC-0007fW-8K for importer@patchew.org; Wed, 30 Mar 2022 19:44:22 -0400 Received: from eggs.gnu.org ([209.51.188.92]:34886) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZfsw-00084C-2c for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:46 -0400 Received: from [2a00:1450:4864:20::22f] (port=43581 helo=mail-lj1-x22f.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZfst-0003FB-Gb for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:45 -0400 Received: by mail-lj1-x22f.google.com with SMTP id b43so24945746ljr.10 for ; Wed, 30 Mar 2022 14:29:43 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=l1vUszsfJpNXCu+Eia0kDoKwU3BaZtSMgLTxnae9d9A=; b=x9eWotIkqrpzRREkJUoMC9ACdIxPl5HEBxr4/0E3lRAqETgJtsKwfiysNIoQoaYwUJ 5Nr1rwWvXioqxzMOCJ1SxigkQGHcaaWKf+uOKaJoTuYNA5G/ieZgY0l4sKwlmc2cFAtY 67bpzaanO8TQk6Vk+SpLyR5PSrnmrjydx3ha2Eh6GsIrMmKOXzPFS9NTGZBMKpOeFjeK 77XK8ehAOYrwiyJks+7Xke3tCTGz6j51A28n7iWibmqItDIMxbGTosWpYG5+LJalE/Z/ NkmDvt02RUPxKeIxGgzOjQdFMMIqaPUO7cnSg1FRvXeCljVo8h9H8IrWKSF1YjU+fgsF kKLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=l1vUszsfJpNXCu+Eia0kDoKwU3BaZtSMgLTxnae9d9A=; b=CvS5hHaXnwpNZ9sQQlxhFNKtOVbIEYJwGXCIs18KAL06cO+mOTmRt49YInS3txqh4U OKvI4OtWl/RZ6eFcFeYTgCKAWzrGJCg65yM4KzuFMJKzP41w7o94ZB7JqTpuGbVbcmLI IwZswUjkcXgUyj04qZhAnc4QIcgDFH//hvNMu7PwboF6HCNliPIJFvm1JheClXZefmWT qiXpEVUlbRWUt5ILeBuW8jir3Q3AxY4PaxwU91nuVG9Ir+xrZqeEPdKpTP47yAcV442d wfKswlQHhOgHaTNjBQAgBnlKozv8mNlPcQOzxcrJImG6Pdm9XkfD+YETrSm2ZtEIdO2P JIbg== X-Gm-Message-State: AOAM532K5npSv5WGj1jMF/peY4XACve6yEnd/uI4eqHNWhr3KHlNvdxp PZToOIPa1aZUJQUvuezmZIyEGw== X-Google-Smtp-Source: ABdhPJxwpUGL6nV/KCkziemA/hcDVU4qNsHEdRjJemZDgp/BZX5cEzeMtnlnNK5ASnJ47H9QKgTzAw== X-Received: by 2002:a2e:7c17:0:b0:249:8221:4c2a with SMTP id x23-20020a2e7c17000000b0024982214c2amr8399691ljc.293.1648675781946; Wed, 30 Mar 2022 14:29:41 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 17/45] block: drop bdrv_remove_filter_or_cow_child Date: Thu, 31 Mar 2022 00:28:34 +0300 Message-Id: <20220330212902.590099-18-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::22f (failed) 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=2a00:1450:4864:20::22f; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lj1-x22f.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:24 -0400 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: , Cc: kwolf@redhat.com, hreitz@redhat.com, vsementsov@openvz.org, v.sementsov-og@mail.ru, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648683867066100001 Content-Type: text/plain; charset="utf-8" Drop this simple wrapper used only in one place. We have too many graph modifying functions even without it. Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Hanna Reitz --- block.c | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/block.c b/block.c index 34e89b277f..656e596e0c 100644 --- a/block.c +++ b/block.c @@ -93,8 +93,6 @@ static bool bdrv_recurse_has_child(BlockDriverState *bs, static void bdrv_replace_child_noperm(BdrvChild *child, BlockDriverState *new_bs); static void bdrv_remove_child(BdrvChild *child, Transaction *tran); -static void bdrv_remove_filter_or_cow_child(BlockDriverState *bs, - Transaction *tran); =20 static int bdrv_reopen_prepare(BDRVReopenState *reopen_state, BlockReopenQueue *queue, @@ -5047,17 +5045,6 @@ static void bdrv_remove_child(BdrvChild *child, Tran= saction *tran) tran_add(tran, &bdrv_remove_child_drv, child); } =20 -/* - * A function to remove backing-chain child of @bs if exists: cow child for - * format nodes (always .backing) and filter child for filters (may be .fi= le or - * .backing) - */ -static void bdrv_remove_filter_or_cow_child(BlockDriverState *bs, - Transaction *tran) -{ - bdrv_remove_child(bdrv_filter_or_cow_child(bs), tran); -} - static int bdrv_replace_node_noperm(BlockDriverState *from, BlockDriverState *to, bool auto_skip, Transaction *tran, @@ -5142,7 +5129,7 @@ static int bdrv_replace_node_common(BlockDriverState = *from, } =20 if (detach_subchain) { - bdrv_remove_filter_or_cow_child(to_cow_parent, tran); + bdrv_remove_child(bdrv_filter_or_cow_child(to_cow_parent), tran); } =20 found =3D g_hash_table_new(NULL, NULL); --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648682991459353.27164664646443; Wed, 30 Mar 2022 16:29:51 -0700 (PDT) Received: from localhost ([::1]:51142 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZhl8-0003tY-Fv for importer@patchew.org; Wed, 30 Mar 2022 19:29:50 -0400 Received: from eggs.gnu.org ([209.51.188.92]:35012) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZfsy-000872-An for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:48 -0400 Received: from [2a00:1450:4864:20::232] (port=35571 helo=mail-lj1-x232.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZfsv-0003Fo-PK for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:48 -0400 Received: by mail-lj1-x232.google.com with SMTP id h11so29454291ljb.2 for ; Wed, 30 Mar 2022 14:29:45 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=49dpx2taTirHVyHk8EEtBtzEgW09J1iz4kQavl5fPn4=; b=PHkjwTWSYMVC6kt2GeLqSRNbsYcWc3l7j7/o7b1MT7VVixGquyFE5DqphqiG7PjcGm CMGKZp4zk0WdDv0itY+erjxv6hu8ycJ3UvEvcagB+e2beM+Emf2KTPsP3JY7UxpTxJqy Wv6jmXj18IQAx18T4egInk2laslR87jo/f2qN5VBtFgogAKCDIN3SUZiufGk2CMXK3H/ RmTvdeAFM/HJPv73cuPhVnNrkWkqHuzZKPzFZucCf3pmNH6AHSTuBS7qctcybVsBOCGr vB0EMBN2hYKhBrYcGsCGrFdf1G9rWDB2HHyYvwqpOJpEWP/tkymBqyaP7qUp0kDiRHIe MMfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=49dpx2taTirHVyHk8EEtBtzEgW09J1iz4kQavl5fPn4=; b=ysmuU8foK/zXtN7m5rT453k5NFV1ue4To2a0nNcIsC7697XyOZiD8cE/cevilgYmBp eN2rn085X27s4EX8VM5WDvoZMqbHr2MGFW9VTZtOxbILkmPo/h/VsT+ZnYL7N/8cRTQK NlvBwgpSbc9tj9dfuxWOUKHb2tbfKxXM3tIFXdGSZ/LZLUbczUMW5pbA2lOavZV3u5UN y9YF7o5KTM4aQ8PJRzzJeZ70Ay8nWIKk7kMXfYK45Qn6oy4qGJ4gjbKgrHTEW+A/6jsK 1DX9sn61NH4zlVVbkOLgV+edQj/XHfJO5RpfstV2Ax27xbDN7YGH2YKqyk7ViGEklQ6n DFpg== X-Gm-Message-State: AOAM531OB/1/pQS++QCND6YCN59W10agjU0AT+1Vyeq/MyZlg5xU0GOS Khf6j2dQVK6dM8jk6EYTME4yKg== X-Google-Smtp-Source: ABdhPJyi43JGWaSk9b3LpqEH7zUFuyumO9qd/iKUhsDuvFIMAXqzQn69UI2CMCsqu8w89DRdIxvIjA== X-Received: by 2002:a05:651c:10b4:b0:249:6026:d11c with SMTP id k20-20020a05651c10b400b002496026d11cmr8622327ljn.292.1648675782539; Wed, 30 Mar 2022 14:29:42 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 18/45] block: bdrv_refresh_perms(): allow external tran Date: Thu, 31 Mar 2022 00:28:35 +0300 Message-Id: <20220330212902.590099-19-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::232 (failed) 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=2a00:1450:4864:20::232; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lj1-x232.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:25 -0400 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: , Cc: kwolf@redhat.com, hreitz@redhat.com, vsementsov@openvz.org, v.sementsov-og@mail.ru, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648682993194100003 Content-Type: text/plain; charset="utf-8" Allow passing external Transaction pointer, stop creating extra Transaction objects. Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Hanna Reitz --- block.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/block.c b/block.c index 656e596e0c..f3ed351360 100644 --- a/block.c +++ b/block.c @@ -2557,15 +2557,24 @@ char *bdrv_perm_names(uint64_t perm) } =20 =20 -static int bdrv_refresh_perms(BlockDriverState *bs, Error **errp) +/* @tran is allowed to be NULL. In this case no rollback is possible */ +static int bdrv_refresh_perms(BlockDriverState *bs, Transaction *tran, + Error **errp) { int ret; - Transaction *tran =3D tran_new(); + Transaction *local_tran =3D NULL; g_autoptr(GSList) list =3D bdrv_topological_dfs(NULL, NULL, bs); GLOBAL_STATE_CODE(); =20 + if (!tran) { + tran =3D local_tran =3D tran_new(); + } + ret =3D bdrv_list_refresh_perms(list, NULL, tran, errp); - tran_finalize(tran, ret); + + if (local_tran) { + tran_finalize(local_tran, ret); + } =20 return ret; } @@ -2581,7 +2590,7 @@ int bdrv_child_try_set_perm(BdrvChild *c, uint64_t pe= rm, uint64_t shared, =20 bdrv_child_set_perm(c, perm, shared, tran); =20 - ret =3D bdrv_refresh_perms(c->bs, &local_err); + ret =3D bdrv_refresh_perms(c->bs, tran, &local_err); =20 tran_finalize(tran, ret); =20 @@ -3076,7 +3085,7 @@ BdrvChild *bdrv_root_attach_child(BlockDriverState *c= hild_bs, goto out; } =20 - ret =3D bdrv_refresh_perms(child_bs, errp); + ret =3D bdrv_refresh_perms(child_bs, tran, errp); =20 out: tran_finalize(tran, ret); @@ -3116,7 +3125,7 @@ BdrvChild *bdrv_attach_child(BlockDriverState *parent= _bs, goto out; } =20 - ret =3D bdrv_refresh_perms(parent_bs, errp); + ret =3D bdrv_refresh_perms(parent_bs, tran, errp); if (ret < 0) { goto out; } @@ -3144,7 +3153,7 @@ void bdrv_root_unref_child(BdrvChild *child) * we're loosening restrictions. Errors of permission update are n= ot * fatal in this case, ignore them. */ - bdrv_refresh_perms(child_bs, NULL); + bdrv_refresh_perms(child_bs, NULL, NULL); =20 /* * When the parent requiring a non-default AioContext is removed, = the @@ -3386,7 +3395,7 @@ int bdrv_set_backing_hd(BlockDriverState *bs, BlockDr= iverState *backing_hd, goto out; } =20 - ret =3D bdrv_refresh_perms(bs, errp); + ret =3D bdrv_refresh_perms(bs, tran, errp); out: tran_finalize(tran, ret); =20 @@ -5203,7 +5212,7 @@ int bdrv_append(BlockDriverState *bs_new, BlockDriver= State *bs_top, goto out; } =20 - ret =3D bdrv_refresh_perms(bs_new, errp); + ret =3D bdrv_refresh_perms(bs_new, tran, errp); out: tran_finalize(tran, ret); =20 @@ -6500,7 +6509,7 @@ int bdrv_activate(BlockDriverState *bs, Error **errp) */ if (bs->open_flags & BDRV_O_INACTIVE) { bs->open_flags &=3D ~BDRV_O_INACTIVE; - ret =3D bdrv_refresh_perms(bs, errp); + ret =3D bdrv_refresh_perms(bs, NULL, errp); if (ret < 0) { bs->open_flags |=3D BDRV_O_INACTIVE; return ret; @@ -6645,7 +6654,7 @@ static int bdrv_inactivate_recurse(BlockDriverState *= bs) * We only tried to loosen restrictions, so errors are not fatal, igno= re * them. */ - bdrv_refresh_perms(bs, NULL); + bdrv_refresh_perms(bs, NULL, NULL); =20 /* Recursively inactivate children */ QLIST_FOREACH(child, &bs->children, next) { --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648683011427137.72642342209144; Wed, 30 Mar 2022 16:30:11 -0700 (PDT) Received: from localhost ([::1]:52780 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZhlS-0004zx-Dq for importer@patchew.org; Wed, 30 Mar 2022 19:30:10 -0400 Received: from eggs.gnu.org ([209.51.188.92]:34958) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZfsx-00086D-Es for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:47 -0400 Received: from [2a00:1450:4864:20::135] (port=39804 helo=mail-lf1-x135.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZfsu-0003G4-Pv for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:47 -0400 Received: by mail-lf1-x135.google.com with SMTP id w7so38087793lfd.6 for ; Wed, 30 Mar 2022 14:29:44 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=4ytAks2jG8KKwVV8IC6XjHE92QZLs2fSb+2ALIrCXvU=; b=kmGmIeB8ZrHPWmz6AgT0lNEKGntW5g6PEmMmO+iOCVnrfFjmIzGs2D9uEM5xF6GAYn bN6jwwEcYxK9gcXqhbzimzDFTt96cG4ZwiaszmEVtftnjjevv9mSU3FKH/row1Cb0UrL Vm8tT/ArvOJoVlHBT2qwCFKZFTiN56GMqg0IzdnJyPhOLZn2NDeJX3HbsLGEA5nLnoZl Js96eVfHu2JMELLRq6WZdX0cT7AtUCCRlREooQCpmidETXsEVL0gdW3ZdDs21Jb7ENR/ M5qiqKqCMLmqOZv0lkB1y8aTsoZpT2xJVjNdVI96IJSXsPcHFXHv277bqoUUtSgqfydE 9bXA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=4ytAks2jG8KKwVV8IC6XjHE92QZLs2fSb+2ALIrCXvU=; b=fXMKcjQph6Rx/9k7Ep5XH4F692WhBx54xlGuF7AX0+7UqLXEKkS4Brt3C3UbfJpRoi PYaxWhVjg6gY68Iv2jb9KUYpak5qiBQT4VFuHjvPcw6PxuZK2aKphZbj6IC5GB5WcbOQ yQm1Xd9uhUs3fBeXEEkZcFJfW1367X8OyVd0PqAG8ISeG+jhGB6E7T2QEeix6r31/Snw uznLOtmYVxR8D6DAqFWFKNsNKibAqhfKJ4GZHLezLjPzpBSfc/pYoJsQSN3Gm3tk74+9 6a3WD26QoNShAsVuVD0miB69R0Qrj07boxjvuBZB7Zwf2mrmGPZTRU23mGBc1D5+Dtw7 wHig== X-Gm-Message-State: AOAM532Ws9qtoNZSpXtIlrgiTB/xCLoBlcxbtirrwEX3wvY7tJpnMYQe UAZSGPJjZ0iPlAApP4vCe/3iJw== X-Google-Smtp-Source: ABdhPJwP+o7ZudLLEWosAoWQPakQyrhde941B5Hb61Rib2Jx/YEr5zlEfOUmKgZcfCBKqSGx2LiDmA== X-Received: by 2002:a05:6512:31d5:b0:44a:7a30:d83 with SMTP id j21-20020a05651231d500b0044a7a300d83mr8096362lfe.330.1648675783140; Wed, 30 Mar 2022 14:29:43 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 19/45] block: refactor bdrv_list_refresh_perms to allow any list of nodes Date: Thu, 31 Mar 2022 00:28:36 +0300 Message-Id: <20220330212902.590099-20-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::135 (failed) 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=2a00:1450:4864:20::135; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lf1-x135.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:24 -0400 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: , Cc: kwolf@redhat.com, hreitz@redhat.com, vsementsov@openvz.org, v.sementsov-og@mail.ru, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648683013408100001 Content-Type: text/plain; charset="utf-8" We are going to increase usage of collecting nodes in a list to then update, and calling bdrv_topological_dfs() each time is not convenient, and not correct as we are going to interleave graph modifying with filling the node list. So, let's switch to a function that takes any list of nodes, adds all their subtrees and do topological sort. And finally, refresh permissions. While being here, make the function public, as we'll want to use it from blockdev.c in near future. Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Hanna Reitz --- block.c | 51 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/block.c b/block.c index f3ed351360..9009f73534 100644 --- a/block.c +++ b/block.c @@ -2487,8 +2487,12 @@ static int bdrv_node_refresh_perm(BlockDriverState *= bs, BlockReopenQueue *q, return 0; } =20 -static int bdrv_list_refresh_perms(GSList *list, BlockReopenQueue *q, - Transaction *tran, Error **errp) +/* + * @list is a product of bdrv_topological_dfs() (may be called several tim= es) - + * a topologically sorted subgraph. + */ +static int bdrv_do_refresh_perms(GSList *list, BlockReopenQueue *q, + Transaction *tran, Error **errp) { int ret; BlockDriverState *bs; @@ -2510,6 +2514,24 @@ static int bdrv_list_refresh_perms(GSList *list, Blo= ckReopenQueue *q, return 0; } =20 +/* + * @list is any list of nodes. List is completed by all subtreees and + * topologically sorted. It's not a problem if some node occurs in the @li= st + * several times. + */ +static int bdrv_list_refresh_perms(GSList *list, BlockReopenQueue *q, + Transaction *tran, Error **errp) +{ + g_autoptr(GHashTable) found =3D g_hash_table_new(NULL, NULL); + g_autoptr(GSList) refresh_list =3D NULL; + + for ( ; list; list =3D list->next) { + refresh_list =3D bdrv_topological_dfs(refresh_list, found, list->d= ata); + } + + return bdrv_do_refresh_perms(refresh_list, q, tran, errp); +} + void bdrv_get_cumulative_perm(BlockDriverState *bs, uint64_t *perm, uint64_t *shared_perm) { @@ -2570,7 +2592,7 @@ static int bdrv_refresh_perms(BlockDriverState *bs, T= ransaction *tran, tran =3D local_tran =3D tran_new(); } =20 - ret =3D bdrv_list_refresh_perms(list, NULL, tran, errp); + ret =3D bdrv_do_refresh_perms(list, NULL, tran, errp); =20 if (local_tran) { tran_finalize(local_tran, ret); @@ -4339,7 +4361,6 @@ int bdrv_reopen_multiple(BlockReopenQueue *bs_queue, = Error **errp) BlockReopenQueueEntry *bs_entry, *next; AioContext *ctx; Transaction *tran =3D tran_new(); - g_autoptr(GHashTable) found =3D NULL; g_autoptr(GSList) refresh_list =3D NULL; =20 assert(qemu_get_current_aio_context() =3D=3D qemu_get_aio_context()); @@ -4369,18 +4390,15 @@ int bdrv_reopen_multiple(BlockReopenQueue *bs_queue= , Error **errp) bs_entry->prepared =3D true; } =20 - found =3D g_hash_table_new(NULL, NULL); QTAILQ_FOREACH(bs_entry, bs_queue, entry) { BDRVReopenState *state =3D &bs_entry->state; =20 - refresh_list =3D bdrv_topological_dfs(refresh_list, found, state->= bs); + refresh_list =3D g_slist_prepend(refresh_list, state->bs); if (state->old_backing_bs) { - refresh_list =3D bdrv_topological_dfs(refresh_list, found, - state->old_backing_bs); + refresh_list =3D g_slist_prepend(refresh_list, state->old_back= ing_bs); } if (state->old_file_bs) { - refresh_list =3D bdrv_topological_dfs(refresh_list, found, - state->old_file_bs); + refresh_list =3D g_slist_prepend(refresh_list, state->old_file= _bs); } } =20 @@ -5100,7 +5118,6 @@ static int bdrv_replace_node_common(BlockDriverState = *from, Error **errp) { Transaction *tran =3D tran_new(); - g_autoptr(GHashTable) found =3D NULL; g_autoptr(GSList) refresh_list =3D NULL; BlockDriverState *to_cow_parent =3D NULL; int ret; @@ -5141,10 +5158,8 @@ static int bdrv_replace_node_common(BlockDriverState= *from, bdrv_remove_child(bdrv_filter_or_cow_child(to_cow_parent), tran); } =20 - found =3D g_hash_table_new(NULL, NULL); - - refresh_list =3D bdrv_topological_dfs(refresh_list, found, to); - refresh_list =3D bdrv_topological_dfs(refresh_list, found, from); + refresh_list =3D g_slist_prepend(refresh_list, to); + refresh_list =3D g_slist_prepend(refresh_list, from); =20 ret =3D bdrv_list_refresh_perms(refresh_list, NULL, tran, errp); if (ret < 0) { @@ -5227,7 +5242,6 @@ int bdrv_replace_child_bs(BdrvChild *child, BlockDriv= erState *new_bs, { int ret; Transaction *tran =3D tran_new(); - g_autoptr(GHashTable) found =3D NULL; g_autoptr(GSList) refresh_list =3D NULL; BlockDriverState *old_bs =3D child->bs; =20 @@ -5239,9 +5253,8 @@ int bdrv_replace_child_bs(BdrvChild *child, BlockDriv= erState *new_bs, =20 bdrv_replace_child_tran(child, new_bs, tran); =20 - found =3D g_hash_table_new(NULL, NULL); - refresh_list =3D bdrv_topological_dfs(refresh_list, found, old_bs); - refresh_list =3D bdrv_topological_dfs(refresh_list, found, new_bs); + refresh_list =3D g_slist_prepend(refresh_list, old_bs); + refresh_list =3D g_slist_prepend(refresh_list, new_bs); =20 ret =3D bdrv_list_refresh_perms(refresh_list, NULL, tran, errp); =20 --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648683218627402.80442873658797; Wed, 30 Mar 2022 16:33:38 -0700 (PDT) Received: from localhost ([::1]:32916 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZhon-0002I1-9m for importer@patchew.org; Wed, 30 Mar 2022 19:33:37 -0400 Received: from eggs.gnu.org ([209.51.188.92]:35010) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZfsy-000870-A0 for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:48 -0400 Received: from [2a00:1450:4864:20::230] (port=37708 helo=mail-lj1-x230.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZfsv-0003Gc-Dj for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:48 -0400 Received: by mail-lj1-x230.google.com with SMTP id r22so29480179ljd.4 for ; Wed, 30 Mar 2022 14:29:44 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=USBtfhdisamEP3StAFvJ5Y3uMotND/oftiJcCE6F1NQ=; b=Ba2vLrR5jxSEEfMpe9Q5GfP89Xg/quvd3ufJx01tQhUffufruSVXvrkkQKwAP8G8so Ph+kFQgiZ5z5TUOzWVVyxIfBwvOCce6Hz7cvpyb9Uvjc+0Hd8DqNMGci5TkxuykX0JL8 RgJxwSeLyKSNp7RYiUZdgE2mryXMcx9PHy95Idfda0Af/5l+U4EUi2/EDD+T0l1v9uGq pCTnisZiUDeRnLrKrkRWcjgmNl/2CIypPUjMLz4Z/WZ/nLDuQgZN64w269Ud2elckgou hjubAKUpXiUJG4HL879dhj8GKkS55QX2qcvEnRrJtZpLqwR2xllQJXLUCDGL8imAOwhN PisA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=USBtfhdisamEP3StAFvJ5Y3uMotND/oftiJcCE6F1NQ=; b=WMS6zngqQoWzNybRvipJWH8lRIHRkjSO6vifBM5IUI4bdMmtUvICEkGesmQ0jwAO5N YHhOfhcAJyyieuXW4thOQAOpRZ+qFCzOEUNpPwIKBSJ1oEHHKG7b8ErOdyQ4cyaw+ndB Fip4Ta3emCyAqGRohBFCRpOkyF4/K77qvqakIG9Z3OlrGa1cCQilb3fMI2iYmdENXMD4 9NsWbcbLSiFs8DFOkIacyNIDsCyWJ/CCxh7sE30Bwy1kz6SCGCAkECKZeOPNYhaCoonn sTrVtjLU3Nnyco/pbg2r6mCH7jaHzoxSOl39he+rbOU2tF7BSD951vb8VDsR3JABtJpD BWzQ== X-Gm-Message-State: AOAM530CI0pURIxNZqnwxOcMQObiJ0o4qOvKI5GfEkeJmYQIlGbDsvu4 tT8rcC5A+j3Xu3t000Fl9dRGvp9CZ5Klxw== X-Google-Smtp-Source: ABdhPJz4bFnbTuTgVD7EYdVmD4t27e0dcxdlsPyYktUMrhal9TlUGYXTKYLFRU3NMSv8fn2pGXv67w== X-Received: by 2002:a05:651c:b8b:b0:249:808d:b522 with SMTP id bg11-20020a05651c0b8b00b00249808db522mr8169669ljb.194.1648675783779; Wed, 30 Mar 2022 14:29:43 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 20/45] block: make permission update functions public Date: Thu, 31 Mar 2022 00:28:37 +0300 Message-Id: <20220330212902.590099-21-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::230 (failed) 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=2a00:1450:4864:20::230; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lj1-x230.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:24 -0400 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: , Cc: kwolf@redhat.com, hreitz@redhat.com, vsementsov@openvz.org, v.sementsov-og@mail.ru, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648683219197100001 Content-Type: text/plain; charset="utf-8" We'll need them in further commits in blockdev.c for new transaction block-graph modifying API. Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Hanna Reitz --- block.c | 7 +++---- include/block/block-global-state.h | 4 ++++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/block.c b/block.c index 9009f73534..be19964f89 100644 --- a/block.c +++ b/block.c @@ -2519,8 +2519,8 @@ static int bdrv_do_refresh_perms(GSList *list, BlockR= eopenQueue *q, * topologically sorted. It's not a problem if some node occurs in the @li= st * several times. */ -static int bdrv_list_refresh_perms(GSList *list, BlockReopenQueue *q, - Transaction *tran, Error **errp) +int bdrv_list_refresh_perms(GSList *list, BlockReopenQueue *q, + Transaction *tran, Error **errp) { g_autoptr(GHashTable) found =3D g_hash_table_new(NULL, NULL); g_autoptr(GSList) refresh_list =3D NULL; @@ -2580,8 +2580,7 @@ char *bdrv_perm_names(uint64_t perm) =20 =20 /* @tran is allowed to be NULL. In this case no rollback is possible */ -static int bdrv_refresh_perms(BlockDriverState *bs, Transaction *tran, - Error **errp) +int bdrv_refresh_perms(BlockDriverState *bs, Transaction *tran, Error **er= rp) { int ret; Transaction *local_tran =3D NULL; diff --git a/include/block/block-global-state.h b/include/block/block-globa= l-state.h index 600afcf5bd..c307b48b2a 100644 --- a/include/block/block-global-state.h +++ b/include/block/block-global-state.h @@ -253,4 +253,8 @@ void bdrv_unregister_buf(BlockDriverState *bs, void *ho= st); =20 void bdrv_cancel_in_flight(BlockDriverState *bs); =20 +int bdrv_list_refresh_perms(GSList *list, BlockReopenQueue *q, + Transaction *tran, Error **errp); +int bdrv_refresh_perms(BlockDriverState *bs, Transaction *tran, Error **er= rp); + #endif /* BLOCK_GLOBAL_STATE_H */ --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648683169145448.37168852701666; Wed, 30 Mar 2022 16:32:49 -0700 (PDT) Received: from localhost ([::1]:59498 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZho0-0001AT-4j for importer@patchew.org; Wed, 30 Mar 2022 19:32:48 -0400 Received: from eggs.gnu.org ([209.51.188.92]:35024) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZfsy-000885-Oa for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:48 -0400 Received: from [2a00:1450:4864:20::234] (port=33416 helo=mail-lj1-x234.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZfsw-0003HA-3J for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:48 -0400 Received: by mail-lj1-x234.google.com with SMTP id u3so29518337ljd.0 for ; Wed, 30 Mar 2022 14:29:45 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=3XIynKxv/8mf0mXqZqalwzWUhAmUjNLdugZbjT63J/0=; b=ZAYs33CEL/VzW4iNyekiSF6oISFYdvEwKiZI1YCFifAIsO7xTv6+0qhxJY/TZqti3n S4z+CMzM/E9Y1BVzebwa2WuxHqkydoGHWWwzMl7qp/CavM3U5Yv7Eka+fWVWjxIANP+C +oW1stRazK+6KDQsN64gczjJWcguP1lEf30HeV0fVm9xa3qvw68RTgYLnLY8B8vOSH1u 0fJWAE8rvQvccvbbBi4P6EcPDXo3Y83mRjAIY9UpuQ4gOUngHxbDcvi64A8HYFTtKX+p k+dfv6Jhs3yxZrJAQshRn7fbVUDgbMh8ZPmRu244u/rQQ/e6zozzW8Et0fwziTXtS7XF XH0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=3XIynKxv/8mf0mXqZqalwzWUhAmUjNLdugZbjT63J/0=; b=VFbth0c3YJdAlXNduCYKHyhemc+Lc7VC93+mFEXMjj43UjZercmF3svTGWLsOmLNvQ 7fGdxAm0+N4BAEUpb4NXYd2I5ud4acifHQR/ryRwFLL7r0yEAQdfqGCsRJYU5c5SpEkN 8Kp0v3k2h4/iqbT1gqODqh6vP+FynVHgaCGqDOffT5dwW8tlAJke7/+5Gjk2oXLy8Ppx rkF6aJiCQ6yF4XhG8A/aRG4GlzfvBUNjLSlYv9QBmBXQuyGu7tHgE+xMibUjQqiEh71b /oWQEobZz4+pBIzae/NaLAvlY2lodHy8AiCfy0d4P+8idOW6M95b6URDXgOvdubUUzA2 gPSw== X-Gm-Message-State: AOAM532lmpH6Ub10h7DKUurA+JtoAUQhUeaAQkE/C909+41AuQpG78Ot b9MboR8xE872Uyw3icxsTl4X3w== X-Google-Smtp-Source: ABdhPJyO8r5HGBB2LFr7Zu19Qa+Yl5xvWY5NNTxasx6M5Nia7QV7ms1U8nIeqzXunnlTR1ME/YoqUw== X-Received: by 2002:a2e:7f13:0:b0:247:ef72:9e8b with SMTP id a19-20020a2e7f13000000b00247ef729e8bmr8375799ljd.205.1648675784369; Wed, 30 Mar 2022 14:29:44 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 21/45] block: add bdrv_try_set_aio_context_tran transaction action Date: Thu, 31 Mar 2022 00:28:38 +0300 Message-Id: <20220330212902.590099-22-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::234 (failed) 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=2a00:1450:4864:20::234; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lj1-x234.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:25 -0400 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: , Cc: kwolf@redhat.com, hreitz@redhat.com, vsementsov@openvz.org, v.sementsov-og@mail.ru, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648683170870100001 Content-Type: text/plain; charset="utf-8" To be used in further commit. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/block.c b/block.c index be19964f89..1900cdf277 100644 --- a/block.c +++ b/block.c @@ -2907,6 +2907,54 @@ static void bdrv_child_free(BdrvChild *child) g_free(child); } =20 +typedef struct BdrvTrySetAioContextState { + BlockDriverState *bs; + AioContext *old_ctx; +} BdrvTrySetAioContextState; + +static void bdrv_try_set_aio_context_abort(void *opaque) +{ + BdrvTrySetAioContextState *s =3D opaque; + + if (bdrv_get_aio_context(s->bs) !=3D s->old_ctx) { + bdrv_try_set_aio_context(s->bs, s->old_ctx, &error_abort); + } +} + +static TransactionActionDrv bdrv_try_set_aio_context_drv =3D { + .abort =3D bdrv_try_set_aio_context_abort, + .clean =3D g_free, +}; + +__attribute__((unused)) +static int bdrv_try_set_aio_context_tran(BlockDriverState *bs, + AioContext *new_ctx, + Transaction *tran, + Error **errp) +{ + AioContext *old_ctx =3D bdrv_get_aio_context(bs); + BdrvTrySetAioContextState *s; + int ret; + + if (old_ctx =3D=3D new_ctx) { + return 0; + } + + ret =3D bdrv_try_set_aio_context(bs, new_ctx, errp); + if (ret < 0) { + return ret; + } + + s =3D g_new(BdrvTrySetAioContextState, 1); + *s =3D (BdrvTrySetAioContextState) { + .bs =3D bs, + .old_ctx =3D old_ctx, + }; + tran_add(tran, &bdrv_try_set_aio_context_drv, s); + + return 0; +} + typedef struct BdrvAttachChildCommonState { BdrvChild *child; AioContext *old_parent_ctx; --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648683348109312.65994113352156; Wed, 30 Mar 2022 16:35:48 -0700 (PDT) Received: from localhost ([::1]:39762 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZhqr-0006xN-GM for importer@patchew.org; Wed, 30 Mar 2022 19:35:45 -0400 Received: from eggs.gnu.org ([209.51.188.92]:35120) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZft0-0008BC-Rw for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:50 -0400 Received: from [2a00:1450:4864:20::134] (port=41872 helo=mail-lf1-x134.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZfsw-0003I1-SH for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:50 -0400 Received: by mail-lf1-x134.google.com with SMTP id p15so38078606lfk.8 for ; Wed, 30 Mar 2022 14:29:46 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=wGqfbNupi8VqXOUIArk7Fsz80iuTW3xjydo5dj67Z4s=; b=fFEbG2tocNG2DE2DZ8nSrHFNOm3C8Aw0u85x4HBlxlexDwl8JshKnyY+Dt15axZGUU 9gRtUMY6Wwg1r58NwEdpBKC/V1ieGwITsvTLm4FL+721xWHo4GxQ69os4n1dDLXM0FZG Goblg8r1VI55n/QFLaRF3Fip1J0h+/IVMr8XgRm8ZheV99L/KsfVv/HzKZlZH5gySox7 FufRQMMjclOexz4JZiuHbVwcLxbSaLChT2Qb6gLWfADiOgN6pZafAjEC1337bXVaf8o7 eTxwpjO1pRNrdfMDcEOCerAhBA/GiAcyNCXD4NOxDzLXkNRoTkU7L1LIGgDZaDTD450e cJuA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=wGqfbNupi8VqXOUIArk7Fsz80iuTW3xjydo5dj67Z4s=; b=oKkqZYEDRAjvAhiUXgHdOEj6vWksVRo5nULnveROCZseX6T914VvHTRuIp1Mo9gJbA HmYOrONyCBrKjF9QMu7Sl8FABraICaGS+Oo1uTMcE8FUqyxuMyamkoUqBX9/C0udUZRg VxJeZeCRsxkt8pw8IM7PeIyZvxCQxH7rPQ0mAdbzGhGul1uPeVMb0cQgQGzMGJTaXHRW 1RMxfIJmRLwVguvmV4lj8PxmtlgXJX4tJXLuwLdzFwKy2kV2n6/BOKnYFUFs8NTqXypx jdvsCSPoXk8XrHBlsvQsx5xj7R2DXcsUgvMCeZVK4wRn3CJ1oPYYThA18a4+h0XShzfa ObkQ== X-Gm-Message-State: AOAM530u5jzs3NGbktGoO0kHvpcXDNCqiVP4/lifnlUSRHHVCkk8qelL 5gUrEndpvlTfbXXX/MH3UmQmqA== X-Google-Smtp-Source: ABdhPJzLLBEGKVlFXTeMzHI4VqhCKR6en9xFyrqDwlYpS5gTHL2bE8pyl2hY8kHRQJRGsC8EXqtasg== X-Received: by 2002:a05:6512:a89:b0:44a:3936:3a22 with SMTP id m9-20020a0565120a8900b0044a39363a22mr8411377lfu.364.1648675785021; Wed, 30 Mar 2022 14:29:45 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 22/45] block: implemet bdrv_unref_tran() Date: Thu, 31 Mar 2022 00:28:39 +0300 Message-Id: <20220330212902.590099-23-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::134 (failed) 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=2a00:1450:4864:20::134; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lf1-x134.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:25 -0400 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: , Cc: kwolf@redhat.com, hreitz@redhat.com, vsementsov@openvz.org, v.sementsov-og@mail.ru, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648683350001100001 Content-Type: text/plain; charset="utf-8" Now nodes are removed during block-graph update transactions now? Look at bdrv_replace_child_tran: bdrv_unref() is simply postponed to commit phase. What is the problem with it? We want to make copy-before-write permissions strict: it should unshare write always, not only when it has at least one parent. But if so, we can't neither insert the filter nor remove it: To insert the filter, we should first do blockdev-add, and filter will unshare write on the child, so, blockdev-add will fail if disk is in use by guest. To remove the filter, we should first do a replace operations, which again leads to situation when the filter and old parent share one child, and all parent want write permission when the filter unshare it. The solution is first do both graph-modifying operations (add & replace, or replace & remove) and only then update permissions. But that is not possible with current method to transactionally remove the block node: if we just postpone bdrv_unref() to commit phase, than on prepare phase the node is not removed, and it still keep all permissions on its children. What to do? In general, I don't know. But it's possible to solve the problem for the block drivers that doesn't need access to their children on .bdrv_close(). For such drivers we can detach their children on prepare stage (still, postponing bdrv_close() call to commit phase). For this to work we of course should effectively reduce bs->refcnt on prepare phase as well. So, the logic of new bdrv_unref_tran() is: prepare: decrease refcnt and detach children if possible (and if refcnt is 0) commit: do bdrv_delete() if refcnt is 0 abort: restore children and refcnt What's the difficulty with it? If we want to transactionally (and with no permission change) remove nodes, we should understand that some nodes may be removed recursively, and finally we get several possible not deleted leaves, where permissions should be updated. How caller will know what to update? That leads to additional transaction-wide refresh_list variable, which is filled by various graph modifying function. So, user should declare referesh_list variable and do one or several block-graph modifying operations (that may probably remove some nodes), then user call bdrv_list_refresh_perms on resulting refresh_list. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block.c | 225 +++++++++++++++++++---------- include/block/block-common.h | 2 - include/block/block-global-state.h | 2 + include/block/block_int-common.h | 7 + 4 files changed, 156 insertions(+), 80 deletions(-) diff --git a/block.c b/block.c index 1900cdf277..a7020d3cd8 100644 --- a/block.c +++ b/block.c @@ -92,10 +92,12 @@ static bool bdrv_recurse_has_child(BlockDriverState *bs, =20 static void bdrv_replace_child_noperm(BdrvChild *child, BlockDriverState *new_bs); -static void bdrv_remove_child(BdrvChild *child, Transaction *tran); +static void bdrv_remove_child(BdrvChild *child, GSList **refresh_list, + Transaction *tran); =20 static int bdrv_reopen_prepare(BDRVReopenState *reopen_state, BlockReopenQueue *queue, + GSList **refresh_list, Transaction *change_child_tran, Error **err= p); static void bdrv_reopen_commit(BDRVReopenState *reopen_state); static void bdrv_reopen_abort(BDRVReopenState *reopen_state); @@ -2363,40 +2365,24 @@ typedef struct BdrvReplaceChildState { BlockDriverState *old_bs; } BdrvReplaceChildState; =20 -static void bdrv_replace_child_commit(void *opaque) -{ - BdrvReplaceChildState *s =3D opaque; - GLOBAL_STATE_CODE(); - - bdrv_unref(s->old_bs); -} - static void bdrv_replace_child_abort(void *opaque) { BdrvReplaceChildState *s =3D opaque; BlockDriverState *new_bs =3D s->child->bs; =20 GLOBAL_STATE_CODE(); - /* old_bs reference is transparently moved from @s to @s->child */ bdrv_replace_child_noperm(s->child, s->old_bs); bdrv_unref(new_bs); } =20 static TransactionActionDrv bdrv_replace_child_drv =3D { - .commit =3D bdrv_replace_child_commit, .abort =3D bdrv_replace_child_abort, .clean =3D g_free, }; =20 -/* - * bdrv_replace_child_tran - * - * Note: real unref of old_bs is done only on commit. - * - * The function doesn't update permissions, caller is responsible for this. - */ +/* Caller is responsible to refresh permissions in @refresh_list */ static void bdrv_replace_child_tran(BdrvChild *child, BlockDriverState *ne= w_bs, - Transaction *tran) + GSList **refresh_list, Transaction *tr= an) { BdrvReplaceChildState *s =3D g_new(BdrvReplaceChildState, 1); *s =3D (BdrvReplaceChildState) { @@ -2407,9 +2393,15 @@ static void bdrv_replace_child_tran(BdrvChild *child= , BlockDriverState *new_bs, =20 if (new_bs) { bdrv_ref(new_bs); + *refresh_list =3D g_slist_prepend(*refresh_list, new_bs); } bdrv_replace_child_noperm(child, new_bs); - /* old_bs reference is transparently moved from @child to @s */ + if (s->old_bs) { + bdrv_unref_tran(s->old_bs, refresh_list, tran); + if (s->old_bs->refcnt > 0) { + *refresh_list =3D g_slist_prepend(*refresh_list, s->old_bs); + } + } } =20 /* @@ -2926,7 +2918,6 @@ static TransactionActionDrv bdrv_try_set_aio_context_= drv =3D { .clean =3D g_free, }; =20 -__attribute__((unused)) static int bdrv_try_set_aio_context_tran(BlockDriverState *bs, AioContext *new_ctx, Transaction *tran, @@ -3207,31 +3198,41 @@ out: return ret < 0 ? NULL : child; } =20 -/* Callers must ensure that child->frozen is false. */ -void bdrv_root_unref_child(BdrvChild *child) +/* Caller is responsible to refresh permissions in @refresh_list */ +static void bdrv_root_unref_child_tran(BdrvChild *child, GSList **refresh_= list, + Transaction *tran) { BlockDriverState *child_bs =3D child->bs; =20 GLOBAL_STATE_CODE(); - bdrv_replace_child_noperm(child, NULL); - bdrv_child_free(child); - - if (child_bs) { - /* - * Update permissions for old node. We're just taking a parent awa= y, so - * we're loosening restrictions. Errors of permission update are n= ot - * fatal in this case, ignore them. - */ - bdrv_refresh_perms(child_bs, NULL, NULL); + bdrv_remove_child(child, refresh_list, tran); =20 + if (child_bs && child_bs->refcnt > 0) { /* * When the parent requiring a non-default AioContext is removed, = the * node moves back to the main AioContext */ - bdrv_try_set_aio_context(child_bs, qemu_get_aio_context(), NULL); + bdrv_try_set_aio_context_tran(child_bs, qemu_get_aio_context(), + tran, NULL); } +} =20 - bdrv_unref(child_bs); +/* Callers must ensure that child->frozen is false. */ +void bdrv_root_unref_child(BdrvChild *child) +{ + Transaction *tran =3D tran_new(); + g_autoptr(GSList) refresh_list =3D NULL; + + bdrv_root_unref_child_tran(child, &refresh_list, tran); + + /* + * Update permissions for old node. We're just taking a parent away, so + * we're loosening restrictions. Errors of permission update are not + * fatal in this case, ignore them. + */ + bdrv_list_refresh_perms(refresh_list, NULL, tran, NULL); + + tran_commit(tran); } =20 typedef struct BdrvSetInheritsFrom { @@ -3300,16 +3301,28 @@ static void bdrv_unset_inherits_from(BlockDriverSta= te *root, BdrvChild *child, } } =20 -/* Callers must ensure that child->frozen is false. */ -void bdrv_unref_child(BlockDriverState *parent, BdrvChild *child) +/* Caller is responsible to refresh permissions in @refresh_list */ +static void bdrv_unref_child_tran(BlockDriverState *parent, BdrvChild *chi= ld, + GSList **refresh_list, Transaction *tr= an) { GLOBAL_STATE_CODE(); if (child =3D=3D NULL) { return; } =20 - bdrv_unset_inherits_from(parent, child, NULL); - bdrv_root_unref_child(child); + bdrv_unset_inherits_from(parent, child, tran); + bdrv_root_unref_child_tran(child, refresh_list, tran); +} + +/* Callers must ensure that child->frozen is false. */ +void bdrv_unref_child(BlockDriverState *parent, BdrvChild *child) +{ + Transaction *tran =3D tran_new(); + g_autoptr(GSList) refresh_list =3D NULL; + + bdrv_unref_child_tran(parent, child, &refresh_list, tran); + bdrv_list_refresh_perms(refresh_list, NULL, tran, NULL); + tran_commit(tran); } =20 =20 @@ -3354,11 +3367,12 @@ static BdrvChildRole bdrv_backing_role(BlockDriverS= tate *bs) * Sets the bs->backing or bs->file link of a BDS. A new reference is crea= ted; * callers which don't need their own reference any more must call bdrv_un= ref(). * - * Function doesn't update permissions, caller is responsible for this. + * Caller is responsible to refresh permissions in @refresh_list. */ static int bdrv_set_file_or_backing_noperm(BlockDriverState *parent_bs, BlockDriverState *child_bs, bool is_backing, + GSList **refresh_list, Transaction *tran, Error **errp) { int ret =3D 0; @@ -3412,13 +3426,15 @@ static int bdrv_set_file_or_backing_noperm(BlockDri= verState *parent_bs, =20 if (child) { bdrv_unset_inherits_from(parent_bs, child, tran); - bdrv_remove_child(child, tran); + bdrv_remove_child(child, refresh_list, tran); } =20 if (!child_bs) { goto out; } =20 + *refresh_list =3D g_slist_prepend(*refresh_list, parent_bs); + ret =3D bdrv_attach_child_noperm(parent_bs, child_bs, is_backing ? "backing" : "file", &child_of_bds, role, @@ -3442,12 +3458,15 @@ out: return 0; } =20 +/* Caller is responsible to refresh permissions in @refresh_list */ static int bdrv_set_backing_noperm(BlockDriverState *bs, BlockDriverState *backing_hd, + GSList **refresh_list, Transaction *tran, Error **errp) { GLOBAL_STATE_CODE(); - return bdrv_set_file_or_backing_noperm(bs, backing_hd, true, tran, err= p); + return bdrv_set_file_or_backing_noperm(bs, backing_hd, true, refresh_l= ist, + tran, errp); } =20 int bdrv_set_backing_hd(BlockDriverState *bs, BlockDriverState *backing_hd, @@ -3455,16 +3474,17 @@ int bdrv_set_backing_hd(BlockDriverState *bs, Block= DriverState *backing_hd, { int ret; Transaction *tran =3D tran_new(); + g_autoptr(GSList) refresh_list =3D NULL; =20 GLOBAL_STATE_CODE(); bdrv_drained_begin(bs); =20 - ret =3D bdrv_set_backing_noperm(bs, backing_hd, tran, errp); + ret =3D bdrv_set_backing_noperm(bs, backing_hd, &refresh_list, tran, e= rrp); if (ret < 0) { goto out; } =20 - ret =3D bdrv_refresh_perms(bs, tran, errp); + ret =3D bdrv_list_refresh_perms(refresh_list, NULL, tran, errp); out: tran_finalize(tran, ret); =20 @@ -4429,7 +4449,8 @@ int bdrv_reopen_multiple(BlockReopenQueue *bs_queue, = Error **errp) assert(bs_entry->state.bs->quiesce_counter > 0); ctx =3D bdrv_get_aio_context(bs_entry->state.bs); aio_context_acquire(ctx); - ret =3D bdrv_reopen_prepare(&bs_entry->state, bs_queue, tran, errp= ); + ret =3D bdrv_reopen_prepare(&bs_entry->state, bs_queue, &refresh_l= ist, + tran, errp); aio_context_release(ctx); if (ret < 0) { goto abort; @@ -4441,14 +4462,7 @@ int bdrv_reopen_multiple(BlockReopenQueue *bs_queue,= Error **errp) BDRVReopenState *state =3D &bs_entry->state; =20 refresh_list =3D g_slist_prepend(refresh_list, state->bs); - if (state->old_backing_bs) { - refresh_list =3D g_slist_prepend(refresh_list, state->old_back= ing_bs); - } - if (state->old_file_bs) { - refresh_list =3D g_slist_prepend(refresh_list, state->old_file= _bs); - } } - /* * Note that file-posix driver rely on permission update done during r= eopen * (even if no permission changed), because it wants "new" permissions= for @@ -4561,10 +4575,14 @@ int bdrv_reopen_set_read_only(BlockDriverState *bs,= bool read_only, * true and reopen_state->new_backing_bs contains a pointer to the new * backing BlockDriverState (or NULL). * + * Caller is responsible to refresh permissions in @refresh_list. + * * Return 0 on success, otherwise return < 0 and set @errp. */ static int bdrv_reopen_parse_file_or_backing(BDRVReopenState *reopen_state, - bool is_backing, Transaction = *tran, + bool is_backing, + GSList **refresh_list, + Transaction *tran, Error **errp) { BlockDriverState *bs =3D reopen_state->bs; @@ -4632,14 +4650,8 @@ static int bdrv_reopen_parse_file_or_backing(BDRVReo= penState *reopen_state, return -EINVAL; } =20 - if (is_backing) { - reopen_state->old_backing_bs =3D old_child_bs; - } else { - reopen_state->old_file_bs =3D old_child_bs; - } - return bdrv_set_file_or_backing_noperm(bs, new_child_bs, is_backing, - tran, errp); + refresh_list, tran, errp); } =20 /* @@ -4651,6 +4663,8 @@ static int bdrv_reopen_parse_file_or_backing(BDRVReop= enState *reopen_state, * flags are the new open flags * queue is the reopen queue * + * Caller is responsible to refresh permissions in @refresh_list. + * * Returns 0 on success, non-zero on error. On error errp will be set * as well. * @@ -4661,6 +4675,7 @@ static int bdrv_reopen_parse_file_or_backing(BDRVReop= enState *reopen_state, */ static int bdrv_reopen_prepare(BDRVReopenState *reopen_state, BlockReopenQueue *queue, + GSList **refresh_list, Transaction *change_child_tran, Error **err= p) { int ret =3D -1; @@ -4782,7 +4797,7 @@ static int bdrv_reopen_prepare(BDRVReopenState *reope= n_state, * either a reference to an existing node (using its node name) * or NULL to simply detach the current backing file. */ - ret =3D bdrv_reopen_parse_file_or_backing(reopen_state, true, + ret =3D bdrv_reopen_parse_file_or_backing(reopen_state, true, refresh_= list, change_child_tran, errp); if (ret < 0) { goto error; @@ -4790,7 +4805,7 @@ static int bdrv_reopen_prepare(BDRVReopenState *reope= n_state, qdict_del(reopen_state->options, "backing"); =20 /* Allow changing the 'file' option. In this case NULL is not allowed = */ - ret =3D bdrv_reopen_parse_file_or_backing(reopen_state, false, + ret =3D bdrv_reopen_parse_file_or_backing(reopen_state, false, refresh= _list, change_child_tran, errp); if (ret < 0) { goto error; @@ -5104,24 +5119,28 @@ static TransactionActionDrv bdrv_remove_child_drv = =3D { =20 /* * A function to remove backing or file child of @bs. - * Function doesn't update permissions, caller is responsible for this. + * Caller is responsible to refresh permissions in @refresh_list. */ -static void bdrv_remove_child(BdrvChild *child, Transaction *tran) +static void bdrv_remove_child(BdrvChild *child, GSList **refresh_list, + Transaction *tran) { if (!child) { return; } =20 if (child->bs) { - bdrv_replace_child_tran(child, NULL, tran); + bdrv_replace_child_tran(child, NULL, refresh_list, tran); } =20 tran_add(tran, &bdrv_remove_child_drv, child); } =20 +/* Caller is responsible to refresh permissions in @refresh_list */ static int bdrv_replace_node_noperm(BlockDriverState *from, BlockDriverState *to, - bool auto_skip, Transaction *tran, + bool auto_skip, + GSList **refresh_list, + Transaction *tran, Error **errp) { BdrvChild *c, *next; @@ -5143,7 +5162,7 @@ static int bdrv_replace_node_noperm(BlockDriverState = *from, c->name, from->node_name); return -EPERM; } - bdrv_replace_child_tran(c, to, tran); + bdrv_replace_child_tran(c, to, refresh_list, tran); } =20 return 0; @@ -5196,18 +5215,17 @@ static int bdrv_replace_node_common(BlockDriverStat= e *from, * permissions based on new graph. If we fail, we'll roll-back the * replacement. */ - ret =3D bdrv_replace_node_noperm(from, to, auto_skip, tran, errp); + ret =3D bdrv_replace_node_noperm(from, to, auto_skip, &refresh_list, t= ran, + errp); if (ret < 0) { goto out; } =20 if (detach_subchain) { - bdrv_remove_child(bdrv_filter_or_cow_child(to_cow_parent), tran); + bdrv_remove_child(bdrv_filter_or_cow_child(to_cow_parent), + &refresh_list, tran); } =20 - refresh_list =3D g_slist_prepend(refresh_list, to); - refresh_list =3D g_slist_prepend(refresh_list, from); - ret =3D bdrv_list_refresh_perms(refresh_list, NULL, tran, errp); if (ret < 0) { goto out; @@ -5257,6 +5275,7 @@ int bdrv_append(BlockDriverState *bs_new, BlockDriver= State *bs_top, { int ret; Transaction *tran =3D tran_new(); + g_autoptr(GSList) refresh_list =3D NULL; =20 GLOBAL_STATE_CODE(); =20 @@ -5269,12 +5288,13 @@ int bdrv_append(BlockDriverState *bs_new, BlockDriv= erState *bs_top, goto out; } =20 - ret =3D bdrv_replace_node_noperm(bs_top, bs_new, true, tran, errp); + ret =3D bdrv_replace_node_noperm(bs_top, bs_new, true, &refresh_list, = tran, + errp); if (ret < 0) { goto out; } =20 - ret =3D bdrv_refresh_perms(bs_new, tran, errp); + ret =3D bdrv_list_refresh_perms(refresh_list, NULL, tran, errp); out: tran_finalize(tran, ret); =20 @@ -5298,10 +5318,7 @@ int bdrv_replace_child_bs(BdrvChild *child, BlockDri= verState *new_bs, bdrv_drained_begin(old_bs); bdrv_drained_begin(new_bs); =20 - bdrv_replace_child_tran(child, new_bs, tran); - - refresh_list =3D g_slist_prepend(refresh_list, old_bs); - refresh_list =3D g_slist_prepend(refresh_list, new_bs); + bdrv_replace_child_tran(child, new_bs, &refresh_list, tran); =20 ret =3D bdrv_list_refresh_perms(refresh_list, NULL, tran, errp); =20 @@ -6830,6 +6847,58 @@ void bdrv_ref(BlockDriverState *bs) bs->refcnt++; } =20 +static void bdrv_unref_commit(void *opaque) +{ + BlockDriverState *bs =3D opaque; + + if (bs->refcnt =3D=3D 0) { + bdrv_delete(bs); + } +} + +static void bdrv_unref_abort(void *opaque) +{ + bdrv_ref(opaque); +} + +static TransactionActionDrv bdrv_unref_drv =3D { + .commit =3D bdrv_unref_commit, + .abort =3D bdrv_unref_abort, +}; + +/* + * Transactional unref + * - deletion is postponed to transaction commit + * - where possible children are detached now, and permissions are not + * updated. @refresh_list is filled with nodes, to call + * bdrv_nodes_refresh_perms() on. + */ +void bdrv_unref_tran(BlockDriverState *bs, GSList **refresh_list, + Transaction *tran) +{ + BdrvChild *child, *next; + + if (!bs) { + return; + } + + assert(bs->refcnt > 0); + bs->refcnt--; + + tran_add(tran, &bdrv_unref_drv, bs); + + if (bs->drv && (!bs->drv->bdrv_close || bs->drv->independent_close) && + refresh_list && bs->refcnt =3D=3D 0) + { + QLIST_FOREACH_SAFE(child, &bs->children, next, next) { + if (child->bs && child->bs->refcnt > 1) { + *refresh_list =3D g_slist_prepend(*refresh_list, child->bs= ); + } + bdrv_unref_child_tran(bs, child, refresh_list, tran); + } + } +} + /* Release a previously grabbed reference to bs. * If after releasing, reference count is zero, the BlockDriverState is * deleted. */ diff --git a/include/block/block-common.h b/include/block/block-common.h index 2687a2519c..2f247dd607 100644 --- a/include/block/block-common.h +++ b/include/block/block-common.h @@ -230,8 +230,6 @@ typedef struct BDRVReopenState { int flags; BlockdevDetectZeroesOptions detect_zeroes; bool backing_missing; - BlockDriverState *old_backing_bs; /* keep pointer for permissions upda= te */ - BlockDriverState *old_file_bs; /* keep pointer for permissions update = */ QDict *options; QDict *explicit_options; void *opaque; diff --git a/include/block/block-global-state.h b/include/block/block-globa= l-state.h index c307b48b2a..f3ec72810e 100644 --- a/include/block/block-global-state.h +++ b/include/block/block-global-state.h @@ -186,6 +186,8 @@ void bdrv_img_create(const char *filename, const char *= fmt, =20 void bdrv_ref(BlockDriverState *bs); void bdrv_unref(BlockDriverState *bs); +void bdrv_unref_tran(BlockDriverState *bs, GSList **refresh_list, + Transaction *tran); void bdrv_unref_child(BlockDriverState *parent, BdrvChild *child); BdrvChild *bdrv_attach_child(BlockDriverState *parent_bs, BlockDriverState *child_bs, diff --git a/include/block/block_int-common.h b/include/block/block_int-com= mon.h index c4d8b11dbb..6713c58934 100644 --- a/include/block/block_int-common.h +++ b/include/block/block_int-common.h @@ -162,6 +162,13 @@ struct BlockDriver { */ bool supports_backing; =20 + /* + * If true that guarantees that .bdrv_close doesn't access any bdrv ch= ildren + * and is safe to be called in commit phase of block-graph modifying + * transaction. + */ + bool independent_close; + bool has_variable_length; =20 /* --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648683367804458.9754913863686; Wed, 30 Mar 2022 16:36:07 -0700 (PDT) Received: from localhost ([::1]:40450 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZhrC-0007RK-PZ for importer@patchew.org; Wed, 30 Mar 2022 19:36:06 -0400 Received: from eggs.gnu.org ([209.51.188.92]:35196) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZft2-0008EN-SG for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:52 -0400 Received: from [2a00:1450:4864:20::12f] (port=45712 helo=mail-lf1-x12f.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZfsx-0003Id-SH for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:52 -0400 Received: by mail-lf1-x12f.google.com with SMTP id p10so32198708lfa.12 for ; Wed, 30 Mar 2022 14:29:47 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=V3zVWtnSbfEQDf4mAVtp7QuqE7eSPs6FQqv0UUoXNs4=; b=ErdsJrIBKNbiTTrmsKGlMNmLbzlzPS+ivgx7thVeGZ4qiVlKjpisuiRMBSrnIh0vsh ZQD0M0DidGUpmiQzb3xSDMMcZlFAeNG8SBHV4wKFM6iC6DZYBbRUVYc1xjV5WYYugObp QmWZ6WhgqHLXYDX5CLnQA0QBZF5Tpw8AwjDOKQPlTpUxq06PEBD33eQsaclMCSoSWNrh SVeknYoWYsXDmu73G+6+U2kruYbMuWkawU9mys31ZgwdryWs/RuUkXoal2rGF1NDntMs F3Uzey/tb8tvBE8NUA+dB3iuLzTXNoa1LEHAuopewuiwHrVxStqOJIu/sbbOVQx+quQy i4Vg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=V3zVWtnSbfEQDf4mAVtp7QuqE7eSPs6FQqv0UUoXNs4=; b=Buy1Uft/A+x/iULYiScOQ9CAFNs+UW1uLZfQQhp4c2pBSPuaKauyYE+ClX0R7pae0C CoAk/7uDEbJnm8cPMPjkrURLWEGfOEy/13WF7ospjEpTw2v157wpOZWjvQ5DbQCGvz2s 2qsEVgArqh4w5W7Y5kZbToFmIbwQgRvvsjUq5VXmCvFb+W05JuQ7//gBwNqTQorudpTz iFeu/JqxVr1ueD4BaHvNivtcu1S9tY4s+cNEuLTuDipmAyZ/TFwLhiidf2dc3Uap5pAC dnLxSYkXxEqbvNejD76TpRy67JOSLUOAUk5H8k5ijlJMHKgfrqnhdjgDX4U+lhwu1gQH XBjA== X-Gm-Message-State: AOAM530AsPTh+Q6xzmO6J2yrQhojJ0TEJZInZX6oTi274OO/Ysjgg0Zz exHclGPvoV2ReqT1rYoN7SGuew== X-Google-Smtp-Source: ABdhPJxpMl8GkjM0Rg9MZLyh9/zoj6Qyxti8PSdeE9xyrOWdJlv9w193ER8CQFTOy8NpIgeYE4FDZA== X-Received: by 2002:a05:6512:1082:b0:44a:a6be:90b with SMTP id j2-20020a056512108200b0044aa6be090bmr8451923lfg.45.1648675785686; Wed, 30 Mar 2022 14:29:45 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 23/45] blockdev: refactor transaction to use Transaction API Date: Thu, 31 Mar 2022 00:28:40 +0300 Message-Id: <20220330212902.590099-24-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::12f (failed) 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=2a00:1450:4864:20::12f; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lf1-x12f.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:26 -0400 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: , Cc: kwolf@redhat.com, v.sementsov-og@mail.ru, qemu-devel@nongnu.org, Markus Armbruster , hreitz@redhat.com, vsementsov@openvz.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648683370146100001 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 | 317 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 186 insertions(+), 131 deletions(-) diff --git a/blockdev.c b/blockdev.c index e46e831212..a9fb5f66b0 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); + InternalSnapshotState *state =3D opaque; AioContext *aio_context; =20 if (!state->bs) { @@ -1396,6 +1399,8 @@ static void internal_snapshot_clean(BlkActionState *c= ommon) bdrv_drained_end(state->bs); =20 aio_context_release(aio_context); + + g_free(state); } =20 /* external snapshot private data */ @@ -1406,8 +1411,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 +1440,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) { @@ -1575,10 +1591,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); @@ -1594,10 +1609,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; @@ -1637,10 +1651,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); + ExternalSnapshotState *state =3D opaque; AioContext *aio_context; =20 if (!state->old_bs) { @@ -1654,6 +1667,8 @@ static void external_snapshot_clean(BlkActionState *c= ommon) bdrv_unref(state->new_bs); =20 aio_context_release(aio_context); + + g_free(state); } =20 typedef struct DriveBackupState { @@ -1668,7 +1683,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; @@ -1684,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 @@ -1814,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); @@ -1828,9 +1855,9 @@ static void drive_backup_commit(BlkActionState *commo= n) 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) { AioContext *aio_context; @@ -1844,9 +1871,9 @@ static void drive_backup_abort(BlkActionState *common) } } =20 -static void drive_backup_clean(BlkActionState *common) +static void drive_backup_clean(void *opaque) { - DriveBackupState *state =3D DO_UPCAST(DriveBackupState, common, common= ); + DriveBackupState *state =3D opaque; AioContext *aio_context; =20 if (!state->bs) { @@ -1859,6 +1886,8 @@ static void drive_backup_clean(BlkActionState *common) bdrv_drained_end(state->bs); =20 aio_context_release(aio_context); + + g_free(state); } =20 typedef struct BlockdevBackupState { @@ -1867,7 +1896,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; @@ -1877,6 +1916,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 @@ -1915,9 +1956,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); @@ -1929,9 +1970,9 @@ static void blockdev_backup_commit(BlkActionState *co= mmon) 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) { AioContext *aio_context; @@ -1945,9 +1986,9 @@ static void blockdev_backup_abort(BlkActionState *com= mon) } } =20 -static void blockdev_backup_clean(BlkActionState *common) +static void blockdev_backup_clean(void *opaque) { - BlockdevBackupState *state =3D DO_UPCAST(BlockdevBackupState, common, = common); + BlockdevBackupState *state =3D opaque; AioContext *aio_context; =20 if (!state->bs) { @@ -1960,6 +2001,8 @@ static void blockdev_backup_clean(BlkActionState *com= mon) bdrv_drained_end(state->bs); =20 aio_context_release(aio_context); + + g_free(state); } =20 typedef struct BlockDirtyBitmapState { @@ -1971,14 +2014,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; } @@ -1998,13 +2049,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. */ @@ -2013,13 +2063,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; } @@ -2040,31 +2100,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; } @@ -2086,23 +2152,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; } @@ -2124,23 +2197,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; } @@ -2152,13 +2232,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; } @@ -2173,10 +2263,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); @@ -2184,21 +2273,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 */ } @@ -2206,75 +2302,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, @@ -2316,14 +2388,11 @@ void qmp_transaction(TransactionActionList *dev_lis= t, { TransactionActionList *dev_entry =3D dev_list; 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. */ @@ -2339,6 +2408,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; @@ -2353,38 +2423,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.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648684266984766.6788904167553; Wed, 30 Mar 2022 16:51:06 -0700 (PDT) Received: from localhost ([::1]:33222 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZi5h-00052H-T1 for importer@patchew.org; Wed, 30 Mar 2022 19:51:05 -0400 Received: from eggs.gnu.org ([209.51.188.92]:35128) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZft1-0008Bd-7o for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:51 -0400 Received: from [2a00:1450:4864:20::134] (port=34619 helo=mail-lf1-x134.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZfsx-0003Ix-T9 for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:50 -0400 Received: by mail-lf1-x134.google.com with SMTP id 5so38080456lfp.1 for ; Wed, 30 Mar 2022 14:29:47 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=u7zB7QUDy8zFQ7N01182b7cuntUFhcoVxwhc/wsEz7s=; b=shLxkt+jInBMg8CWiy2Lg1nstOtGi43ZBFBEtnskImzKgiJ99fNhb+KzYSZCNoDT8Z zy2QFFfZEd4dFATzYbgVsnmtMNdduXhFAPvOnTUs3v3aFhXfn0l33fn4/sbNwnd0PSTx RBrSuC3RMxcRRz1RZ4Hxh1RdSCEHLb4f0aPcuiZ7YGZnjEZsn+HShcuNbG2xV1HQBK9e 2jj1yKTKt/W0tYIBNnyT27x9zeCVS7Da76c7l4LeD8HT5s1lsR5MO5JDWOaTExwT8w27 FpZap6afj+ggtxAc6dZArcz+KgMEzbwLFdpEAVnIakH6Wsq32h6EfyKk0mtJEoSDLFxC jg/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=u7zB7QUDy8zFQ7N01182b7cuntUFhcoVxwhc/wsEz7s=; b=4LxUZKm515o+xAdYQA4KMUeL+qx2WPGZ7v/dguC882q10nTqaP12g1VSKHgRdistL/ jlypnYQqnSfGNZyJ7zpD/f3O/wa0+Gn97rBawS+NpbNfwZfaGwba+wi6H+qtTDjl+orH yQHRLn4z9MkqV9FKPbOJr7KQWe9o+PNsjWqv5Z7ztPkRK9t5iLbhHT5CokmtjFMB58Ex dvlLAVSYl6PACCYsQ0Cse8u6wTIicVp1sbu7QcXhPWopPxl6k84SsCcMUNIp+9GNN/pP UiGaNUbpi3XDrgXZnSKBTbeFFvzZ2RBcvmU4xrv5p6O+KbLNA5Vv0jrRZPlXfqbgPSl7 aSPQ== X-Gm-Message-State: AOAM532Pr148NzRyAZan0ix0UKA4TuBhp9/SHPM1fmy2NfwApedGnARV 8phMsYxdmcw/nj5qJqO/2iE68g== X-Google-Smtp-Source: ABdhPJzn8AYu8NTCIzprjcJA21qvqSacXrpr3e6ATBB3rGEjADRfPW5c2pzvUTFkk4MSajQ7dD45Yw== X-Received: by 2002:ac2:4189:0:b0:448:bc2b:e762 with SMTP id z9-20020ac24189000000b00448bc2be762mr8406243lfh.471.1648675786293; Wed, 30 Mar 2022 14:29:46 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 24/45] blockdev: transactions: rename some things Date: Thu, 31 Mar 2022 00:28:41 +0300 Message-Id: <20220330212902.590099-25-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::134 (failed) 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=2a00:1450:4864:20::134; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lf1-x134.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:25 -0400 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: , Cc: kwolf@redhat.com, v.sementsov-og@mail.ru, qemu-devel@nongnu.org, Markus Armbruster , hreitz@redhat.com, vsementsov@openvz.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648684269014100001 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 --- blockdev.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/blockdev.c b/blockdev.c index a9fb5f66b0..177f3ff989 100644 --- a/blockdev.c +++ b/blockdev.c @@ -2299,7 +2299,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, @@ -2381,12 +2381,12 @@ static TransactionProperties *get_transaction_prope= rties( * * Always run under BQL. */ -void qmp_transaction(TransactionActionList *dev_list, - bool has_props, - struct TransactionProperties *props, +void qmp_transaction(TransactionActionList *actions, + bool has_properties, + struct TransactionProperties *properties, Error **errp) { - TransactionActionList *dev_entry =3D dev_list; + TransactionActionList *act =3D actions; JobTxn *block_job_txn =3D NULL; Error *local_err =3D NULL; Transaction *tran =3D tran_new(); @@ -2396,8 +2396,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 @@ -2405,24 +2405,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) { @@ -2440,8 +2440,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.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648683573646243.79270357768348; Wed, 30 Mar 2022 16:39:33 -0700 (PDT) Received: from localhost ([::1]:48914 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZhuW-0004ih-8n for importer@patchew.org; Wed, 30 Mar 2022 19:39:32 -0400 Received: from eggs.gnu.org ([209.51.188.92]:35276) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZft4-0008Fc-3P for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:54 -0400 Received: from [2a00:1450:4864:20::143] (port=46024 helo=mail-lf1-x143.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZft0-0003Jv-HF for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:53 -0400 Received: by mail-lf1-x143.google.com with SMTP id p10so32198792lfa.12 for ; Wed, 30 Mar 2022 14:29:49 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=7CR4tpKwUbqNCp3vPghajNadmUDfn2CftEskMgZuONo=; b=ucriP8HbMlr64lT07ALgEJQt1aAegJQS7SVcMbGPwQvt4MFX/+jVqHYSAoi8eDv+zE RvakHHacpYBhJrCtiKWu2jnGrz/5vTTOE5QkCrPFuvLEx0bn7KSSh+1X4T49wqhiRdpm pEM8zG4v+ifzDFvDA7bEN0BaRNrVHuoyP/buw7WjnybsSM9cZkw4zafKqeX7TUiyxfgE SEwoduH3ksgZgyvlrNy+q6AeiFn/iJhLzVfoNGoAbN8ikiFl39KQN7JDOOsIAMns4lBz dKoE9Y/SVapj7P9Whl8aKWTmFbGG20Ui5c7wKi1hNlHYOeVEvcLSr+abdE6vr35IB5LL r0zQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=7CR4tpKwUbqNCp3vPghajNadmUDfn2CftEskMgZuONo=; b=05yvSYEcqBSl6Eb28au9IJ05QMNwszP4uqRZ4GRlifspYnkUNCWjnOnvPq2zxD74pj wFoW2uffD62xJj0w8MFmCa9REHOkUtX5wz4rSUqehToC/wn89NqpE5w8DaZmPSqM3ONu Cki29e1qDXNKy1vIKcfyDIAwxuYHyxwOv07bvvNcv3Wwq1MxOezDdmlaPtM6mv3jQSgg 8r8Ruk0WwFkJ2EdEfMD9SKUJqUIm0zzIHd06ZEJtZU1R+zBTm4/9I6TAwRep434HnUiq wbrjCiNGjSBk+K+qBaYK5vijkRrYlrM4mFukJtET1VxaxizqRR372M8s8QZVLco/UcQm wHMg== X-Gm-Message-State: AOAM53049LXLTvFqeLV+K/J8CQUhmMq1KmAH+bENRzvS5Fqj+LHBg2JK 0sizt1YnMIX1oTyWYOotDtmceA== X-Google-Smtp-Source: ABdhPJwhRhl+I0uVtCJPHa/aGzh/egb21Ze4nW56WHaB8Kxz6ecFXWaJ01oZr4SvfkSxc1fBhEOQ4A== X-Received: by 2002:a05:6512:3a81:b0:44a:616f:f75b with SMTP id q1-20020a0565123a8100b0044a616ff75bmr8450895lfu.2.1648675786923; Wed, 30 Mar 2022 14:29:46 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 25/45] blockdev: qmp_transaction: refactor loop to classic for Date: Thu, 31 Mar 2022 00:28:42 +0300 Message-Id: <20220330212902.590099-26-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::143 (failed) 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=2a00:1450:4864:20::143; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lf1-x143.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:25 -0400 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: , Cc: kwolf@redhat.com, v.sementsov-og@mail.ru, qemu-devel@nongnu.org, Markus Armbruster , hreitz@redhat.com, vsementsov@openvz.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648683574068100001 Content-Type: text/plain; charset="utf-8" Signed-off-by: Vladimir Sementsov-Ogievskiy --- blockdev.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/blockdev.c b/blockdev.c index 177f3ff989..b44f0ca101 100644 --- a/blockdev.c +++ b/blockdev.c @@ -2386,7 +2386,7 @@ void qmp_transaction(TransactionActionList *actions, struct TransactionProperties *properties, Error **errp) { - TransactionActionList *act =3D actions; + TransactionActionList *act; JobTxn *block_job_txn =3D NULL; Error *local_err =3D NULL; Transaction *tran =3D tran_new(); @@ -2405,14 +2405,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.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648683503925476.95480041729434; Wed, 30 Mar 2022 16:38:23 -0700 (PDT) Received: from localhost ([::1]:48190 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZhtO-0004FR-B0 for importer@patchew.org; Wed, 30 Mar 2022 19:38:22 -0400 Received: from eggs.gnu.org ([209.51.188.92]:35172) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZft2-0008DL-0t for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:52 -0400 Received: from [2a00:1450:4864:20::12c] (port=38552 helo=mail-lf1-x12c.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZfsz-0003K2-4z for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:51 -0400 Received: by mail-lf1-x12c.google.com with SMTP id bq24so22131485lfb.5 for ; Wed, 30 Mar 2022 14:29:48 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=tDZQchG3r98jLu7NUk8dQgu1A5+94jHUslCgQPH56lE=; b=zqZpChd7XaubqNDD8iuibviL8InZdM1ZlVbzm7qk/tctjxaG1r2z2JEJxJWgZGOb+T mkruEo/CAf575EoSoReqtnZQrOQJV1bKhrbBpE/MEbmyvI+QGuZlcv9UAq8x+Y3Vjm2b xCqpNM7t8Kav2edfn9lJbnO5PLmMESgUxl0dBwHFzWBggo0IBthPPIB1i7wJMHMmq2Uf l2PJaz9sI0Mq59h1oWFIP5wywHo8KUDjqe82wDwJv6VWPtgi/07rolrL8PyRCsZwqsS4 fX+eo7BMhmJZRDQxnhub4QXECO8SwDlyn7yCrQ/WFh5Z8mx6n7H9z/xgfDhfOfcNVCE3 xc5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=tDZQchG3r98jLu7NUk8dQgu1A5+94jHUslCgQPH56lE=; b=LWY52+UyhJnXBe+1NypdnhYXEZS9NaQaLUEcESgaUlTOIB4DQ0jVDYvI1VG9YIjGYI stOZ7Y573FqduobYr6Pmu0AwDDA2/+JqA3mfJtMuQpOtMSDF5DqE1mQ1Mv8qXnHNFrNS OMCYbQjaIV5ayGWj9qRP86BjxqpOPL3GMnqBD6AVMfoQbW9H7xio09So09N7re+MQgVj MuNyl24ofy27MOGaRBDc/jdP5ZpFQkUWrdlB9qXKMqIkNPNAnTZPe7VIkeGypcY2mtmV guV4T3v0l5Okh7znVwM2Rm8IADcWuwdj+2QEzh6cDpSPPVXLWoTBSDzHdguMGURniWCQ DzaQ== X-Gm-Message-State: AOAM530wnsF2RQKO1RDYpcyTobRAsiG9jr2CnyZZfgD+lo32K93OyJ41 eD2KEnJIjucsk9ZAmCXqebrF0w== X-Google-Smtp-Source: ABdhPJyJZU01wg144J9qcQR9mpJJMoRBiCw79xwYa0BCIedn+HWCnufyTndRLLJ1Z6V8bBsqk9KsQg== X-Received: by 2002:a05:6512:3a95:b0:44a:6189:dad1 with SMTP id q21-20020a0565123a9500b0044a6189dad1mr8469647lfu.334.1648675787547; Wed, 30 Mar 2022 14:29:47 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 26/45] blockdev: transaction: refactor handling transaction properties Date: Thu, 31 Mar 2022 00:28:43 +0300 Message-Id: <20220330212902.590099-27-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::12c (failed) 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=2a00:1450:4864:20::12c; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lf1-x12c.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:26 -0400 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: , Cc: kwolf@redhat.com, v.sementsov-og@mail.ru, qemu-devel@nongnu.org, Markus Armbruster , hreitz@redhat.com, vsementsov@openvz.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648683505174100001 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 | 88 ++++++++++++------------------------------------------ 1 file changed, 19 insertions(+), 69 deletions(-) diff --git a/blockdev.c b/blockdev.c index b44f0ca101..3c9e826355 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; @@ -1468,9 +1448,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) { @@ -2030,10 +2007,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, @@ -2080,10 +2053,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, @@ -2131,10 +2100,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, @@ -2176,10 +2141,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, @@ -2221,10 +2182,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, @@ -2249,10 +2206,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, @@ -2356,25 +2309,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. @@ -2390,14 +2324,31 @@ void qmp_transaction(TransactionActionList *actions, JobTxn *block_job_txn =3D NULL; Error *local_err =3D NULL; Transaction *tran =3D tran_new(); + ActionCompletionMode comp_mode =3D + has_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 @@ -2419,7 +2370,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) { --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648684143830176.02631767227228; Wed, 30 Mar 2022 16:49:03 -0700 (PDT) Received: from localhost ([::1]:58136 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZi3i-0002mP-QV for importer@patchew.org; Wed, 30 Mar 2022 19:49:02 -0400 Received: from eggs.gnu.org ([209.51.188.92]:35288) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZft4-0008Fw-EI for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:54 -0400 Received: from [2a00:1450:4864:20::12f] (port=36447 helo=mail-lf1-x12f.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZfsz-0003KW-Ty for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:54 -0400 Received: by mail-lf1-x12f.google.com with SMTP id bt26so38062676lfb.3 for ; Wed, 30 Mar 2022 14:29:49 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=wHEjVA+gzvp0VpNl4sFfu958kbbKJoxEzsV0SpzLrAU=; b=t9COrzNX/HzPOqRWnBygAv6aFsE6LP9urhzXaov3UCY5pfRilR8jwEZ2Evf8t3HQBk OcG7Aw3lxzOgKC7JZ6zH/o5+l0TYVnF1Q7qWC8KTO8ZNbznEjp1E8sedEumXg6Fb6JVd JVE0TWoz8wVrwzOS5KO7YGJ9P1LV5rsAj9n6Oqr3EVgTYEiAgsHj833qzhcch5oWwVYo VjsFPGyBwFinrhGAEJT3uUO47fWa8Eai+xZiqPxO8FSJeY5KDek9IzAuivZlr5edUfKw IwUwlwFaDxh7JyRMTrGVhrlkuT/NheJg0o0DaOKRxR98jyKn/gLeEhJLxTHHoWNZvyKz GdGA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=wHEjVA+gzvp0VpNl4sFfu958kbbKJoxEzsV0SpzLrAU=; b=54pxnihU3f0SSP3vP7/83NBsEKb7OJcIU0+dnIzwTH6AIjnH1JUnSEvBm6WzacY7tD p84yKvGn4ySu9GGjcTnM1XPjrAfjFotaJgGrmPGJOGajMSIy6RxnASteTPUdtIrhMD95 0/i2bm9BfzP7IJc6nCcMtMyIc1KJpBcrkV0EtjYV0Lf6qndn7RaDqrBGznr1l6sXVDON 0Rm28e7BMfpJywPwEiDcASfa3pu3Vmgd5VM6kM+kumV6LjamOIj4wF23ZltPB1gDhyxN /yjDHCqenrQhrLpTDor42gBRjVZWlThRHFqHRv9kH+3WQKsLyvo3kZMyEU1TwSn2jkyR Frqg== X-Gm-Message-State: AOAM531fEflIpTicurJFYKt+feTt3S2iIE7RTp0NlBndxwGTpKuDFOSN lWCG2+FTRueozSdHOLalGMDcNQ== X-Google-Smtp-Source: ABdhPJxLW6c49Cw7JH3LVX3B4B1zQflwlSMtxqqv2cZJ/C316gUYFGaSlcAjk/ViLVqe1KIYRqUX7A== X-Received: by 2002:a05:6512:3b0e:b0:44a:547d:c8b8 with SMTP id f14-20020a0565123b0e00b0044a547dc8b8mr8451041lfv.373.1648675788204; Wed, 30 Mar 2022 14:29:48 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 27/45] blockdev: qmp_transaction: drop extra generic layer Date: Thu, 31 Mar 2022 00:28:44 +0300 Message-Id: <20220330212902.590099-28-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::12f (failed) 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=2a00:1450:4864:20::12f; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lf1-x12f.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:26 -0400 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: , Cc: kwolf@redhat.com, v.sementsov-og@mail.ru, qemu-devel@nongnu.org, Markus Armbruster , hreitz@redhat.com, vsementsov@openvz.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648684144238100001 Content-Type: text/plain; charset="utf-8" Let's simplify things: First, actions generally don't need and 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 | 278 +++++++++++++++++------------------------------------ 1 file changed, 89 insertions(+), 189 deletions(-) diff --git a/blockdev.c b/blockdev.c index 3c9e826355..a7287bf64f 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; qemu_timeval tv; - 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; @@ -1385,7 +1333,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; @@ -1400,8 +1347,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; @@ -1414,9 +1361,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 @@ -1649,7 +1594,6 @@ static void external_snapshot_clean(void *opaque) } =20 typedef struct DriveBackupState { - BlkActionState common; BlockDriverState *bs; BlockJob *job; } DriveBackupState; @@ -1669,11 +1613,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); @@ -1868,7 +1809,6 @@ static void drive_backup_clean(void *opaque) } =20 typedef struct BlockdevBackupState { - BlkActionState common; BlockDriverState *bs; BlockJob *job; } BlockdevBackupState; @@ -1882,11 +1822,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; @@ -1895,9 +1835,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; @@ -1928,7 +1865,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); } @@ -1983,11 +1920,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 @@ -1997,17 +1932,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, @@ -2016,7 +1948,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); } @@ -2024,15 +1957,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 @@ -2044,16 +1972,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, @@ -2091,16 +2016,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, @@ -2132,16 +2054,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, @@ -2173,17 +2092,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); @@ -2197,16 +2112,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); @@ -2237,13 +2149,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 @@ -2252,62 +2162,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 @@ -2357,21 +2271,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.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648684357948257.6737793858222; Wed, 30 Mar 2022 16:52:37 -0700 (PDT) Received: from localhost ([::1]:38572 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZi7A-0000DT-Pi for importer@patchew.org; Wed, 30 Mar 2022 19:52:36 -0400 Received: from eggs.gnu.org ([209.51.188.92]:35498) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZft8-0008IC-RO for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:30:00 -0400 Received: from [2a00:1450:4864:20::12b] (port=39796 helo=mail-lf1-x12b.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZft2-0003LM-RE for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:57 -0400 Received: by mail-lf1-x12b.google.com with SMTP id w7so38088134lfd.6 for ; Wed, 30 Mar 2022 14:29:51 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=CiJJL+167Ro0sTrikfBLl2PHuNZOVZpcsshtWuMI4vc=; b=8DSCU7SiXwbzaV0qjdR2Z9o6A/+ZEqLoc4Nx44a7uMjkrmxEo29O2GrNmyZ48Pis6e Ivb/HhfCPJ25oYsFmWRPNOw+2Gy1Las+eYB9Ybn31AFy6vPmixy7XWhJhXVRJpjmTOrb 6xrUah3mr1IhkGAoPHeN3ls2PMcQss10Z6TxHNkK4bvUunYCIvSaPJl39esB2daslNuH pKNmiBbw2yCHWdsLkU1WO5p8LSnZn4UJ3g3LWIlviyWjM4MyQky3WpSGvCv7NzwsNIRP Wp3TTOuUo+Shvqu/0u5xuPO9F5XwURnqs8asmEZUZhi/i4tSt2MIw1a5vF7pbw8PwjzY XHag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=CiJJL+167Ro0sTrikfBLl2PHuNZOVZpcsshtWuMI4vc=; b=sKyy1Pn80OyZ9PaZ6F/0EzgTYQzflzsdynlTGpboCOVrYDH9Y3XmOKxrblAXCM/R0F PXjcQW7Q84stv7HLjPq3arXFNMFeDWvVNl1JWe2nQx68CHq98TpfHgpadYeXc8DUMHJ2 dyepAQeUgnYi1pnjBa+GcyUrqx3Tkn9ts17Vj+k4gpp96deKZV7fwgOB3zfbE3XeLz9Z K6/xLyMrRRx3JOhZlj5ZqTWykJ6QBTxN/33l5zgDtA5il1Ec0CtOmqcne0S+8f04t9xe /1E6ZXNFhFTx9qSJDMmT4EjJIQPZ2KALzHRsil8Fm5CDFyMuJVXxsKWkDDMGHjBZmyBY V8TQ== X-Gm-Message-State: AOAM530aifp7B56gSeTpN7ibLf3kDfDrWb/3wJZrfOtBNHYRV1Xdh5aW 3Vk5/yplSQLXSbERPqu3enCMbA== X-Google-Smtp-Source: ABdhPJyp3RpLdsTIGrvzdi7+JBs0zo/c+bB13gbNzy/tBwCmtE7yF7zng2YMO82Ge86JSw4F/UTCDQ== X-Received: by 2002:a05:6512:39cf:b0:44a:22e3:35e0 with SMTP id k15-20020a05651239cf00b0044a22e335e0mr8061509lfu.219.1648675788916; Wed, 30 Mar 2022 14:29:48 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 28/45] qapi: block: add blockdev-del transaction action Date: Thu, 31 Mar 2022 00:28:45 +0300 Message-Id: <20220330212902.590099-29-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::12b (failed) 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=2a00:1450:4864:20::12b; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lf1-x12b.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:26 -0400 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: , Cc: kwolf@redhat.com, v.sementsov-og@mail.ru, qemu-devel@nongnu.org, Markus Armbruster , hreitz@redhat.com, vsementsov@openvz.org, Eric Blake Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648684359525100001 Content-Type: text/plain; charset="utf-8" Support blockdev-del in a transaction. The tricky thing is how we update permissions: not after every blockdev-del operation, but after group of such operations. Soon we'll support blockdev-add and new blockdev-replace in the same manner, and we'll be able to do a wide range of block-graph modifying operation in a bunch, so that permissions are updated only after the whole group, to avoid intermediate permission conflicts. Additionally we need to add aio_context_acquire_tran() transaction action, to keep aio context acquired including final bdrv_delete() in commit of bdrv_unref_tran(). Signed-off-by: Vladimir Sementsov-Ogievskiy --- blockdev.c | 87 +++++++++++++++++++++++++++++++++++++------ qapi/block-core.json | 11 ++++-- qapi/transaction.json | 12 ++++++ 3 files changed, 95 insertions(+), 15 deletions(-) diff --git a/blockdev.c b/blockdev.c index a7287bf64f..1cd95f4f02 100644 --- a/blockdev.c +++ b/blockdev.c @@ -63,6 +63,9 @@ #include "qemu/main-loop.h" #include "qemu/throttle-options.h" =20 +static int blockdev_del(const char *node_name, GSList **detached, + Transaction *tran, Error **errp); + /* Protected by BQL */ QTAILQ_HEAD(, BlockDriverState) monitor_bdrv_states =3D QTAILQ_HEAD_INITIALIZER(monitor_bdrv_states); @@ -2163,6 +2166,7 @@ static void abort_commit(void *opaque) } =20 static void transaction_action(TransactionAction *act, JobTxn *block_job_t= xn, + GSList **refresh_list, Transaction *tran, Error **errp) { switch (act->type) { @@ -2209,6 +2213,10 @@ static void transaction_action(TransactionAction *ac= t, JobTxn *block_job_txn, block_dirty_bitmap_remove_action(act->u.block_dirty_bitmap_remove.= data, tran, errp); return; + case TRANSACTION_ACTION_KIND_BLOCKDEV_DEL: + blockdev_del(act->u.blockdev_del.data->node_name, + refresh_list, tran, errp); + return; /* * Where are transactions for MIRROR, COMMIT and STREAM? * Although these blockjobs use transaction callbacks like the backup = job, @@ -2234,6 +2242,7 @@ void qmp_transaction(TransactionActionList *actions, struct TransactionProperties *properties, Error **errp) { + int ret; TransactionActionList *act; JobTxn *block_job_txn =3D NULL; Error *local_err =3D NULL; @@ -2241,6 +2250,7 @@ void qmp_transaction(TransactionActionList *actions, ActionCompletionMode comp_mode =3D has_properties ? properties->completion_mode : ACTION_COMPLETION_MODE_INDIVIDUAL; + g_autoptr(GSList) refresh_list =3D NULL; =20 GLOBAL_STATE_CODE(); =20 @@ -2271,13 +2281,32 @@ 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) { - transaction_action(act->value, block_job_txn, tran, &local_err); + TransactionActionKind type =3D act->value->type; + + if (refresh_list && + type !=3D TRANSACTION_ACTION_KIND_BLOCKDEV_DEL) + { + ret =3D bdrv_list_refresh_perms(refresh_list, NULL, tran, errp= ); + if (ret < 0) { + goto delete_and_fail; + } + g_slist_free(refresh_list); + refresh_list =3D NULL; + } + + transaction_action(act->value, block_job_txn, &refresh_list, tran, + &local_err); if (local_err) { error_propagate(errp, local_err); goto delete_and_fail; } } =20 + ret =3D bdrv_list_refresh_perms(refresh_list, NULL, tran, errp); + if (ret < 0) { + goto delete_and_fail; + } + tran_commit(tran); =20 /* success */ @@ -3520,9 +3549,25 @@ fail: g_slist_free(drained); } =20 -void qmp_blockdev_del(const char *node_name, Error **errp) +static void aio_context_acquire_clean(void *opaque) +{ + aio_context_release(opaque); +} + +TransactionActionDrv aio_context_acquire_drv =3D { + .clean =3D aio_context_acquire_clean, +}; + +static void aio_context_acquire_tran(AioContext *ctx, Transaction *tran) +{ + aio_context_acquire(ctx); + tran_add(tran, &aio_context_acquire_drv, ctx); +} + +/* Function doesn't update permissions, it's a responsibility of caller. */ +static int blockdev_del(const char *node_name, GSList **refresh_list, + Transaction *tran, Error **errp) { - AioContext *aio_context; BlockDriverState *bs; =20 GLOBAL_STATE_CODE(); @@ -3530,36 +3575,54 @@ void qmp_blockdev_del(const char *node_name, Error = **errp) bs =3D bdrv_find_node(node_name); if (!bs) { error_setg(errp, "Failed to find node with node-name=3D'%s'", node= _name); - return; + return -EINVAL; } if (bdrv_has_blk(bs)) { error_setg(errp, "Node %s is in use", node_name); - return; + return -EINVAL; } - aio_context =3D bdrv_get_aio_context(bs); - aio_context_acquire(aio_context); + aio_context_acquire_tran(bdrv_get_aio_context(bs), tran); =20 if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_DRIVE_DEL, errp)) { - goto out; + return -EINVAL; } =20 if (!QTAILQ_IN_USE(bs, monitor_list)) { error_setg(errp, "Node %s is not owned by the monitor", bs->node_name); - goto out; + return -EINVAL; } =20 if (bs->refcnt > 1) { error_setg(errp, "Block device %s is in use", bdrv_get_device_or_node_name(bs)); - goto out; + return -EINVAL; } =20 QTAILQ_REMOVE(&monitor_bdrv_states, bs, monitor_list); - bdrv_unref(bs); + bdrv_unref_tran(bs, refresh_list, tran); + + return 0; +} + +void qmp_blockdev_del(const char *node_name, Error **errp) +{ + int ret; + Transaction *tran =3D tran_new(); + g_autoptr(GSList) refresh_list =3D NULL; + + ret =3D blockdev_del(node_name, &refresh_list, tran, errp); + if (ret < 0) { + goto out; + } + + ret =3D bdrv_list_refresh_perms(refresh_list, NULL, tran, errp); + if (ret < 0) { + goto out; + } =20 out: - aio_context_release(aio_context); + tran_finalize(tran, ret); } =20 static BdrvChild *bdrv_find_child(BlockDriverState *parent_bs, diff --git a/qapi/block-core.json b/qapi/block-core.json index e89f2dfb5b..d915cddde9 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -4407,6 +4407,13 @@ { 'command': 'blockdev-reopen', 'data': { 'options': ['BlockdevOptions'] } } =20 +## +# @BlockdevDel: +# +# @node-name: Name of the graph node to delete. +## +{ 'struct': 'BlockdevDel', 'data': { 'node-name': 'str' } } + ## # @blockdev-del: # @@ -4414,8 +4421,6 @@ # The command will fail if the node is attached to a device or is # otherwise being used. # -# @node-name: Name of the graph node to delete. -# # Since: 2.9 # # Example: @@ -4438,7 +4443,7 @@ # <- { "return": {} } # ## -{ 'command': 'blockdev-del', 'data': { 'node-name': 'str' } } +{ 'command': 'blockdev-del', 'data': 'BlockdevDel' } =20 ## # @BlockdevCreateOptionsFile: diff --git a/qapi/transaction.json b/qapi/transaction.json index 381a2df782..ea20df770c 100644 --- a/qapi/transaction.json +++ b/qapi/transaction.json @@ -53,6 +53,7 @@ # @blockdev-snapshot-internal-sync: Since 1.7 # @blockdev-snapshot-sync: since 1.1 # @drive-backup: Since 1.6 +# @blockdev-del: since 7.1 # # Features: # @deprecated: Member @drive-backup is deprecated. Use member @@ -66,6 +67,7 @@ 'block-dirty-bitmap-disable', 'block-dirty-bitmap-merge', 'blockdev-backup', 'blockdev-snapshot', 'blockdev-snapshot-internal-sync', 'blockdev-snapshot-sync', + 'blockdev-del', { 'name': 'drive-backup', 'features': [ 'deprecated' ] } ] } =20 ## @@ -140,6 +142,15 @@ { 'struct': 'DriveBackupWrapper', 'data': { 'data': 'DriveBackup' } } =20 +## +# @BlockdevDelWrapper: +# +# Since: 7.1 +## +{ 'struct': 'BlockdevDelWrapper', + 'data': { 'data': 'BlockdevDel' } } + + ## # @TransactionAction: # @@ -163,6 +174,7 @@ 'blockdev-snapshot': 'BlockdevSnapshotWrapper', 'blockdev-snapshot-internal-sync': 'BlockdevSnapshotInternalWrapper= ', 'blockdev-snapshot-sync': 'BlockdevSnapshotSyncWrapper', + 'blockdev-del': 'BlockdevDelWrapper', 'drive-backup': 'DriveBackupWrapper' } } =20 --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648684104896143.66855490077933; Wed, 30 Mar 2022 16:48:24 -0700 (PDT) Received: from localhost ([::1]:57480 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZi35-0002FX-8O for importer@patchew.org; Wed, 30 Mar 2022 19:48:23 -0400 Received: from eggs.gnu.org ([209.51.188.92]:35408) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZft7-0008H6-1O for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:58 -0400 Received: from [2a00:1450:4864:20::135] (port=33460 helo=mail-lf1-x135.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZft1-0003LI-7i for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:55 -0400 Received: by mail-lf1-x135.google.com with SMTP id bu29so38190759lfb.0 for ; Wed, 30 Mar 2022 14:29:50 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=dT//zpD4OQYcrz77bj65eT/9EO5/UoXOs9WdzVqQr9U=; b=px0jlK1Zp5Gn3Bl5r8B1k8dmwIGZs6F+SoHKlF2Quuu1JCpyzjl5ezUv8Lo0rAsqQr DptXJXFLiVfMVD2U/mANBO0g916aOK98AI0ZO90/zLSQD3UEawoZfJBg+ltk4hGfAEYc byCxtNLnR0JrxEKQISZr3MumGLm8Y4rVKVWNXVVONQ2YVBiRd2ikgNNhl5FZ8omgsrDf Dc57qRyTgx2SU7ULvrtatks+EyG5Ha5KHf6th5D/LhH//2bvNXY28qm2/xKxh0ZLOV+D M9JFubsfBZNwQe+BESEPr2f/mmeJkFJWh9703seGnkJNX3b3Idybkgge7n7UMWL3MuQy yKeA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=dT//zpD4OQYcrz77bj65eT/9EO5/UoXOs9WdzVqQr9U=; b=oc1S6WRHUvhWxbLM/VbMqnzb45VwqGIkWn/ApkNam+B6Ph9W70KibkYlrDVy282Ren iW0fjWRy7K00Ng9a/8fO+Rq+dZa09G3Cj063VDWYf9butY8Irv/B0uTUdzCELBJAVuDY TQ85titzssOETmZZhtcYS917vtWSEz8b5OSjPEKwB2TYurHCRUdL4/Eebw95/60/EVbs QD1dmoV5xnjezupND3Cm2oNfeB22A9yDhEz7/uKAhb/VPSCu77eAehUliDO/Z67d66GM PrZ+w8GIDmN5vEchZ5W67O48Z7vJCCBiDt15Cf1HLM6Y7mGiyeg8gYrtOJBVFcjGBc+P LZMg== X-Gm-Message-State: AOAM533532Xwe7OPHrwJoUM2QHhHPNJRcRO2BPdw8ZDbZAlJb0rjjcOW 5kQr0qmvliNRsiHbS/uKKAplPw== X-Google-Smtp-Source: ABdhPJzQdQHLNM7vvXUflVnKHxKVbGMhIz7I7EkV40WWh40hCHcNUA6AsQ6xKL0ahuYodxTYZd+TRw== X-Received: by 2002:a05:6512:1051:b0:44a:5dcb:3a74 with SMTP id c17-20020a056512105100b0044a5dcb3a74mr8344192lfb.51.1648675789571; Wed, 30 Mar 2022 14:29:49 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 29/45] block: introduce BDRV_O_NOPERM flag Date: Thu, 31 Mar 2022 00:28:46 +0300 Message-Id: <20220330212902.590099-30-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::135 (failed) 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=2a00:1450:4864:20::135; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lf1-x135.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:26 -0400 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: , Cc: kwolf@redhat.com, v.sementsov-og@mail.ru, qemu-devel@nongnu.org, Markus Armbruster , hreitz@redhat.com, vsementsov@openvz.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648684107252100001 Content-Type: text/plain; charset="utf-8" Now copy-before-write filter has weak permission model: when it has no parents, it share write permission on source. Otherwise we just can't blockdev-add it, when existing user of source has write permission. The situation is bad, it means that copy-before-write filter doesn't guarantee that all write goes through it. And a lot better is unshare write always. But how to insert the filter in this case? The solution is to do blockdev-add and blockdev-replace in one transaction, and more, update permissions only after both command. For now, let's create a possibility to not update permission on file child of copy-before-write filter at time of open. New interfaces are: - bds_tree_init() with flags argument, so that caller may pass additional flags, for example the new BDRV_O_NOPERM. - bdrv_open_file_child_common() with boolean refresh_perms arguments. Drivers may use this function with refresh_perms =3D true, if they want to satisfy BDRV_O_NOPERM. No one such driver for now. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block.c | 82 +++++++++++++++++++------- block/monitor/block-hmp-cmds.c | 2 +- blockdev.c | 13 ++-- include/block/block-common.h | 3 + include/block/block-global-state.h | 11 ++++ include/block/block_int-global-state.h | 3 +- 6 files changed, 83 insertions(+), 31 deletions(-) diff --git a/block.c b/block.c index a7020d3cd8..ca0b629bec 100644 --- a/block.c +++ b/block.c @@ -3166,12 +3166,13 @@ out: * If @parent_bs and @child_bs are in different AioContexts, the caller mu= st * hold the AioContext lock for @child_bs, but not for @parent_bs. */ -BdrvChild *bdrv_attach_child(BlockDriverState *parent_bs, - BlockDriverState *child_bs, - const char *child_name, - const BdrvChildClass *child_class, - BdrvChildRole child_role, - Error **errp) +static BdrvChild *bdrv_do_attach_child(BlockDriverState *parent_bs, + BlockDriverState *child_bs, + const char *child_name, + const BdrvChildClass *child_class, + BdrvChildRole child_role, + bool refresh_perms, + Error **errp) { int ret; BdrvChild *child; @@ -3185,9 +3186,11 @@ BdrvChild *bdrv_attach_child(BlockDriverState *paren= t_bs, goto out; } =20 - ret =3D bdrv_refresh_perms(parent_bs, tran, errp); - if (ret < 0) { - goto out; + if (refresh_perms) { + ret =3D bdrv_refresh_perms(parent_bs, tran, errp); + if (ret < 0) { + goto out; + } } =20 out: @@ -3198,6 +3201,17 @@ out: return ret < 0 ? NULL : child; } =20 +BdrvChild *bdrv_attach_child(BlockDriverState *parent_bs, + BlockDriverState *child_bs, + const char *child_name, + const BdrvChildClass *child_class, + BdrvChildRole child_role, + Error **errp) +{ + return bdrv_do_attach_child(parent_bs, child_bs, child_name, child_cla= ss, + child_role, true, errp); +} + /* Caller is responsible to refresh permissions in @refresh_list */ static void bdrv_root_unref_child_tran(BdrvChild *child, GSList **refresh_= list, Transaction *tran) @@ -3668,12 +3682,13 @@ done: * * The BlockdevRef will be removed from the options QDict. */ -BdrvChild *bdrv_open_child(const char *filename, - QDict *options, const char *bdref_key, - BlockDriverState *parent, - const BdrvChildClass *child_class, - BdrvChildRole child_role, - bool allow_none, Error **errp) +BdrvChild *bdrv_open_child_common(const char *filename, + QDict *options, const char *bdref_key, + BlockDriverState *parent, + const BdrvChildClass *child_class, + BdrvChildRole child_role, + bool allow_none, bool refresh_perms, + Error **errp) { BlockDriverState *bs; =20 @@ -3685,16 +3700,29 @@ BdrvChild *bdrv_open_child(const char *filename, return NULL; } =20 - return bdrv_attach_child(parent, bs, bdref_key, child_class, child_rol= e, - errp); + return bdrv_do_attach_child(parent, bs, bdref_key, child_class, child_= role, + refresh_perms, errp); +} + +BdrvChild *bdrv_open_child(const char *filename, + QDict *options, const char *bdref_key, + BlockDriverState *parent, + const BdrvChildClass *child_class, + BdrvChildRole child_role, + bool allow_none, Error **errp) +{ + return bdrv_open_child_common(filename, options, bdref_key, parent, + child_class, child_role, allow_none, tru= e, + errp); } =20 /* * Wrapper on bdrv_open_child() for most popular case: open primary child = of bs. */ -int bdrv_open_file_child(const char *filename, - QDict *options, const char *bdref_key, - BlockDriverState *parent, Error **errp) +int bdrv_open_file_child_common(const char *filename, + QDict *options, const char *bdref_key, + BlockDriverState *parent, bool refresh_per= ms, + Error **errp) { BdrvChildRole role; =20 @@ -3703,8 +3731,9 @@ int bdrv_open_file_child(const char *filename, role =3D parent->drv->is_filter ? (BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY) : BDRV_CHILD_IMAGE; =20 - if (!bdrv_open_child(filename, options, bdref_key, parent, - &child_of_bds, role, false, errp)) + if (!bdrv_open_child_common(filename, options, bdref_key, parent, + &child_of_bds, role, false, refresh_perms, + errp)) { return -EINVAL; } @@ -3712,6 +3741,15 @@ int bdrv_open_file_child(const char *filename, return 0; } =20 +int bdrv_open_file_child(const char *filename, + QDict *options, const char *bdref_key, + BlockDriverState *parent, + Error **errp) +{ + return bdrv_open_file_child_common(filename, options, bdref_key, paren= t, + true, errp); +} + /* * TODO Future callers may need to specify parent/child_class in order for * option inheritance to work. Existing callers use it for the root node. diff --git a/block/monitor/block-hmp-cmds.c b/block/monitor/block-hmp-cmds.c index bfb3c043a0..9145ccfc46 100644 --- a/block/monitor/block-hmp-cmds.c +++ b/block/monitor/block-hmp-cmds.c @@ -76,7 +76,7 @@ static void hmp_drive_add_node(Monitor *mon, const char *= optstr) goto out; } =20 - BlockDriverState *bs =3D bds_tree_init(qdict, &local_err); + BlockDriverState *bs =3D bds_tree_init(qdict, 0, &local_err); if (!bs) { error_report_err(local_err); goto out; diff --git a/blockdev.c b/blockdev.c index 1cd95f4f02..16a9b98afc 100644 --- a/blockdev.c +++ b/blockdev.c @@ -643,12 +643,11 @@ err_no_opts: } =20 /* Takes the ownership of bs_opts */ -BlockDriverState *bds_tree_init(QDict *bs_opts, Error **errp) +BlockDriverState *bds_tree_init(QDict *bs_opts, BdrvRequestFlags flags, + Error **errp) { - int bdrv_flags =3D 0; - GLOBAL_STATE_CODE(); - /* bdrv_open() defaults to the values in bdrv_flags (for compatibility + /* bdrv_open() defaults to the values in flags (for compatibility * with other callers) rather than what we want as the real defaults. * Apply the defaults here instead. */ qdict_set_default_str(bs_opts, BDRV_OPT_CACHE_DIRECT, "off"); @@ -656,10 +655,10 @@ BlockDriverState *bds_tree_init(QDict *bs_opts, Error= **errp) qdict_set_default_str(bs_opts, BDRV_OPT_READ_ONLY, "off"); =20 if (runstate_check(RUN_STATE_INMIGRATE)) { - bdrv_flags |=3D BDRV_O_INACTIVE; + flags |=3D BDRV_O_INACTIVE; } =20 - return bdrv_open(NULL, NULL, bs_opts, bdrv_flags, errp); + return bdrv_open(NULL, NULL, bs_opts, flags, errp); } =20 void blockdev_close_all_bdrv_states(void) @@ -3473,7 +3472,7 @@ void qmp_blockdev_add(BlockdevOptions *options, Error= **errp) goto fail; } =20 - bs =3D bds_tree_init(qdict, errp); + bs =3D bds_tree_init(qdict, 0, errp); if (!bs) { goto fail; } diff --git a/include/block/block-common.h b/include/block/block-common.h index 2f247dd607..face2d62d0 100644 --- a/include/block/block-common.h +++ b/include/block/block-common.h @@ -145,6 +145,9 @@ typedef enum { read-write fails */ #define BDRV_O_IO_URING 0x40000 /* use io_uring instead of the thread p= ool */ =20 +#define BDRV_O_NOPERM 0x80000 /* Don't update permissions if possible, + open() caller will do that. */ + #define BDRV_O_CACHE_MASK (BDRV_O_NOCACHE | BDRV_O_NO_FLUSH) =20 =20 diff --git a/include/block/block-global-state.h b/include/block/block-globa= l-state.h index f3ec72810e..8527bcad28 100644 --- a/include/block/block-global-state.h +++ b/include/block/block-global-state.h @@ -76,6 +76,17 @@ BdrvChild *bdrv_open_child(const char *filename, const BdrvChildClass *child_class, BdrvChildRole child_role, bool allow_none, Error **errp); +BdrvChild *bdrv_open_child_common(const char *filename, + QDict *options, const char *bdref_key, + BlockDriverState *parent, + const BdrvChildClass *child_class, + BdrvChildRole child_role, + bool allow_none, bool refresh_perms, + Error **errp); +int bdrv_open_file_child_common(const char *filename, + QDict *options, const char *bdref_key, + BlockDriverState *parent, bool refresh_per= ms, + Error **errp); int bdrv_open_file_child(const char *filename, QDict *options, const char *bdref_key, BlockDriverState *parent, Error **errp); diff --git a/include/block/block_int-global-state.h b/include/block/block_i= nt-global-state.h index 0f21b0570b..aed62a45d9 100644 --- a/include/block/block_int-global-state.h +++ b/include/block/block_int-global-state.h @@ -245,7 +245,8 @@ void bdrv_set_monitor_owned(BlockDriverState *bs); =20 void blockdev_close_all_bdrv_states(void); =20 -BlockDriverState *bds_tree_init(QDict *bs_opts, Error **errp); +BlockDriverState *bds_tree_init(QDict *bs_opts, BdrvRequestFlags flags, + Error **errp); =20 /** * Simple implementation of bdrv_co_create_opts for protocol drivers --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648683375318842.3534664635505; Wed, 30 Mar 2022 16:36:15 -0700 (PDT) Received: from localhost ([::1]:41246 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZhrK-0007zC-5D for importer@patchew.org; Wed, 30 Mar 2022 19:36:14 -0400 Received: from eggs.gnu.org ([209.51.188.92]:35342) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZft5-0008GR-KP for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:56 -0400 Received: from [2a00:1450:4864:20::12d] (port=40625 helo=mail-lf1-x12d.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZft1-0003Lw-So for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:55 -0400 Received: by mail-lf1-x12d.google.com with SMTP id t25so38067548lfg.7 for ; Wed, 30 Mar 2022 14:29:51 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=tG4qRDp75q7RazPHtwh5ErdEyaOnIwmsEWlnL+y4BaI=; b=afx+qONuDHVYmO1beNEEbqEeyp+LEmwn3hzUv5F/hWwo55WYx9i+LfV6DiiiCjeu7I QQCL+/WFBJCiwvlbBrzUQiG51oIyTt/9lIX8mQHUTOKfG6z7uIl1sRuKiVA9Nl7p1KQb AElX55UexLQfQ58IhzRjhy5Xd5N/j7pKoHA3uK8dhnmZxi31bFaN2wUBo8JfpKS1KXNi mj2X/4OFMIDp3K2DZYxmYpf3DCGpcutMleyHqW/K35gdg8pKd8rBOcirlWrVgTlOS9G6 VmHFvUfrV4ZQ75KJ0nwmmOqbs8fzTNxLivDwWcKC6x933cdaCL4UK9OITmYtypesCAwQ sKSw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=tG4qRDp75q7RazPHtwh5ErdEyaOnIwmsEWlnL+y4BaI=; b=CyNSPFFNtlsim8fAMHi+/dOHhLEbcv9Y1YH5v74hGrfxdxLFIvQOz7sMzIdzl8WGQr 1dWen8SFy1QxI3v883MPlvuO3FTBdelLToVM0okuXpU2Hkd9hKVFI/1Qu4aRA2YB79zm PyKkH3HEo8b8gbtcWN6SP133Pz9MafltXIYhhUacFilDM7wAp+tw7pj+hMvAnJqQBL+l 7vcosPQsdIZJDVNsrEUN2bIrdtsTgI/ciervi1rm9vvMcyOw1HZXsGnIjNgN+mPIMTfS /8Zo1qRvyN1X8pJc422JIGZmchUubOTnO7/GsSAXQiHU0WKcQzXPOzwXhqvsrav0WmJd +k6g== X-Gm-Message-State: AOAM53378P1hAJaQ4hT0XnoALt/WgvsYurcVcBim4VthqAXPv0NPodFM 88lWj0bB6+5f8nEEbexJMcQjBw== X-Google-Smtp-Source: ABdhPJw8W96ttf7alxDrg5dnCzP4JH9G+s65n7NSnRO2WwP2gg5DM08ZiGxWqoobSVk4NlCEfIFUpQ== X-Received: by 2002:a05:6512:31c4:b0:44a:b45e:b0 with SMTP id j4-20020a05651231c400b0044ab45e00b0mr7937426lfe.494.1648675790210; Wed, 30 Mar 2022 14:29:50 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 30/45] block: bdrv_insert_node(): use BDRV_O_NOPERM Date: Thu, 31 Mar 2022 00:28:47 +0300 Message-Id: <20220330212902.590099-31-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::12d (failed) 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=2a00:1450:4864:20::12d; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lf1-x12d.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:25 -0400 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: , Cc: kwolf@redhat.com, hreitz@redhat.com, vsementsov@openvz.org, v.sementsov-og@mail.ru, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648683376229100001 Content-Type: text/plain; charset="utf-8" Further bdrv_replace_node will refresh permissions anyway, so we can avoid intermediate permission conflicts. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/block.c b/block.c index ca0b629bec..17c057a962 100644 --- a/block.c +++ b/block.c @@ -5420,8 +5420,8 @@ BlockDriverState *bdrv_insert_node(BlockDriverState *= bs, QDict *options, =20 GLOBAL_STATE_CODE(); =20 - new_node_bs =3D bdrv_new_open_driver_opts(drv, node_name, options, fla= gs, - errp); + new_node_bs =3D bdrv_new_open_driver_opts(drv, node_name, options, + flags | BDRV_O_NOPERM, errp); options =3D NULL; /* bdrv_new_open_driver() eats options */ if (!new_node_bs) { error_prepend(errp, "Could not create node: "); --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648683612105875.4399329886935; Wed, 30 Mar 2022 16:40:12 -0700 (PDT) Received: from localhost ([::1]:49552 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZhv8-00059u-1T for importer@patchew.org; Wed, 30 Mar 2022 19:40:11 -0400 Received: from eggs.gnu.org ([209.51.188.92]:35412) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZft7-0008H8-3F for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:58 -0400 Received: from [2a00:1450:4864:20::230] (port=41632 helo=mail-lj1-x230.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZft2-0003ML-OO for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:55 -0400 Received: by mail-lj1-x230.google.com with SMTP id 17so29456618ljw.8 for ; Wed, 30 Mar 2022 14:29:52 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=rv+CiCzHjV62zD13urXNP6spV+Pm476sotNs+8GpRa4=; b=0EczUlSmBFNexZIGCFfYwHXWb1r8A4TZ2tsJ6dOb4AmRxRjtxFfbIB+3XvYCUAquQl OVm5ohcQ8RTAnXmWpkrMj4xKPMl0rSJA0HOxtDXYY/cqYa6qCKD/uuOFWAGfKj1Ko7Yb q+p2hO+3VJj6aDr28GftI13/zVql7vGEFAgW7Kd+DPLxikOLCjDVwTEdjGV4xl7WDjOP CGxufw1wuDa6SpcmzKbibYIWyfpzRevUiXtqBhwcA5Ot3F3L9EFgHHpB9Ngch+qVUpkh DTYbNHQaoDVK9f2+08ybmpu00GE4jboeSd9jjHfsZJtUuN6amEsQRxxo8niedy/lOObw kdkg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=rv+CiCzHjV62zD13urXNP6spV+Pm476sotNs+8GpRa4=; b=rEpm7pXpdrglqW+rHMv/MEwBIA/khux3lCKWuYf9pqTtshpySKRkXk22E/DYh/J8Xi VwLSgL/GTUpFWS7+jdEHKmxkjgcggpVTSnOvFDYcvlfXiK8MSyF9omelq6vBEIBZXKcq ik4iP8/9zp9TM2bOtQ2uAAU/U+VQXYSbjICdpD7aaZzQnNVlG3GoEYXCfCS9n5zFbK4d JnL2jHicSFjcUIIqucEEoketDB0HHqU1VQn+fMrrTqJaM5zQuzAdxYMx/QVprbIWqjw+ RwTwLqD4HfpYDyNeYFwtPtz3xvuktVHBjq3W3FHG1R0dpSLV7Zo8ORazNeLB2eo3Muxz v8JQ== X-Gm-Message-State: AOAM533z+oOJGkPSkpSNXf36S48yDo5TnGe2QcDceTiB4gn3ORKZMjI1 3essd/jwbJe5U0aecEp2sWZzlq3WmvHwkQ== X-Google-Smtp-Source: ABdhPJxbeBJSSN5YZFZqOJsInHlzS6bxFkjayJY2NULZucWmVP+fGESGu4Ag8igwQLCez9Tr3OZJ6A== X-Received: by 2002:a2e:b014:0:b0:23c:9593:f7 with SMTP id y20-20020a2eb014000000b0023c959300f7mr8271877ljk.209.1648675790858; Wed, 30 Mar 2022 14:29:50 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 31/45] qapi: block: add blockdev-add transaction action Date: Thu, 31 Mar 2022 00:28:48 +0300 Message-Id: <20220330212902.590099-32-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::230 (failed) 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=2a00:1450:4864:20::230; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lj1-x230.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:26 -0400 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: , Cc: kwolf@redhat.com, v.sementsov-og@mail.ru, qemu-devel@nongnu.org, Markus Armbruster , hreitz@redhat.com, vsementsov@openvz.org, Eric Blake Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648683614537100001 Content-Type: text/plain; charset="utf-8" Use new flag to avoid permission updates where possible during blockdev_add, so that a bunch of add/del (and soon, new 'replace') command may be done before actual permission update to avoid intermediate permission conflicts. Signed-off-by: Vladimir Sementsov-Ogievskiy --- blockdev.c | 54 ++++++++++++++++++++++++++++++++++++++++--- qapi/transaction.json | 10 +++++++- 2 files changed, 60 insertions(+), 4 deletions(-) diff --git a/blockdev.c b/blockdev.c index 16a9b98afc..3afd2ceea8 100644 --- a/blockdev.c +++ b/blockdev.c @@ -65,6 +65,8 @@ =20 static int blockdev_del(const char *node_name, GSList **detached, Transaction *tran, Error **errp); +static int blockdev_add(BlockdevOptions *options, GSList **refresh_list, + Transaction *tran, Error **errp); =20 /* Protected by BQL */ QTAILQ_HEAD(, BlockDriverState) monitor_bdrv_states =3D @@ -2216,6 +2218,10 @@ static void transaction_action(TransactionAction *ac= t, JobTxn *block_job_txn, blockdev_del(act->u.blockdev_del.data->node_name, refresh_list, tran, errp); return; + case TRANSACTION_ACTION_KIND_BLOCKDEV_ADD: + blockdev_add(act->u.blockdev_add.data, + refresh_list, tran, errp); + return; /* * Where are transactions for MIRROR, COMMIT and STREAM? * Although these blockjobs use transaction callbacks like the backup = job, @@ -2283,7 +2289,8 @@ void qmp_transaction(TransactionActionList *actions, TransactionActionKind type =3D act->value->type; =20 if (refresh_list && - type !=3D TRANSACTION_ACTION_KIND_BLOCKDEV_DEL) + type !=3D TRANSACTION_ACTION_KIND_BLOCKDEV_DEL && + type !=3D TRANSACTION_ACTION_KIND_BLOCKDEV_ADD) { ret =3D bdrv_list_refresh_perms(refresh_list, NULL, tran, errp= ); if (ret < 0) { @@ -3454,7 +3461,21 @@ out: aio_context_release(aio_context); } =20 -void qmp_blockdev_add(BlockdevOptions *options, Error **errp) +static void blockdev_add_abort(void *opaque) +{ + BlockDriverState *bs =3D opaque; + + QTAILQ_REMOVE(&monitor_bdrv_states, bs, monitor_list); + bdrv_unref(bs); +} + +TransactionActionDrv blockdev_add_drv =3D { + .abort =3D blockdev_add_abort, +}; + +/* Caller is responsible to refresh permissions */ +static int blockdev_add(BlockdevOptions *options, GSList **refresh_list, + Transaction *tran, Error **errp) { BlockDriverState *bs; QObject *obj; @@ -3472,15 +3493,42 @@ void qmp_blockdev_add(BlockdevOptions *options, Err= or **errp) goto fail; } =20 - bs =3D bds_tree_init(qdict, 0, errp); + bs =3D bds_tree_init(qdict, BDRV_O_NOPERM, errp); if (!bs) { goto fail; } =20 + *refresh_list =3D g_slist_prepend(*refresh_list, bs); + tran_add(tran, &blockdev_add_drv, bs); + bdrv_set_monitor_owned(bs); =20 + visit_free(v); + return 0; + fail: visit_free(v); + return -EINVAL; +} + +void qmp_blockdev_add(BlockdevOptions *options, Error **errp) +{ + int ret; + Transaction *tran =3D tran_new(); + g_autoptr(GSList) refresh_list =3D NULL; + + ret =3D blockdev_add(options, &refresh_list, tran, errp); + if (ret < 0) { + goto out; + } + + ret =3D bdrv_list_refresh_perms(refresh_list, NULL, tran, errp); + if (ret < 0) { + goto out; + } + +out: + tran_finalize(tran, ret); } =20 void qmp_blockdev_reopen(BlockdevOptionsList *reopen_list, Error **errp) diff --git a/qapi/transaction.json b/qapi/transaction.json index ea20df770c..000dd16bb7 100644 --- a/qapi/transaction.json +++ b/qapi/transaction.json @@ -67,7 +67,7 @@ 'block-dirty-bitmap-disable', 'block-dirty-bitmap-merge', 'blockdev-backup', 'blockdev-snapshot', 'blockdev-snapshot-internal-sync', 'blockdev-snapshot-sync', - 'blockdev-del', + 'blockdev-del', 'blockdev-add', { 'name': 'drive-backup', 'features': [ 'deprecated' ] } ] } =20 ## @@ -150,6 +150,13 @@ { 'struct': 'BlockdevDelWrapper', 'data': { 'data': 'BlockdevDel' } } =20 +## +# @BlockdevAddWrapper: +# +# Since: 7.1 +## +{ 'struct': 'BlockdevAddWrapper', + 'data': { 'data': 'BlockdevOptions' } } =20 ## # @TransactionAction: @@ -175,6 +182,7 @@ 'blockdev-snapshot-internal-sync': 'BlockdevSnapshotInternalWrapper= ', 'blockdev-snapshot-sync': 'BlockdevSnapshotSyncWrapper', 'blockdev-del': 'BlockdevDelWrapper', + 'blockdev-add': 'BlockdevAddWrapper', 'drive-backup': 'DriveBackupWrapper' } } =20 --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 164868437104228.47825820313153; Wed, 30 Mar 2022 16:52:51 -0700 (PDT) Received: from localhost ([::1]:39298 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZi7N-0000iB-TC for importer@patchew.org; Wed, 30 Mar 2022 19:52:50 -0400 Received: from eggs.gnu.org ([209.51.188.92]:35502) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZft8-0008IE-Se for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:30:00 -0400 Received: from [2a00:1450:4864:20::129] (port=35416 helo=mail-lf1-x129.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZft3-0003NZ-Rr for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:58 -0400 Received: by mail-lf1-x129.google.com with SMTP id h7so38098258lfl.2 for ; Wed, 30 Mar 2022 14:29:53 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=YgttVq7XsJvG6HYwqmkVhSUZyE4JOHmqbHIrKyk8iZY=; b=1tB9aVn4P7TBIdX1oe9uRO22zJrI06PievC8n456rtQCyxO0M1iAB2OslVrKB9NjoK PdYFvMPyTuk8Pa+uBK6bbzOx8DqpDk1O6tNi51SCeIbJK8H/jaA0Q/MQG3+WGYCsI2Er MJl0PaoIz/CejHW4rcRIum0yB1nkE0T/YCtvBhVr2U8rz7T9brsBFu0pIBaQ1XhGJgHv m2pLCKbuWYULRsLRQdwu1O7peKpfWkk6IIutMrAOh1tdKS4mU4kOzOTDLqfEUW1vv3Jh bFOMmYwdsM8/uhGelF7jI8HkVR3ItAj7AUhlV0Un3egadEX+sbY7ztkgQ2FqPaEC5mjB 0pZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=YgttVq7XsJvG6HYwqmkVhSUZyE4JOHmqbHIrKyk8iZY=; b=kjQ29AmNxdQt54dDaiEIv7sfo7ZpivVLm+mlaAKLwun1ca346SVJNl38L5HO2rOFWb 1t3DJYLhG5oEpos7jUJMFJZlnnsv+x8+jJqY9QXuWTrcN3U05+0ezujTDbeQU8dscy5e ctdGNVFVyIHqnC9Zm5XaOf5Ingt5S8jrM4EgpG37do3rAm6MlLQSE0oCF8DD23tIC+a+ 3E6G6CADDQ/2JZxjQ3fLO4dBX3RNV9Of6gZhvSnekJQgJyYYVkKaHQMrifItFbZ7QNY5 uNnYeFLzK5vPiQoVg1ePXqdGZZPaMPyDbbjBQ2y+mv1qTC43YWSv0wq1HAIFkaUIMfzU JoAw== X-Gm-Message-State: AOAM533aZtpJrl3gUzUuIcWxJfuWEwSi9fAaYISVaSrAjNNRhfrQHYuY Xiz51i6K1ooEc2iJz4ZVa8VKXQ== X-Google-Smtp-Source: ABdhPJzyS+aV4doppuCZPN5BMgVxVpldW9VbUkco0pCDDhBZ5EHEKvxrlAIDqD+FYo+Uvexzv7Hbew== X-Received: by 2002:a05:6512:25a:b0:44a:3f55:1746 with SMTP id b26-20020a056512025a00b0044a3f551746mr8245061lfo.122.1648675791455; Wed, 30 Mar 2022 14:29:51 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 32/45] iotests: add blockdev-add-transaction Date: Thu, 31 Mar 2022 00:28:49 +0300 Message-Id: <20220330212902.590099-33-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::129 (failed) 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=2a00:1450:4864:20::129; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lf1-x129.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:26 -0400 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: , Cc: kwolf@redhat.com, hreitz@redhat.com, vsementsov@openvz.org, v.sementsov-og@mail.ru, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648684371519100001 Content-Type: text/plain; charset="utf-8" Add a test for transaction support of blockdev-add. Test is format-agnostic, so limit it to qcow2 to avoid extra test runs. Signed-off-by: Vladimir Sementsov-Ogievskiy --- .../tests/blockdev-add-transaction | 52 +++++++++++++++++++ .../tests/blockdev-add-transaction.out | 6 +++ 2 files changed, 58 insertions(+) create mode 100755 tests/qemu-iotests/tests/blockdev-add-transaction create mode 100644 tests/qemu-iotests/tests/blockdev-add-transaction.out diff --git a/tests/qemu-iotests/tests/blockdev-add-transaction b/tests/qemu= -iotests/tests/blockdev-add-transaction new file mode 100755 index 0000000000..ce3c1c069b --- /dev/null +++ b/tests/qemu-iotests/tests/blockdev-add-transaction @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +# +# Test blockdev-add transaction action +# +# Copyright (c) 2022 Virtuozzo International GmbH. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +import iotests +from iotests import log + +iotests.script_initialize(supported_fmts=3D['qcow2']) + +with iotests.VM() as vm: + vm.launch() + + # Use same node-name for nodes, neither one should appear. + vm.qmp_log('transaction', actions=3D[ + {'type': 'blockdev-add', + 'data': {'node-name': 'node0', 'driver': 'null-co', + 'size': 1024 * 1024}}, + {'type': 'blockdev-add', + 'data': {'node-name': 'node0', 'driver': 'null-co', + 'size': 1024 * 1024}} + ]) + + n =3D len(vm.qmp('query-named-block-nodes')['return']) + log(f'Created {n} nodes') + + vm.qmp_log('transaction', actions=3D[ + {'type': 'blockdev-add', + 'data': {'node-name': 'node0', 'driver': 'null-co', + 'size': 1024 * 1024}}, + {'type': 'blockdev-add', + 'data': {'node-name': 'node1', 'driver': 'null-co', + 'size': 1024 * 1024}} + ]) + + n =3D len(vm.qmp('query-named-block-nodes')['return']) + log(f'Created {n} nodes') diff --git a/tests/qemu-iotests/tests/blockdev-add-transaction.out b/tests/= qemu-iotests/tests/blockdev-add-transaction.out new file mode 100644 index 0000000000..7e6cd5a9a3 --- /dev/null +++ b/tests/qemu-iotests/tests/blockdev-add-transaction.out @@ -0,0 +1,6 @@ +{"execute": "transaction", "arguments": {"actions": [{"data": {"driver": "= null-co", "node-name": "node0", "size": 1048576}, "type": "blockdev-add"}, = {"data": {"driver": "null-co", "node-name": "node0", "size": 1048576}, "typ= e": "blockdev-add"}]}} +{"error": {"class": "GenericError", "desc": "Duplicate nodes with node-nam= e=3D'node0'"}} +Created 0 nodes +{"execute": "transaction", "arguments": {"actions": [{"data": {"driver": "= null-co", "node-name": "node0", "size": 1048576}, "type": "blockdev-add"}, = {"data": {"driver": "null-co", "node-name": "node1", "size": 1048576}, "typ= e": "blockdev-add"}]}} +{"return": {}} +Created 2 nodes --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648684430801762.1133786026923; Wed, 30 Mar 2022 16:53:50 -0700 (PDT) Received: from localhost ([::1]:41790 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZi8L-0002NY-DA for importer@patchew.org; Wed, 30 Mar 2022 19:53:49 -0400 Received: from eggs.gnu.org ([209.51.188.92]:35416) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZft7-0008HA-4e for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:58 -0400 Received: from [2a00:1450:4864:20::12c] (port=42538 helo=mail-lf1-x12c.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZft3-0003NQ-Ml for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:56 -0400 Received: by mail-lf1-x12c.google.com with SMTP id d5so38070828lfj.9 for ; Wed, 30 Mar 2022 14:29:53 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=PYEWypywAd4uJaDSkR3S94BPshZVhwkXw90EpvCll0k=; b=G4nobmCWAOhtg5is5Wp3ir+MH70+E95IgqOnHW2ght++jS1Ri4Jv3weYL8PCGzm2Bc C8j8hOHk3LqULiQ9PalG7Z+r5eS9rOLTPMMqnKuOMd604tjF1KGTcG1p2KgQhN8gh1FH f6SCJgnWNW1TtQ3OMWZr2wAbwKLy4CpFfkReLQx9LnWflBgUeF2U1TM9eUTFQytK+cP0 BgxBBDU8EBGdlN3apZWXVuienPIYCPOb1KicRadwcDyWyPsmrJOOnfb0WTYo1yZ4zWmI OePBOr69s7tfsJaki+MWAqcWGMWlNjC36noA0zIHglWmf+FXzjPwKGmaKkOG0IxXyVzt uqDA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=PYEWypywAd4uJaDSkR3S94BPshZVhwkXw90EpvCll0k=; b=1MHp7zBxb2hkErwIrHnBlCNSkwwAWNyyITDcMloiO0m/ygCmIlFWFmYHISAXpeC2Zh jfkGmSMw/1vQhX+cnqj3nTaNzd96mZNPGBvXr+yiAfGAanaiZPPf+bQMiOq5YkaEbN4k PazViMdVPnAAySWd6gu/Y3nw5ZVSJ/FsvI+4XdK2hpL6y/6mHGhWisu89EP550c874X0 lR+zhaQymO+WTG0i5MBzRsShxNAtnZLoWekus7tASLEcdccdn/FuNowDRffHa2ENb0iE iy8EmomwTugrMfh79u0K6uiPZB454JqZy2l48SJX6gF874WWAIjGluwRyw5Wsyt/oL7E 8d2Q== X-Gm-Message-State: AOAM532LvcikItJmePgaKe664lApKg/eZUZfEe3uqIukRb26x3Jv9wFf xyT5DKvogeza9hC6B3FZgj9cbg== X-Google-Smtp-Source: ABdhPJxQ0ZdwAa7jHEldvWvcIVY11VNtShCb0ijeCrzlZEaSvveKOjSpsMizkr0NXHyuNugh63zN2Q== X-Received: by 2002:ac2:46e2:0:b0:44a:3e96:3a15 with SMTP id q2-20020ac246e2000000b0044a3e963a15mr8414678lfo.336.1648675792067; Wed, 30 Mar 2022 14:29:52 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 33/45] block-backend: blk_root(): drop const specifier on return type Date: Thu, 31 Mar 2022 00:28:50 +0300 Message-Id: <20220330212902.590099-34-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::12c (failed) 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=2a00:1450:4864:20::12c; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lf1-x12c.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:26 -0400 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: , Cc: kwolf@redhat.com, hreitz@redhat.com, vsementsov@openvz.org, v.sementsov-og@mail.ru, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648684432133100001 Content-Type: text/plain; charset="utf-8" We'll need get non-const child pointer for graph modifications in further commits. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block/block-backend.c | 2 +- include/sysemu/block-backend-global-state.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/block/block-backend.c b/block/block-backend.c index e0e1aff4b1..f5476bb9fc 100644 --- a/block/block-backend.c +++ b/block/block-backend.c @@ -2618,7 +2618,7 @@ int coroutine_fn blk_co_copy_range(BlockBackend *blk_= in, int64_t off_in, bytes, read_flags, write_flags); } =20 -const BdrvChild *blk_root(BlockBackend *blk) +BdrvChild *blk_root(BlockBackend *blk) { GLOBAL_STATE_CODE(); return blk->root; diff --git a/include/sysemu/block-backend-global-state.h b/include/sysemu/b= lock-backend-global-state.h index 2e93a74679..0ee6dced99 100644 --- a/include/sysemu/block-backend-global-state.h +++ b/include/sysemu/block-backend-global-state.h @@ -109,7 +109,7 @@ void blk_set_force_allow_inactivate(BlockBackend *blk); void blk_register_buf(BlockBackend *blk, void *host, size_t size); void blk_unregister_buf(BlockBackend *blk, void *host); =20 -const BdrvChild *blk_root(BlockBackend *blk); +BdrvChild *blk_root(BlockBackend *blk); =20 int blk_make_empty(BlockBackend *blk, Error **errp); =20 --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648684551836830.7527499425956; Wed, 30 Mar 2022 16:55:51 -0700 (PDT) Received: from localhost ([::1]:50270 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZiAI-0007zi-P6 for importer@patchew.org; Wed, 30 Mar 2022 19:55:50 -0400 Received: from eggs.gnu.org ([209.51.188.92]:35512) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZft8-0008IH-VR for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:30:00 -0400 Received: from [2a00:1450:4864:20::234] (port=41636 helo=mail-lj1-x234.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZft4-0003Ns-9d for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:58 -0400 Received: by mail-lj1-x234.google.com with SMTP id 17so29456693ljw.8 for ; Wed, 30 Mar 2022 14:29:53 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=YAkCwHsQwrIG2ydiqn7fJ/NYS3bLCPh00tQPn4N14mc=; b=oJOoLdL3hF3hAGuVofUlZ7YX/siwW8pkeetbjVuQ2PaiMzBwjM+nZlxMB15Wh30vmG 0TDb37QbhjpAZSuNH8ffDoP6HC+1LlU8EXrg+fpn2zSCT+7jmjuZETKQhkf5ayArhQYz ll+I6w/3Fw5nyu0zToNE0BZFSLKqpPJ2bcCWPURDMT4/zAAYCDhF898EFOlqMByKnVXH PZwdHzgTY1j9xduClAjP8WS6c3O86qBUpj3foQ8uXcoSxB0CXMN1u0yMiTB+nZQ5EydO ABYNS5bG3/mekc9IwYwIYD+lusxTxt3OWBi+bIVB4XO5v+dq8G4j0ilTafEUUxa5J2jf Js8g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=YAkCwHsQwrIG2ydiqn7fJ/NYS3bLCPh00tQPn4N14mc=; b=VuEYv7YgkUt/HDJttbh1xP7u1PTS6IBBE/5W1og7hElHveq/SMWRbJ5WEq6Bnr009k fewGiFCXsQb5tYqYUdwaLJTHsy6LK6zMYJCMoirFbArHoyybKRIgW9S3gS/NH2d8ghyA tz6UNtLgfYQTxOaVAC6UY+QVYmhSpNaWC6rJIlwkQ/KRANjFB0AWBXmyZhptB6QWZJiQ Wr7Y9q7zNhh0OriZJqYJwEqKpuZ6VQ6ryiZAo6bQxnqswJqPQVR0hUE8SNZ5NP40dOw/ Xkn4ct8c1YnOwfFdVI43OlUViBv8bZkSoSYGmuihTQH/bBcdQiaRvqbuwl8+c3jM4k44 x16g== X-Gm-Message-State: AOAM532BNGNUDORoBAoDhuH5YUsCnXphlaO+ujS/FYD4hpm5NxLs8Crw rCwqAC5rbIwUi4UwAVPW38SCUBW7CpYuow== X-Google-Smtp-Source: ABdhPJwvwLszQxBVHJNYV8+E5uB88SKNpzXQYe9tiSSqsTocotNVVH0xEe8hyUjr+LPLXOX6eOGIZg== X-Received: by 2002:a2e:97c9:0:b0:24a:f64d:e67d with SMTP id m9-20020a2e97c9000000b0024af64de67dmr961713ljj.115.1648675792651; Wed, 30 Mar 2022 14:29:52 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 34/45] block/export: add blk_by_export_id() Date: Thu, 31 Mar 2022 00:28:51 +0300 Message-Id: <20220330212902.590099-35-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::234 (failed) 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=2a00:1450:4864:20::234; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lj1-x234.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:26 -0400 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: , Cc: kwolf@redhat.com, hreitz@redhat.com, vsementsov@openvz.org, v.sementsov-og@mail.ru, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648684552663100003 Content-Type: text/plain; charset="utf-8" Signed-off-by: Vladimir Sementsov-Ogievskiy --- block/export/export.c | 18 ++++++++++++++++++ include/sysemu/block-backend-global-state.h | 1 + 2 files changed, 19 insertions(+) diff --git a/block/export/export.c b/block/export/export.c index 7253af3bc3..66e62f0074 100644 --- a/block/export/export.c +++ b/block/export/export.c @@ -362,3 +362,21 @@ BlockExportInfoList *qmp_query_block_exports(Error **e= rrp) =20 return head; } + +BlockBackend *blk_by_export_id(const char *id, Error **errp) +{ + BlockExport *exp; + + exp =3D blk_exp_find(id); + if (exp =3D=3D NULL) { + error_setg(errp, "Export '%s' not found", id); + return NULL; + } + + if (!exp->blk) { + error_setg(errp, "Export '%s' is empty", id); + return NULL; + } + + return exp->blk; +} diff --git a/include/sysemu/block-backend-global-state.h b/include/sysemu/b= lock-backend-global-state.h index 0ee6dced99..ea1a93d787 100644 --- a/include/sysemu/block-backend-global-state.h +++ b/include/sysemu/block-backend-global-state.h @@ -58,6 +58,7 @@ void blk_detach_dev(BlockBackend *blk, DeviceState *dev); DeviceState *blk_get_attached_dev(BlockBackend *blk); BlockBackend *blk_by_dev(void *dev); BlockBackend *blk_by_qdev_id(const char *id, Error **errp); +BlockBackend *blk_by_export_id(const char *id, Error **errp); void blk_set_dev_ops(BlockBackend *blk, const BlockDevOps *ops, void *opaq= ue); =20 void blk_activate(BlockBackend *blk, Error **errp); --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648684348951983.7054102675646; Wed, 30 Mar 2022 16:52:28 -0700 (PDT) Received: from localhost ([::1]:37820 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZi71-0008A4-Fk for importer@patchew.org; Wed, 30 Mar 2022 19:52:27 -0400 Received: from eggs.gnu.org ([209.51.188.92]:35558) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZft9-0008IK-Lk for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:30:00 -0400 Received: from [2a00:1450:4864:20::12c] (port=43745 helo=mail-lf1-x12c.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZft6-0003PS-MO for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:59 -0400 Received: by mail-lf1-x12c.google.com with SMTP id z12so24288655lfu.10 for ; Wed, 30 Mar 2022 14:29:55 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=bq+hFgyIVkP5E/EDUg3vF2NH71m8OlRAUrnTOSSkVBY=; b=hCabyCe7geCpUwS9CMoi+QB8KHxgf7oypB7SdHjNL/+VV2MK4dj8SzuWAevWbgdBaj qpX4SThWTSnm3kUACn4fegbe1o2olSjUx97NjabbAYIFM8UxyvGvUFsW0UzQ2prUBdNd tlEmEGAHciA2pY4wwof7fD+q9GqtX8csYWCdSu7+eF7yFPvrbt/4kjR2bX7zjIiVqKnO bwyxstXVIvPE5dvrHnKheuzxcZDIKNTE0ra0emj21c3pUaW3uUIzv72USOQkxrYWS0f+ /ndKOCp04tvD1ecH4I/riftrjvjAqGxCpnhGjhiGO8oMdjs/gQs2ToY1Eu4jmHpRQREQ 4sqA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=bq+hFgyIVkP5E/EDUg3vF2NH71m8OlRAUrnTOSSkVBY=; b=lnx6fNvqxU0RYFu4H7+fxunfaiSsV0+oiEq7JFQtXDwf376c/RAGllI8PFWYLxm+M9 YbNckz6JDbGmstBPSbvuTU0foJzpasovicyaNwB853RwvGaHllJ56MhJdY/7o4syUo0/ UAXKDF24cCXWswxBCfUfw+xXGZ8dargoclMr4MQQA08xPN5bZCb+1Jrq1trj4Kkryi9B /v3sVB0zSkHEvYu6IydxUNN65ocpLVyuiDLHkUwD1sjFtofBcgST2Y/Qx5Mh5Fq83cUN OH9kp5XRXcCbWQw1J+GHNokWZfTpBNoHYWVb7pj7e47UN0Os9HnySF9N1nbUNEJxRDMO TPUg== X-Gm-Message-State: AOAM5319AFtWGUhH/JM/rJcF/3yj/7XrJVhyKgWxohGlCPTy8CG/joGq Xdn+UOdjNkZGUFyCVg0jATq0nQ== X-Google-Smtp-Source: ABdhPJxZYaPNl9PRdk4fbRcjK5UaEfQCdh9Q6gcTvN8AhAtdgyEiqQo0y7roYFvF7gk7Ly6uGt0G+Q== X-Received: by 2002:a05:6512:2214:b0:44a:348a:d6d with SMTP id h20-20020a056512221400b0044a348a0d6dmr8410856lfu.506.1648675793278; Wed, 30 Mar 2022 14:29:53 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 35/45] block: make bdrv_find_child() function public Date: Thu, 31 Mar 2022 00:28:52 +0300 Message-Id: <20220330212902.590099-36-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::12c (failed) 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=2a00:1450:4864:20::12c; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lf1-x12c.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:26 -0400 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: , Cc: kwolf@redhat.com, v.sementsov-og@mail.ru, qemu-devel@nongnu.org, Markus Armbruster , hreitz@redhat.com, vsementsov@openvz.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648684349387100001 Content-Type: text/plain; charset="utf-8" To be reused soon. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block.c | 13 +++++++++++++ blockdev.c | 14 -------------- include/block/block_int-io.h | 1 + 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/block.c b/block.c index 17c057a962..9e1be402e2 100644 --- a/block.c +++ b/block.c @@ -8039,6 +8039,19 @@ int bdrv_make_empty(BdrvChild *c, Error **errp) return 0; } =20 +BdrvChild *bdrv_find_child(BlockDriverState *parent_bs, const char *child_= name) +{ + BdrvChild *child; + + QLIST_FOREACH(child, &parent_bs->children, next) { + if (strcmp(child->name, child_name) =3D=3D 0) { + return child; + } + } + + return NULL; +} + /* * Return the child that @bs acts as an overlay for, and from which data m= ay be * copied in COW or COR operations. Usually this is the backing file. diff --git a/blockdev.c b/blockdev.c index 3afd2ceea8..abd0600d15 100644 --- a/blockdev.c +++ b/blockdev.c @@ -3672,20 +3672,6 @@ out: tran_finalize(tran, ret); } =20 -static BdrvChild *bdrv_find_child(BlockDriverState *parent_bs, - const char *child_name) -{ - BdrvChild *child; - - QLIST_FOREACH(child, &parent_bs->children, next) { - if (strcmp(child->name, child_name) =3D=3D 0) { - return child; - } - } - - return NULL; -} - void qmp_x_blockdev_change(const char *parent, bool has_child, const char *child, bool has_node, const char *node, Error **errp) diff --git a/include/block/block_int-io.h b/include/block/block_int-io.h index bb454200e5..0ce5eaf9a2 100644 --- a/include/block/block_int-io.h +++ b/include/block/block_int-io.h @@ -122,6 +122,7 @@ int coroutine_fn bdrv_co_copy_range_to(BdrvChild *src, = int64_t src_offset, =20 int refresh_total_sectors(BlockDriverState *bs, int64_t hint); =20 +BdrvChild *bdrv_find_child(BlockDriverState *parent_bs, const char *child_= name); BdrvChild *bdrv_cow_child(BlockDriverState *bs); BdrvChild *bdrv_filter_child(BlockDriverState *bs); BdrvChild *bdrv_filter_or_cow_child(BlockDriverState *bs); --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648684505483275.3058279973326; Wed, 30 Mar 2022 16:55:05 -0700 (PDT) Received: from localhost ([::1]:47186 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZi9Y-0005uK-Ds for importer@patchew.org; Wed, 30 Mar 2022 19:55:04 -0400 Received: from eggs.gnu.org ([209.51.188.92]:35508) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZft8-0008IG-Ti for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:30:00 -0400 Received: from [2a00:1450:4864:20::12d] (port=37758 helo=mail-lf1-x12d.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZft6-0003P9-KE for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:58 -0400 Received: by mail-lf1-x12d.google.com with SMTP id k21so38085605lfe.4 for ; Wed, 30 Mar 2022 14:29:55 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=3kgbncAbR+L+SPnsiq1IjgIb9WpA6vR5yyOkbJ3O8uw=; b=jJB7IR1dOegD5PkhLlG0lAJyobd9YPLfTnfN1XRjWwMmiks26rjRdbD5DKbwtu6x33 kb1dHm3waTQR7I46vYRBPX4EqoRP1eMgFo+MLPFODPVCHG118bAXDHAR8nn9LZb1+Hew EUsxOhA1bFKldplAGoU+SlMf4BS4RqqHxIWau2jB6okqBLihmDxuBd5MqdRHPwvqDa2u wMqSs3pMpzRw1tbs5RjKsRPToWZuRgPxb3+iFdT9PKSQd9iIFM/UgSdbnaOxs7Duu8Sh UI012bZPI0Fr+A991WbiEqbZDaxQ3x9oF5zM8iW7HePM4V+VcWc8OoKNIdfydeiMejTA Sa8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=3kgbncAbR+L+SPnsiq1IjgIb9WpA6vR5yyOkbJ3O8uw=; b=rJXwI4yTYFPpedKaRxnyRrewbob92gZgNGykr9P9inMFVi6L4cJUYPf1X0i1sjXN7Y 4+kECWWKnLg9Ql+XS5MErmVZ2gHqlWf2t8yY07fdR2pJ5ub1MiHyEiOA2ZR2MHHKrZpN Vc36+SRZtrWPE216IlfN8xqIYAn6J0Ggpp1daAOa6WbBhfVWTPg+NOOcywfehv5Kl/z4 BCrkQ4HR22DzS9/22q1rWIjjr/+0p7UmxYobY8TlsFVRBSOnNDiuHCGuLEqTy791BPfk deWriUhbjq8rd/IkD930+A3Dnz5cjZ9GSJHQ1WqvCWaJ5S40R7SoE8W668q49sVjtfpX dvXw== X-Gm-Message-State: AOAM532iSGE1x1ubi09BoZMI0V3rLPl0rnordOk52E6gmEOS2ieMIBoi Ql56EF3rMOz9fSkPeWW8UR6etg== X-Google-Smtp-Source: ABdhPJzKTYwp6AnEt/k1KYQkHMowAbeesrjFjeT2FnaZVrGjWxlWXVSLIJ/S7Oi0uRYrIFCQd14zjQ== X-Received: by 2002:a05:6512:1383:b0:44a:69a9:d336 with SMTP id p3-20020a056512138300b0044a69a9d336mr8226428lfa.493.1648675793867; Wed, 30 Mar 2022 14:29:53 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 36/45] block: bdrv_replace_child_bs(): move to external transaction Date: Thu, 31 Mar 2022 00:28:53 +0300 Message-Id: <20220330212902.590099-37-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::12d (failed) 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=2a00:1450:4864:20::12d; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lf1-x12d.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:26 -0400 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: , Cc: kwolf@redhat.com, hreitz@redhat.com, vsementsov@openvz.org, v.sementsov-og@mail.ru, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648684506410100003 Content-Type: text/plain; charset="utf-8" We'll need this functionality as part of external transaction, so make the whole function to be transaction action. For this we need to introduce a transaction action helper: bdrv_drained(), which calls bdrv_drained_begin() and postpone bdrv_drained_end() to .clean() phase. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block.c | 42 +++++++++++++++++++----------- block/block-backend.c | 9 ++++++- include/block/block-global-state.h | 2 +- 3 files changed, 36 insertions(+), 17 deletions(-) diff --git a/block.c b/block.c index 9e1be402e2..4b5b7d8794 100644 --- a/block.c +++ b/block.c @@ -5341,32 +5341,44 @@ out: return ret; } =20 +static void bdrv_drained_clean(void *opaque) +{ + BlockDriverState *bs =3D opaque; + + bdrv_drained_end(bs); + bdrv_unref(bs); +} + +TransactionActionDrv bdrv_drained_drv =3D { + .clean =3D bdrv_drained_clean, +}; + +/* + * Start drained section on @bs, and finish it in .clean action. + * Reference to @bs is kept, so @bs can't be removed during transaction. + */ +static void bdrv_drained(BlockDriverState *bs, Transaction *tran) +{ + bdrv_ref(bs); + bdrv_drained_begin(bs); + tran_add(tran, &bdrv_drained_drv, bs); +} + /* Not for empty child */ int bdrv_replace_child_bs(BdrvChild *child, BlockDriverState *new_bs, - Error **errp) + Transaction *tran, Error **errp) { - int ret; - Transaction *tran =3D tran_new(); g_autoptr(GSList) refresh_list =3D NULL; BlockDriverState *old_bs =3D child->bs; =20 GLOBAL_STATE_CODE(); =20 - bdrv_ref(old_bs); - bdrv_drained_begin(old_bs); - bdrv_drained_begin(new_bs); + bdrv_drained(old_bs, tran); + bdrv_drained(new_bs, tran); =20 bdrv_replace_child_tran(child, new_bs, &refresh_list, tran); =20 - ret =3D bdrv_list_refresh_perms(refresh_list, NULL, tran, errp); - - tran_finalize(tran, ret); - - bdrv_drained_end(old_bs); - bdrv_drained_end(new_bs); - bdrv_unref(old_bs); - - return ret; + return bdrv_list_refresh_perms(refresh_list, NULL, tran, errp); } =20 static void bdrv_delete(BlockDriverState *bs) diff --git a/block/block-backend.c b/block/block-backend.c index f5476bb9fc..fa1d810da2 100644 --- a/block/block-backend.c +++ b/block/block-backend.c @@ -929,8 +929,15 @@ int blk_insert_bs(BlockBackend *blk, BlockDriverState = *bs, Error **errp) */ int blk_replace_bs(BlockBackend *blk, BlockDriverState *new_bs, Error **er= rp) { + int ret; + Transaction *tran =3D tran_new(); + GLOBAL_STATE_CODE(); - return bdrv_replace_child_bs(blk->root, new_bs, errp); + + ret =3D bdrv_replace_child_bs(blk->root, new_bs, tran, errp); + tran_finalize(tran, ret); + + return ret; } =20 /* diff --git a/include/block/block-global-state.h b/include/block/block-globa= l-state.h index 8527bcad28..fa5f698228 100644 --- a/include/block/block-global-state.h +++ b/include/block/block-global-state.h @@ -65,7 +65,7 @@ int bdrv_append(BlockDriverState *bs_new, BlockDriverStat= e *bs_top, int bdrv_replace_node(BlockDriverState *from, BlockDriverState *to, Error **errp); int bdrv_replace_child_bs(BdrvChild *child, BlockDriverState *new_bs, - Error **errp); + Transaction *tran, Error **errp); BlockDriverState *bdrv_insert_node(BlockDriverState *bs, QDict *node_optio= ns, int flags, Error **errp); int bdrv_drop_filter(BlockDriverState *bs, Error **errp); --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648684145457710.3071815998223; Wed, 30 Mar 2022 16:49:05 -0700 (PDT) Received: from localhost ([::1]:58108 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZi3j-0002kx-Eq for importer@patchew.org; Wed, 30 Mar 2022 19:49:03 -0400 Received: from eggs.gnu.org ([209.51.188.92]:35580) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZftA-0008IN-6E for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:30:00 -0400 Received: from [2a00:1450:4864:20::22d] (port=36668 helo=mail-lj1-x22d.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZft6-0003Pk-Ov for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:59 -0400 Received: by mail-lj1-x22d.google.com with SMTP id v12so16756536ljd.3 for ; Wed, 30 Mar 2022 14:29:55 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=KurEVHXow2yH4y+d6s9f9y3Oj56lCs+gGDawVxW2VD0=; b=ObC+z1ROHIjBpEcEnh4MUjFxjR9BhJSF/YZTTE8d5P/aLuOhk9xb6BwZeyYf5jhTka ebJY+M1AjGfLUBnTBHBsR8t4cN5Ap20DIQue+sVxX0eDIOi5aOZ/yLpuaKCdFwQn5gJ1 1H+X2MSfDmKS1Zwsx3gbXw/cKFoRA0iJAoeyPMp0/tscLYEbxiw0mWIjymbcrznMFwXe JKZI5Cv+wl1HFypcgqrbGvd1+v5CQSb8gYeJoSSlGNZeWFl+KDJ5NSu9CJKtDo/KqxTU Xfj+30dKqRnkiRluK0G4V6Xa7AI2CHxUZzrZmCF/8fSSrgnJUHVX2Htv1fxfoc5X8VHn 9kxQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=KurEVHXow2yH4y+d6s9f9y3Oj56lCs+gGDawVxW2VD0=; b=i7Z3gwPERXQJ/eiJBN+TYK8Ydz9yieWmgCinEnex9EHCjHt3D80ZQoYExUO86b8X0Z JoJPWbTTmZ4QUe8D3xo6MVONalwyVPJW9fowERMQX5XtlcEl/AIejEdiSAw7nCzb/uNY DWa8RRSLnbX0DLURv/29DY48ynEX6BLSdm0GxoW8ysz35MgU032sxp/Uh6gRW+72AASI bOua6jpKYrDzaK/quzBR9emBTU110tWMIH56UIQgE2d9Yj8IsEHyrbATu467v/zh1ZKw v/Z6B81JRsVNeszo6ozXsTsQ/hoVq80ve+0zvU7kpdgHw9gK5u/DqNEyzPlrhBiaBCUI XAOQ== X-Gm-Message-State: AOAM5332dNbghsQOc5aqN2Pl/l/7QSzxoZP8wos2eBiKQsKe9fFYOBT0 PHRCxqagj0A3MHrVbTu6K2qbRQ== X-Google-Smtp-Source: ABdhPJxq3SKodzL5vJ7qs1oYAlrm/U9z2KMOHdv3ca5K1CpKlg/r38paNAVTH/erkno2szCFdXrrPA== X-Received: by 2002:a05:651c:17a3:b0:245:f39e:f2d2 with SMTP id bn35-20020a05651c17a300b00245f39ef2d2mr8572189ljb.490.1648675794557; Wed, 30 Mar 2022 14:29:54 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 37/45] qapi: add x-blockdev-replace command Date: Thu, 31 Mar 2022 00:28:54 +0300 Message-Id: <20220330212902.590099-38-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::22d (failed) 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=2a00:1450:4864:20::22d; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lj1-x22d.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:26 -0400 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: , Cc: kwolf@redhat.com, v.sementsov-og@mail.ru, qemu-devel@nongnu.org, Markus Armbruster , hreitz@redhat.com, vsementsov@openvz.org, Paolo Bonzini , Eric Blake Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648684146070100003 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 --- blockdev.c | 65 ++++++++++++++++++++++++++++++++++++++++++ qapi/block-core.json | 62 ++++++++++++++++++++++++++++++++++++++++ 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/blockdev.c b/blockdev.c index abd0600d15..3d84cb6f92 100644 --- a/blockdev.c +++ b/blockdev.c @@ -2166,6 +2166,71 @@ static void abort_commit(void *opaque) g_assert_not_reached(); /* this action never succeeds */ } =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 void transaction_action(TransactionAction *act, JobTxn *block_job_t= xn, GSList **refresh_list, Transaction *tran, Error **errp) diff --git a/qapi/block-core.json b/qapi/block-core.json index d915cddde9..6e944e4f52 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -5592,3 +5592,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/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 6f80fec761..9924810a23 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.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 16486845061481008.3553800221123; Wed, 30 Mar 2022 16:55:06 -0700 (PDT) Received: from localhost ([::1]:47254 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZi9Z-0005ws-5c for importer@patchew.org; Wed, 30 Mar 2022 19:55:05 -0400 Received: from eggs.gnu.org ([209.51.188.92]:35584) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZftA-0008IO-8g for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:30:00 -0400 Received: from [2a00:1450:4864:20::131] (port=38558 helo=mail-lf1-x131.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZft6-0003QC-TD for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:29:59 -0400 Received: by mail-lf1-x131.google.com with SMTP id bq24so22131956lfb.5 for ; Wed, 30 Mar 2022 14:29:56 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=eRcFZ8JsBZ9kpWAgM/aAMIUmqQs4ch467o2iNBnzs3k=; b=sUEt9P9QatO9Bn3Y3mjhcEBvBlGTfUIGuusnZS15MdTF+R2kOYDL36UVpWSS7UzmAX LbAMRkX/QiEtCgB+dRr9CNrDHWc1dveI5PFGasOgfke2bDRI9bIYIVqW8+mpydmOlh2m pl0zRonKiRaNS/H3G1FhIx9GwOy9+gZqXO1XwqCvKi2n2k8xkxvBCTk0LjDLIoxGbeRH 39Xr7hYyF8+EJAOoH4zMQQlrPFBETkYKGQWtnrUyTbFgkrN8JaBcbWMJHub4GkhLdY/I GentwVriG6+exjsw7vkwdGsHRTUQfuuLPcXzgHbgbYt9TJHno/ML/2yUJd0BNhg/u1Zp klkw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=eRcFZ8JsBZ9kpWAgM/aAMIUmqQs4ch467o2iNBnzs3k=; b=AQYLfsOSVt4kn3pIIcLSpB++V6EW19K5uFi7nV3wM58boGUqDwmt6ZjT7BdyA5aD0T YWT0UMLbw09bbvUc89a4VxtVy1hAQUi6MOZIvxDBxJK8YEXeIx6EOS0KFJpuwjF24ejY YuF24gpWKCrpKxtoZPcQ0yI0BSb6LvCm40PS9x8bdUqklCIJ3ve/G2yE/l0zi3cxzJQE O+c8z30L9ipNHPKo5NxvYbAxNscvf3SeJmHbevy+DppPYw3Cup9zzivd2klUs2tnjfZt 5e/9Oi+GXG/kN7UuqfkFlcQFFji6mY85jVnX0dNcytQ2VTaPIrT4M2hQEDNmXIHXJ1qt lbiw== X-Gm-Message-State: AOAM5300dMSjltCG8JMBiN0QBzeTSjQAXJHGw77TGDgeI7koEs+x8579 rOAucLdddooPY6BtfZo94KpHqw== X-Google-Smtp-Source: ABdhPJyok+hEsXpFFgQ5CkuX5DBEsgatUMsFuz2/o612RZJz3rAKGsvzE3RxloP8SbtpWgclsS4WeQ== X-Received: by 2002:ac2:5d65:0:b0:44a:6d14:4ff8 with SMTP id h5-20020ac25d65000000b0044a6d144ff8mr8662694lft.605.1648675795246; Wed, 30 Mar 2022 14:29:55 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 38/45] qapi: add x-blockdev-replace transaction action Date: Thu, 31 Mar 2022 00:28:55 +0300 Message-Id: <20220330212902.590099-39-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::131 (failed) 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=2a00:1450:4864:20::131; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lf1-x131.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:26 -0400 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: , Cc: kwolf@redhat.com, v.sementsov-og@mail.ru, qemu-devel@nongnu.org, Markus Armbruster , hreitz@redhat.com, vsementsov@openvz.org, Eric Blake Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648684506381100001 Content-Type: text/plain; charset="utf-8" Support blockdev-replace in a transaction. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block.c | 4 ++-- blockdev.c | 29 ++++++++++++++++++++++++----- include/block/block-global-state.h | 2 ++ qapi/transaction.json | 15 ++++++++++++++- 4 files changed, 42 insertions(+), 8 deletions(-) diff --git a/block.c b/block.c index 4b5b7d8794..efe0ec0f00 100644 --- a/block.c +++ b/block.c @@ -2381,8 +2381,8 @@ static TransactionActionDrv bdrv_replace_child_drv = =3D { }; =20 /* Caller is responsible to refresh permissions in @refresh_list */ -static void bdrv_replace_child_tran(BdrvChild *child, BlockDriverState *ne= w_bs, - GSList **refresh_list, Transaction *tr= an) +void bdrv_replace_child_tran(BdrvChild *child, BlockDriverState *new_bs, + GSList **refresh_list, Transaction *tran) { BdrvReplaceChildState *s =3D g_new(BdrvReplaceChildState, 1); *s =3D (BdrvReplaceChildState) { diff --git a/blockdev.c b/blockdev.c index 3d84cb6f92..89167fbc08 100644 --- a/blockdev.c +++ b/blockdev.c @@ -2166,8 +2166,9 @@ static void abort_commit(void *opaque) g_assert_not_reached(); /* this action never succeeds */ } =20 -static int blockdev_replace(BlockdevReplace *repl, Transaction *tran, - Error **errp) +/* Caller is responsible to update permission of nodes added to @update_li= st */ +static int blockdev_replace(BlockdevReplace *repl, GSList **refresh_list, + Transaction *tran, Error **errp) { BdrvChild *child =3D NULL; BlockDriverState *new_child_bs; @@ -2220,14 +2221,27 @@ static int blockdev_replace(BlockdevReplace *repl, = Transaction *tran, return -EINVAL; } =20 - return bdrv_replace_child_bs(child, new_child_bs, tran, errp); + bdrv_replace_child_tran(child, new_child_bs, refresh_list, tran); + return 0; } =20 void qmp_x_blockdev_replace(BlockdevReplace *repl, Error **errp) { + int ret; Transaction *tran =3D tran_new(); - int ret =3D blockdev_replace(repl, tran, errp); + g_autoptr(GSList) update_list =3D NULL; + + ret =3D blockdev_replace(repl, &update_list, tran, errp); + if (ret < 0) { + goto out; + } =20 + ret =3D bdrv_list_refresh_perms(update_list, NULL, tran, errp); + if (ret < 0) { + goto out; + } + +out: tran_finalize(tran, ret); } =20 @@ -2287,6 +2301,10 @@ static void transaction_action(TransactionAction *ac= t, JobTxn *block_job_txn, blockdev_add(act->u.blockdev_add.data, refresh_list, tran, errp); return; + case TRANSACTION_ACTION_KIND_X_BLOCKDEV_REPLACE: + blockdev_replace(act->u.x_blockdev_replace.data, + refresh_list, tran, errp); + return; /* * Where are transactions for MIRROR, COMMIT and STREAM? * Although these blockjobs use transaction callbacks like the backup = job, @@ -2355,7 +2373,8 @@ void qmp_transaction(TransactionActionList *actions, =20 if (refresh_list && type !=3D TRANSACTION_ACTION_KIND_BLOCKDEV_DEL && - type !=3D TRANSACTION_ACTION_KIND_BLOCKDEV_ADD) + type !=3D TRANSACTION_ACTION_KIND_BLOCKDEV_ADD && + type !=3D TRANSACTION_ACTION_KIND_X_BLOCKDEV_REPLACE) { ret =3D bdrv_list_refresh_perms(refresh_list, NULL, tran, errp= ); if (ret < 0) { diff --git a/include/block/block-global-state.h b/include/block/block-globa= l-state.h index fa5f698228..253cc28a9a 100644 --- a/include/block/block-global-state.h +++ b/include/block/block-global-state.h @@ -66,6 +66,8 @@ int bdrv_replace_node(BlockDriverState *from, BlockDriver= State *to, Error **errp); int bdrv_replace_child_bs(BdrvChild *child, BlockDriverState *new_bs, Transaction *tran, Error **errp); +void bdrv_replace_child_tran(BdrvChild *child, BlockDriverState *new_bs, + GSList **refresh_list, Transaction *tran); BlockDriverState *bdrv_insert_node(BlockDriverState *bs, QDict *node_optio= ns, int flags, Error **errp); int bdrv_drop_filter(BlockDriverState *bs, Error **errp); diff --git a/qapi/transaction.json b/qapi/transaction.json index 000dd16bb7..61cb2d2312 100644 --- a/qapi/transaction.json +++ b/qapi/transaction.json @@ -54,10 +54,13 @@ # @blockdev-snapshot-sync: since 1.1 # @drive-backup: Since 1.6 # @blockdev-del: since 7.1 +# @blockdev-add: since 7.1 +# @x-blockdev-replace: since 7.1 # # Features: # @deprecated: Member @drive-backup is deprecated. Use member # @blockdev-backup instead. +# @unstable: Member @x-blockdev-replace is experimental # # Since: 1.1 ## @@ -68,6 +71,7 @@ 'blockdev-backup', 'blockdev-snapshot', 'blockdev-snapshot-internal-sync', 'blockdev-snapshot-sync', 'blockdev-del', 'blockdev-add', + { 'name': 'x-blockdev-replace', 'features': [ 'unstable' ] }, { 'name': 'drive-backup', 'features': [ 'deprecated' ] } ] } =20 ## @@ -158,6 +162,14 @@ { 'struct': 'BlockdevAddWrapper', 'data': { 'data': 'BlockdevOptions' } } =20 +## +# @BlockdevReplaceWrapper: +# +# Since: 7.1 +## +{ 'struct': 'BlockdevReplaceWrapper', + 'data': { 'data': 'BlockdevReplace' } } + ## # @TransactionAction: # @@ -183,7 +195,8 @@ 'blockdev-snapshot-sync': 'BlockdevSnapshotSyncWrapper', 'blockdev-del': 'BlockdevDelWrapper', 'blockdev-add': 'BlockdevAddWrapper', - 'drive-backup': 'DriveBackupWrapper' + 'drive-backup': 'DriveBackupWrapper', + 'x-blockdev-replace': 'BlockdevReplaceWrapper' } } =20 ## --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648684630644647.4186822628812; Wed, 30 Mar 2022 16:57:10 -0700 (PDT) Received: from localhost ([::1]:55678 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZiBZ-0003B4-LE for importer@patchew.org; Wed, 30 Mar 2022 19:57:09 -0400 Received: from eggs.gnu.org ([209.51.188.92]:35638) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZftB-0008KZ-Al for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:30:01 -0400 Received: from [2a00:1450:4864:20::135] (port=37766 helo=mail-lf1-x135.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZft8-0003QM-EN for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:30:00 -0400 Received: by mail-lf1-x135.google.com with SMTP id k21so38085737lfe.4 for ; Wed, 30 Mar 2022 14:29:57 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=DxCdasig0fJ4n01/i66Jn14r/3aai7V7kYErzb5HENY=; b=Xq85pPWXlaA5ecgWisPoFGqqqsP9cb+PVK3RFJlfpUsuYCJv8xk3gCQf4fo3pOxErP /l6vZ7ZPm6gMHuKoWd8U2YHq6FciKZ0tYxl5IumXR4nHomkiwAY9sTB+QMlcIgO2FGvx vB0MuuCyNqpXVamNeuQYKSxFtoRfIjPbW+BGo2BEGscX5tRqcdSz3L7G2eZebq+Un0a+ jeU84iRVXtzhwSkg6XsC1aLDCylUHftA22+FtzEDuB2+brBTWfXpOXyurGoQGrHiC7Em 7VR010XQQAEM6LHiH/MuJPkStVjOuhi21lF3y2peRZ7423a8LowfmDTzc36uEm28fdus SQTQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=DxCdasig0fJ4n01/i66Jn14r/3aai7V7kYErzb5HENY=; b=Ht484U4lGHohzjjqa8YT6kF9zr2EfrJA0KFKcRyn+f7MhOpfeZ7FeIt0hFvf60klgg 7P3EAs6Uy11/+zNb5luqoniY6DmUEO8yXXqW7ZS69F6gFlSz/8j3c6CvkXhj086j8Grq 9vPAnzosTiCthXxIL3wPbkuFBY7QmQXnFP5t1CDX6jx1NL0o6//IV+hGyNvM8mdw08Se /npu7eOSf8vpRy1uzzGa3mVsLmZerJL2hrMkpNrPRqfm/8TykpDXNrQ7PwH96Kvzs4mD kyzq2ar6EX+Gyf6fDAobub2B/SmqYQBmiQ2An1MH9asaae4HmRlnVnu/7O/B66xn5EfF 09rQ== X-Gm-Message-State: AOAM531mt17e6zwwzv0GM9mQgqUYwcDzrhCvWRP4tmOiHuomeyl3/6kg fZbChETCLrFz3ftGbtxm+ZsDPg== X-Google-Smtp-Source: ABdhPJwxKn7V1HKVuaPM/eKCSun+NDbYnXgLfNmx5RC3e9XwVnkKBHdfbHQK/vtgN8vg7X3v1IArUg== X-Received: by 2002:a05:6512:3094:b0:44a:6dcc:42da with SMTP id z20-20020a056512309400b0044a6dcc42damr8383232lfd.454.1648675795914; Wed, 30 Mar 2022 14:29:55 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 39/45] block: bdrv_get_xdbg_block_graph(): report export ids Date: Thu, 31 Mar 2022 00:28:56 +0300 Message-Id: <20220330212902.590099-40-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::135 (failed) 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=2a00:1450:4864:20::135; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lf1-x135.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:26 -0400 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: , Cc: kwolf@redhat.com, v.sementsov-og@mail.ru, qemu-devel@nongnu.org, hreitz@redhat.com, vsementsov@openvz.org, Paolo Bonzini Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648684631256100001 Content-Type: text/plain; charset="utf-8" Currently for block exports we report empty blk names. That's not good. Let's try to find corresponding block export and report its id. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block.c | 4 ++++ block/export/export.c | 13 +++++++++++++ include/block/export.h | 1 + stubs/blk-exp-find-by-blk.c | 9 +++++++++ stubs/meson.build | 1 + 5 files changed, 28 insertions(+) create mode 100644 stubs/blk-exp-find-by-blk.c diff --git a/block.c b/block.c index efe0ec0f00..40f54fe121 100644 --- a/block.c +++ b/block.c @@ -6147,7 +6147,11 @@ XDbgBlockGraph *bdrv_get_xdbg_block_graph(Error **er= rp) for (blk =3D blk_all_next(NULL); blk; blk =3D blk_all_next(blk)) { char *allocated_name =3D NULL; const char *name =3D blk_name(blk); + BlockExport *exp =3D blk_exp_find_by_blk(blk); =20 + if (!*name && exp) { + name =3D exp->id; + } if (!*name) { name =3D allocated_name =3D blk_get_attached_dev_id(blk); } diff --git a/block/export/export.c b/block/export/export.c index 66e62f0074..a9f935f772 100644 --- a/block/export/export.c +++ b/block/export/export.c @@ -54,6 +54,19 @@ BlockExport *blk_exp_find(const char *id) return NULL; } =20 +BlockExport *blk_exp_find_by_blk(BlockBackend *blk) +{ + BlockExport *exp; + + QLIST_FOREACH(exp, &block_exports, next) { + if (exp->blk =3D=3D blk) { + return exp; + } + } + + return NULL; +} + static const BlockExportDriver *blk_exp_find_driver(BlockExportType type) { int i; diff --git a/include/block/export.h b/include/block/export.h index 7feb02e10d..172c180819 100644 --- a/include/block/export.h +++ b/include/block/export.h @@ -80,6 +80,7 @@ struct BlockExport { =20 BlockExport *blk_exp_add(BlockExportOptions *export, Error **errp); BlockExport *blk_exp_find(const char *id); +BlockExport *blk_exp_find_by_blk(BlockBackend *blk); void blk_exp_ref(BlockExport *exp); void blk_exp_unref(BlockExport *exp); void blk_exp_request_shutdown(BlockExport *exp); diff --git a/stubs/blk-exp-find-by-blk.c b/stubs/blk-exp-find-by-blk.c new file mode 100644 index 0000000000..2fc1da953b --- /dev/null +++ b/stubs/blk-exp-find-by-blk.c @@ -0,0 +1,9 @@ +#include "qemu/osdep.h" +#include "sysemu/block-backend.h" +#include "block/export.h" + +BlockExport *blk_exp_find_by_blk(BlockBackend *blk) +{ + return NULL; +} + diff --git a/stubs/meson.build b/stubs/meson.build index 9924810a23..af60dd9778 100644 --- a/stubs/meson.build +++ b/stubs/meson.build @@ -2,6 +2,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('blk-exp-find-by-blk.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.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648684626791506.6735806276; Wed, 30 Mar 2022 16:57:06 -0700 (PDT) Received: from localhost ([::1]:55602 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZiBT-00038H-OR for importer@patchew.org; Wed, 30 Mar 2022 19:57:05 -0400 Received: from eggs.gnu.org ([209.51.188.92]:35694) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZftC-0008ME-U3 for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:30:06 -0400 Received: from [2a00:1450:4864:20::230] (port=43584 helo=mail-lj1-x230.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZft8-0003R2-EU for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:30:01 -0400 Received: by mail-lj1-x230.google.com with SMTP id b43so24946395ljr.10 for ; Wed, 30 Mar 2022 14:29:57 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=S4e9jyMdA4UH1Yzt7/XU3q+WYCHj7Vr1ejq6qbSf/3Q=; b=n4U/dnhZum4f4wjr9V5qlua3TNyetA12CnVudFo9gKX2ilCIsy8mSZVAi4m5BWwB8E StgX9SBou6pW/l28T+jXfdMpW7iQzVLW5RnW9p8+uiJDeFmmNz042iqM7fi+bdepKdT9 TytxohUzRPuJi9Qf4C5kL4fjRn340yFczzgi8ZayFC1QrbC7yDe+DnlYP89YTlUpr9Tr RL2RCg5E2rv0A3+DeLbjQ0izfz0uBFTHMCTlf4pKymiSLGNUkaGLWI5rkiPZhZpjZNT4 r8MlCO789sg9zqe0xpsTDkVpv2dSmJKskoGcIsTUZZwWpio9+4VnKAvPk/BlqowCuTBZ u3Nw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=S4e9jyMdA4UH1Yzt7/XU3q+WYCHj7Vr1ejq6qbSf/3Q=; b=dfQBghioX48S7vlw416FTL6Do6K2aN6Adpq5+TnVgJLJH8SrHvAPUaFz8HHitEhMxg E/m4Fidwd9ARjaWkYlKeAc5pl0bnRwR+0AbvrsodOVw7yMwtioXbWlHIXZcmUp5bQn2O MBa49qMGAR25+UfsU6awQvgDGaSLmV+s3+CIyqMC58ueJ3DUC9pXojHO2oj8ToRIQ6sJ Z/VEtXwq25oJmIWyDVPeesDejrIsG6+lKMxW3msTl82LuLzp1Hl5ef+coXajfLDOA296 dAhzPOJuryjz4C3g1NNAK4gBIev53oUNhYXiabLvy8AX4cYlEfVpRbD79k0p0y360C5A jbtA== X-Gm-Message-State: AOAM5330K5gSzsdxTR7sgZmVs9EfV4uW3rvLFwCSoHgYxeqVJGFaTxFu fyJTmiVEUpWVRDKHx43DZWzb2Q== X-Google-Smtp-Source: ABdhPJxBxOwDr05TyFESsuzjTVSWLET5VqG0oPPcXdF6LZzjLRCoPDnmG+gS8YZ9AVNFvYix8Bo5Cg== X-Received: by 2002:a2e:8e96:0:b0:24a:eac4:7ffe with SMTP id z22-20020a2e8e96000000b0024aeac47ffemr3971722ljk.430.1648675796500; Wed, 30 Mar 2022 14:29:56 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 40/45] iotests.py: qemu_img_create: use imgfmt by default Date: Thu, 31 Mar 2022 00:28:57 +0300 Message-Id: <20220330212902.590099-41-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::230 (failed) 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=2a00:1450:4864:20::230; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lj1-x230.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:26 -0400 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: , Cc: kwolf@redhat.com, hreitz@redhat.com, vsementsov@openvz.org, v.sementsov-og@mail.ru, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648684627215100001 Content-Type: text/plain; charset="utf-8" Less typing: let's use imgfmt by default if user doesn't specify neither -f nor --image-opts. Signed-off-by: Vladimir Sementsov-Ogievskiy --- tests/qemu-iotests/iotests.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py index fcec3e51e5..c7a38a95a4 100644 --- a/tests/qemu-iotests/iotests.py +++ b/tests/qemu-iotests/iotests.py @@ -266,6 +266,8 @@ def ordered_qmp(qmsg, conv_keys=3DTrue): return qmsg =20 def qemu_img_create(*args: str) -> 'subprocess.CompletedProcess[str]': + if '-f' not in args and '--image-opts' not in args: + args =3D ['-f', imgfmt] + list(args) return qemu_img('create', *args) =20 def qemu_img_json(*args: str) -> Any: --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648684747000203.80334912384842; Wed, 30 Mar 2022 16:59:07 -0700 (PDT) Received: from localhost ([::1]:33480 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZiDR-0007OA-FL for importer@patchew.org; Wed, 30 Mar 2022 19:59:05 -0400 Received: from eggs.gnu.org ([209.51.188.92]:35702) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZftC-0008MI-V0 for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:30:06 -0400 Received: from [2a00:1450:4864:20::242] (port=45936 helo=mail-lj1-x242.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZft8-0003RK-RG for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:30:02 -0400 Received: by mail-lj1-x242.google.com with SMTP id q14so29438816ljc.12 for ; Wed, 30 Mar 2022 14:29:58 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=yr3IicjiIzijKvaPUL3NuAuXiYMFVz8a7w4vV+d+wDU=; b=Kyy0AmzPX+CiOtwW9Ym1aTiHBgIrjObwW7mFNqiHcyCS0of4dbK2ghmJqBwKM1ShnN v8QpR6FTpi6aL8brAI0YHMbTR37JhuZGwDEqDF9ycemAgz0uVwn/XKSEaFicTQiy9n3A xKz/lhF7HtEpadgqevryb2xgx9gtXKrr+mQXhDnfEjW7JhRflMXobxRyC7yj7BLD4e/I mKHsK+BW+rwasEsT3qPlOV6M1RlJ8NvxFLe8Ja8siPWWAnQDklTO+tTiLJ92xClOEXc6 ZwZ60Ud9OV1n0IIqeUg/W6ttI4YPgb2OawVifz8yTwmllTnPs2RkAnJS5ldFq21EE0T9 et5g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=yr3IicjiIzijKvaPUL3NuAuXiYMFVz8a7w4vV+d+wDU=; b=6oXK40BdSe3PkQZ6dvT5CehTU45Gvq0wZkWL+FnGItRnEPQuxOm+3qrXsgMxtCfhNr Ga5JZe+lRCCiMSGdueHXFemM7h/0yk+BIuE3ZxKeQIvVA/hiraq8KoWauKa53FajGmIo cMO1MqBEgD8PYtp3Qaxh0Rf5nFrwx2yegNYQX3rRtNavvsFaT174aSWwK4VE37yTpPDy tEMtq+lXyCn2aMhU5aDGu+h2xcfvyqPLUslvL7pfwKra0pY4MYjxA1D67Ci1HoWxGdNY Xkt5dZ/6iGT73VPdik0rPIvtlMqz9qAxxOzqT+mQq/NEI3GtKIAB4MSSeuHFiamyHtIH cUlA== X-Gm-Message-State: AOAM5332lHJL+DgbvFVF3YKq2oMidphWtQlsM0UZC2bG6G/+pPMS/6ba 239ramXHlZavNEcCr2z/wEeS2g== X-Google-Smtp-Source: ABdhPJw1yTT1NxyGriDvexrBOhU8H4eateD99qx1yPTAKFdiBpaq80hJk5+Jini5E/CCL7cAoV7YGg== X-Received: by 2002:a2e:bf05:0:b0:247:b233:cfba with SMTP id c5-20020a2ebf05000000b00247b233cfbamr8154556ljr.131.1648675797105; Wed, 30 Mar 2022 14:29:57 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 41/45] iotests.py: introduce VM.assert_edges_list() method Date: Thu, 31 Mar 2022 00:28:58 +0300 Message-Id: <20220330212902.590099-42-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::242 (failed) 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=2a00:1450:4864:20::242; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lj1-x242.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:26 -0400 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: , Cc: kwolf@redhat.com, hreitz@redhat.com, vsementsov@openvz.org, v.sementsov-og@mail.ru, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648684748158100003 Content-Type: text/plain; charset="utf-8" Add an alternative method to check block graph, to be used in further commit. Signed-off-by: Vladimir Sementsov-Ogievskiy --- tests/qemu-iotests/iotests.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py index c7a38a95a4..aaa77b5105 100644 --- a/tests/qemu-iotests/iotests.py +++ b/tests/qemu-iotests/iotests.py @@ -1084,6 +1084,23 @@ def check_bitmap_status(self, node_name, bitmap_name= , fields): =20 return fields.items() <=3D ret.items() =20 + def get_block_graph(self): + """ + Returns block graph in form of edges list, where each edge is a tu= ple: + (parent_node_name, child_name, child_node_name) + """ + graph =3D self.qmp('x-debug-query-block-graph')['return'] + + nodes =3D {n['id']: n['name'] for n in graph['nodes']} + # Check that all names are unique: + assert len(set(nodes.values())) =3D=3D len(nodes) + + return [(nodes[e['parent']], e['name'], nodes[e['child']]) + for e in graph['edges']] + + def assert_edges_list(self, edges): + assert sorted(edges) =3D=3D sorted(self.get_block_graph()) + def assert_block_path(self, root, path, expected_node, graph=3DNone): """ Check whether the node under the given path in the block graph --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648684845029616.7132255376546; Wed, 30 Mar 2022 17:00:45 -0700 (PDT) Received: from localhost ([::1]:37702 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZiF1-00025v-Vk for importer@patchew.org; Wed, 30 Mar 2022 20:00:44 -0400 Received: from eggs.gnu.org ([209.51.188.92]:35714) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZftD-0008ML-72 for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:30:08 -0400 Received: from [2a00:1450:4864:20::12b] (port=36445 helo=mail-lf1-x12b.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZft9-0003RX-6x for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:30:02 -0400 Received: by mail-lf1-x12b.google.com with SMTP id bt26so38063244lfb.3 for ; Wed, 30 Mar 2022 14:29:58 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=UWNOlxI3Y81KZ56+Dl8p8TtuCtCt2TgumvfkhsZcZsc=; b=OzW7V6Buepf5PfhTsty/VdzU5pFr0mp12zWLpWda8JQqQg/85X0KU6eDLa1Nrg8kU5 Y4J94bD9OZS0WFDiTimtQ7wHgORuw0ppBB831orgh3mKvZ85AQqIcPgP3i0kvz5966EW nWBDllPCklL0R8iebpJFvBf3QAozBEEALE1CUKZyMVVEmM2uFUli1P7m2nTRTqxCOC8v ITfd7WVlfTrKdxHCxKic46THF0WMyV30xJry0my0LUtoirtgGVOQa19QNxBU235siU2a PFWjn7htPlNzl2glnJsqBwhpUqRXIxjGsLTMgR5UWkLmsXwvEHjlsw640t4koFuOy0mY FCYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=UWNOlxI3Y81KZ56+Dl8p8TtuCtCt2TgumvfkhsZcZsc=; b=qKIGMLSyFp1ooHhPchoV7afNsJgvTbAshIfizhTXlHSQrbVpOba0D1K+0yVimVbqZx EBquXlvESB4Qs2G9UHxFvIUSSN8jWsiND3j1EI909RL5oGf+vhxLXg7G+dyvINUAnK1k 6NDxSaF+DDw0q8saRnFWBhGoGlErfywbtS9szcziSgekRDY3eday/+cab5xMYaPCkh1f WndZRclX9PoB5KulCIqNxzB4MrHamqbJ7pFysyWFl7FkyvBBM5t9IdvpD6pNdSIvYkok IuTSVu7xg9ifXR7WznkjROgfl0y2u6lv1bpeq3vqDSoGUnKOfKsHMhe2IWapD2Jo1Lw0 AZHA== X-Gm-Message-State: AOAM532kCfLHLRsinkmlvhQmye4WnJwoN6oimOhraBWZgr/bT6lLUx0w Xx/7N8ROGMdqGu0FuZBDhl6Spw== X-Google-Smtp-Source: ABdhPJxPjgW0XmwTnbsZUor2vYoVIYqL1fEN4na0lPCGA7/EKJJsqYSve3l88TGgl0mqjx8/p9LbZA== X-Received: by 2002:a05:6512:2202:b0:44a:57b6:50d with SMTP id h2-20020a056512220200b0044a57b6050dmr8418266lfu.3.1648675797678; Wed, 30 Mar 2022 14:29:57 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 42/45] iotests.py: add VM.qmp_check() helper Date: Thu, 31 Mar 2022 00:28:59 +0300 Message-Id: <20220330212902.590099-43-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::12b (failed) 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=2a00:1450:4864:20::12b; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lf1-x12b.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:26 -0400 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: , Cc: kwolf@redhat.com, hreitz@redhat.com, vsementsov@openvz.org, v.sementsov-og@mail.ru, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648684846681100001 Content-Type: text/plain; charset="utf-8" I'm tired of this pattern being everywhere. Let's add a helper. Signed-off-by: Vladimir Sementsov-Ogievskiy --- tests/qemu-iotests/iotests.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py index aaa77b5105..329297bfe4 100644 --- a/tests/qemu-iotests/iotests.py +++ b/tests/qemu-iotests/iotests.py @@ -1101,6 +1101,10 @@ def get_block_graph(self): def assert_edges_list(self, edges): assert sorted(edges) =3D=3D sorted(self.get_block_graph()) =20 + def qmp_check(self, *args, **kwargs): + result =3D self.qmp(*args, **kwargs) + assert result =3D=3D {'return': {}} + def assert_block_path(self, root, path, expected_node, graph=3DNone): """ Check whether the node under the given path in the block graph --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 164868454878173.69993296174744; Wed, 30 Mar 2022 16:55:48 -0700 (PDT) Received: from localhost ([::1]:50110 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZiAF-0007rd-M8 for importer@patchew.org; Wed, 30 Mar 2022 19:55:47 -0400 Received: from eggs.gnu.org ([209.51.188.92]:35766) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZftE-0008MP-FH for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:30:08 -0400 Received: from [2a00:1450:4864:20::22f] (port=37709 helo=mail-lj1-x22f.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZft9-0003SB-Uc for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:30:04 -0400 Received: by mail-lj1-x22f.google.com with SMTP id r22so29480787ljd.4 for ; Wed, 30 Mar 2022 14:29:59 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=hjRTt5F+M53fho4ildO8xWS7G1G7VABYjwPC+axBAnc=; b=ig/yo9xT5o4OkTkKo2SM6qfKYmatv9O/U82iurBzmpYuYLd8wvszb7XdFshcVwITeT mj7ZaT241Oq79GtMiHfzebuHl7Uo6ecabPVRRDb4HMO+f7LZKTS7M4R+HcxTneQijfGe mLK8rc9pw9B4dj++WYoAEUQM//6t8QS4NrxQtfadd+3Dsu97csbrUYytiClgx8YFvum3 0w9PwAJwH2hcCXO6FurxHWKHTFh69sg15g6hPNCjPqRwaHJddZFLS0D/Q94CtzZL1WZU A9NmLTUOi+gRzAQ/ICnCtxJ3oheK+shhxWsuwVWnKVj7sws5Sr/Uke0dz/leuB3m3ViN G67Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=hjRTt5F+M53fho4ildO8xWS7G1G7VABYjwPC+axBAnc=; b=dfSLcNfCnqJNOzLiUc4u8FabGnXD/IvPptGcxHsY28qDpH/pW5xr0CVlDh1vWYhQIu gc/CfjkCWb6bG5D5tggyHpPzvY2WDL1ioSlf1m1F5Y46J8munTCW9dh6Ikza4h8xkzGM P9L5HBs2Um2nQaNx/I2TezT3gqrPIn3OjhYyPi5vNflehD8OFUp/77OghCEg7ERLo5v8 2T/uHMNpaBA8NPIgvA7jrgcLWn+DaJBRNOGIpYl66N8sV9/XiF1fnHEjDiseXBEFdg+7 Ye+bO/N2WJIYCtE3yU4TtohkyKU//5UMWRaLqL/+qzCMBQxP1FvsrqTxfsc3NOqUJF8v eAOQ== X-Gm-Message-State: AOAM530LsgLyKUxondPpS0ZU1G1FchtlY9eV0lTlPmFhbF4zs5P3BqHP T+Y+wHcVEM/IphOpx09r9Zxzsw== X-Google-Smtp-Source: ABdhPJy4UFyEAq9YXDqO5Xmhep3Il2mZFTCxy8bAa55XdI3h0D2GgvYI+o5Zyxfb7e5mYp7ajx3GXg== X-Received: by 2002:a05:651c:204:b0:249:832a:12b with SMTP id y4-20020a05651c020400b00249832a012bmr8362145ljn.473.1648675798279; Wed, 30 Mar 2022 14:29:58 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 43/45] iotests: add filter-insertion Date: Thu, 31 Mar 2022 00:29:00 +0300 Message-Id: <20220330212902.590099-44-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::22f (failed) 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=2a00:1450:4864:20::22f; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lj1-x22f.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:26 -0400 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: , Cc: kwolf@redhat.com, hreitz@redhat.com, vsementsov@openvz.org, v.sementsov-og@mail.ru, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648684550705100001 Content-Type: text/plain; charset="utf-8" Demonstrate new API for filter insertion and removal. Signed-off-by: Vladimir Sementsov-Ogievskiy --- tests/qemu-iotests/tests/filter-insertion | 253 ++++++++++++++++++ tests/qemu-iotests/tests/filter-insertion.out | 5 + 2 files changed, 258 insertions(+) create mode 100755 tests/qemu-iotests/tests/filter-insertion create mode 100644 tests/qemu-iotests/tests/filter-insertion.out diff --git a/tests/qemu-iotests/tests/filter-insertion b/tests/qemu-iotests= /tests/filter-insertion new file mode 100755 index 0000000000..4898d6e043 --- /dev/null +++ b/tests/qemu-iotests/tests/filter-insertion @@ -0,0 +1,253 @@ +#!/usr/bin/env python3 +# +# Tests for inserting and removing filters in a block graph. +# +# Copyright (c) 2022 Virtuozzo International GmbH. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +import os + +import iotests +from iotests import qemu_img_create, try_remove + + +disk =3D os.path.join(iotests.test_dir, 'disk') +sock =3D os.path.join(iotests.sock_dir, 'sock') +size =3D 1024 * 1024 + + +class TestFilterInsertion(iotests.QMPTestCase): + def setUp(self): + qemu_img_create(disk, str(size)) + + self.vm =3D iotests.VM() + self.vm.launch() + + self.vm.qmp_check('blockdev-add', { + 'node-name': 'disk0', + 'driver': 'qcow2', + 'file': { + 'node-name': 'file0', + 'driver': 'file', + 'filename': disk + } + }) + + def tearDown(self): + self.vm.shutdown() + os.remove(disk) + try_remove(sock) + + def test_simple_insertion(self): + vm =3D self.vm + + vm.qmp_check('blockdev-add', { + 'node-name': 'filter', + 'driver': 'preallocate', + 'file': 'file0' + }) + + vm.qmp_check('x-blockdev-replace', { + 'parent-type': 'driver', + 'node-name': 'disk0', + 'child': 'file', + 'new-child': 'filter' + }) + + # Filter inserted: + # disk0 -file-> filter -file-> file0 + vm.assert_edges_list([ + ('disk0', 'file', 'filter'), + ('filter', 'file', 'file0') + ]) + + vm.qmp_check('x-blockdev-replace', { + 'parent-type': 'driver', + 'node-name': 'disk0', + 'child': 'file', + 'new-child': 'file0' + }) + + # Filter replaced, but still exists: + # dik0 -file-> file0 <-file- filter + vm.assert_edges_list([ + ('disk0', 'file', 'file0'), + ('filter', 'file', 'file0') + ]) + + vm.qmp_check('blockdev-del', node_name=3D'filter') + + # Filter removed + # dik0 -file-> file0 + vm.assert_edges_list([ + ('disk0', 'file', 'file0') + ]) + + def test_tran_insert_under_qdev(self): + vm =3D self.vm + + vm.qmp_check('device_add', driver=3D'virtio-scsi') + vm.qmp_check('device_add', id=3D'sda', driver=3D'scsi-hd', drive= =3D'disk0') + + vm.qmp_check('transaction', actions=3D[ + { + 'type': 'blockdev-add', + 'data': { + 'node-name': 'filter', + 'driver': 'compress', + 'file': 'disk0' + } + }, { + 'type': 'x-blockdev-replace', + 'data': { + 'parent-type': 'qdev', + 'qdev-id': 'sda', + 'new-child': 'filter' + } + } + ]) + + # Filter inserted: + # sda -root-> filter -file-> disk0 -file-> file0 + vm.assert_edges_list([ + # parent_node_name, child_name, child_node_name + ('sda', 'root', 'filter'), + ('filter', 'file', 'disk0'), + ('disk0', 'file', 'file0'), + ]) + + vm.qmp_check('x-blockdev-replace', { + 'parent-type': 'qdev', + 'qdev-id': 'sda', + 'new-child': 'disk0' + }) + vm.qmp_check('blockdev-del', node_name=3D'filter') + + # Filter removed: + # sda -root-> disk0 -file-> file0 + vm.assert_edges_list([ + # parent_node_name, child_name, child_node_name + ('sda', 'root', 'disk0'), + ('disk0', 'file', 'file0'), + ]) + + def test_tran_insert_under_nbd_export(self): + vm =3D self.vm + + vm.qmp_check('nbd-server-start', + addr=3D{'type': 'unix', 'data': {'path': sock}}) + vm.qmp_check('block-export-add', id=3D'exp1', type=3D'nbd', + node_name=3D'disk0', name=3D'exp1') + vm.qmp_check('block-export-add', id=3D'exp2', type=3D'nbd', + node_name=3D'disk0', name=3D'exp2') + vm.qmp_check('object-add', qom_type=3D'throttle-group', + id=3D'tg', limits=3D{'iops-read': 1}) + + vm.qmp_check('transaction', actions=3D[ + { + 'type': 'blockdev-add', + 'data': { + 'node-name': 'filter', + 'driver': 'throttle', + 'throttle-group': 'tg', + 'file': 'disk0' + } + }, { + 'type': 'x-blockdev-replace', + 'data': { + 'parent-type': 'export', + 'export-id': 'exp1', + 'new-child': 'filter' + } + } + ]) + + # Only exp1 is throttled, exp2 is not: + # exp1 -root-> filter + # | + # |file + # v + # exp2 -file-> disk0 -file> file0 + vm.assert_edges_list([ + # parent_node_name, child_name, child_node_name + ('exp1', 'root', 'filter'), + ('filter', 'file', 'disk0'), + ('disk0', 'file', 'file0'), + ('exp2', 'root', 'disk0') + ]) + + vm.qmp_check('x-blockdev-replace', { + 'parent-type': 'export', + 'export-id': 'exp2', + 'new-child': 'filter' + }) + + # Both throttled: + # exp1 -root-> filter <-file- exp2 + # | + # |file + # v + # disk0 -file> file0 + vm.assert_edges_list([ + # parent_node_name, child_name, child_node_name + ('exp1', 'root', 'filter'), + ('filter', 'file', 'disk0'), + ('disk0', 'file', 'file0'), + ('exp2', 'root', 'filter') + ]) + + # Check, that filter is in use and can't be removed + result =3D vm.qmp('blockdev-del', node_name=3D'filter') + self.assert_qmp(result, 'error/desc', 'Node filter is in use') + + vm.qmp_check('transaction', actions=3D[ + { + 'type': 'x-blockdev-replace', + 'data': { + 'parent-type': 'export', + 'export-id': 'exp1', + 'new-child': 'disk0' + } + }, { + 'type': 'x-blockdev-replace', + 'data': { + 'parent-type': 'export', + 'export-id': 'exp2', + 'new-child': 'disk0' + } + } + ]) + vm.qmp_check('blockdev-del', node_name=3D'filter') + + # Filter removed: + # exp1 -root-> disk0 <-file- exp2 + # | + # |file + # v + # file0 + vm.assert_edges_list([ + # parent_node_name, child_name, child_node_name + ('exp1', 'root', 'disk0'), + ('disk0', 'file', 'file0'), + ('exp2', 'root', 'disk0') + ]) + + +if __name__ =3D=3D '__main__': + iotests.main( + supported_fmts=3D['qcow2'], + supported_protocols=3D['file'] + ) diff --git a/tests/qemu-iotests/tests/filter-insertion.out b/tests/qemu-iot= ests/tests/filter-insertion.out new file mode 100644 index 0000000000..8d7e996700 --- /dev/null +++ b/tests/qemu-iotests/tests/filter-insertion.out @@ -0,0 +1,5 @@ +... +---------------------------------------------------------------------- +Ran 3 tests + +OK --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648684745083763.0265078520325; Wed, 30 Mar 2022 16:59:05 -0700 (PDT) Received: from localhost ([::1]:33452 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZiDP-0007N4-SI for importer@patchew.org; Wed, 30 Mar 2022 19:59:03 -0400 Received: from eggs.gnu.org ([209.51.188.92]:35758) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZftE-0008MN-9f for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:30:08 -0400 Received: from [2a00:1450:4864:20::236] (port=42573 helo=mail-lj1-x236.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZftA-0003ST-I4 for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:30:03 -0400 Received: by mail-lj1-x236.google.com with SMTP id c15so29438280ljr.9 for ; Wed, 30 Mar 2022 14:30:00 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=aap1cPui4gDoxiLF3KY3ER5LW4mUdD5tRWMA6CpKuAM=; b=2CiQ8hY5UhFOQkZSndg+1JeTh3Dvd9TjYdt3qDLPJ0CTvX0xhjHceoLXRc5BidaQvJ NnPIOiLsZwEDskNtWinZAZaBBTcpit8ZY/O0fllkRj+3+g9uuCGUhTfL3vOoNFAgzirw /F0uZdzW4CXCFXb/Wwed6Pdltd4PIcJR5NkaxIgc0cW3knuEyAJkxQWA96+ryCXOVxny a0GyKtYFKqYCprwn4PLflFhf3+eDQVQtwdusOOxYoFC2ALM7CR9ReIATqvZIecbTZ15q oAfhY7ZINrkEd8vWlCtpNkLDl66uay8LDcKvRPA/CS4qx5UidQTrVXysNf8LVfmtDSNE WOzg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=aap1cPui4gDoxiLF3KY3ER5LW4mUdD5tRWMA6CpKuAM=; b=4Rc5Cw1qQRFcdtKh0xqgMJ52uxTJ6kdBtUd5H3WRpN0qC7ZgjTTxp7JBuvUZJbVDHr iS+R00yRb+g5dUSThcEcIw1JwT60tnD8SVHlWT8TTuhjtUMCSA4515E1kxs7qu1yzPqG aeo0uW1/cF9/SsJCq8CJq3pPOcM2uBiUvlNbeErGBCdJtxrjMwgTcE6TbUxvuipnILAA bKU0RxUc2M4oS1M8a3AyUgaG+d0F5YvFnvyEaIfBQ9/cocDSYoTQ8jWM6Fj/sdH78ykY stvZ2FgJLfTkuI8QBseiVIYUS1JtOreftgv/7EiPgdQCkwbMWG8pf8AL+XN3YuYt+m+Q gVWw== X-Gm-Message-State: AOAM5323QFkXdWc465SA+UDcaDjGF1FPSlSxLFC3tCfURH0+PCymMmj/ i3p4SCf8s8zJ8Hd8QmigA21YNw== X-Google-Smtp-Source: ABdhPJyktXfv0MHuSHwSiQAa6Qum7Y0ovCDuxSMAyEK9LPwW3Zxwa8Vy5d0xwOvJpVRJkBf+dMjgUw== X-Received: by 2002:a2e:bc1e:0:b0:249:896f:6dbf with SMTP id b30-20020a2ebc1e000000b00249896f6dbfmr8421487ljf.180.1648675798891; Wed, 30 Mar 2022 14:29:58 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 44/45] block: bdrv_open_inherit: create BlockBackend only when necessary Date: Thu, 31 Mar 2022 00:29:01 +0300 Message-Id: <20220330212902.590099-45-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::236 (failed) 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=2a00:1450:4864:20::236; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lj1-x236.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:26 -0400 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: , Cc: kwolf@redhat.com, hreitz@redhat.com, vsementsov@openvz.org, v.sementsov-og@mail.ru, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648684746350100001 Content-Type: text/plain; charset="utf-8" We need this blk only for probing - let's create it only when we are going to probe. That's significant for further changes: we'll need to avoid permission update during open() when possible (to refresh them later of course). But blk_unref() leads to permission update. Instead of implementing extra logic to avoid permission update during blk_unref when we want it, let's just drop blk_unref() from normal code path. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block.c | 48 +++++++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/block.c b/block.c index 40f54fe121..5a4b59eb6c 100644 --- a/block.c +++ b/block.c @@ -1821,7 +1821,7 @@ QemuOptsList bdrv_create_opts_simple =3D { * * Removes all processed options from *options. */ -static int bdrv_open_common(BlockDriverState *bs, BlockBackend *file, +static int bdrv_open_common(BlockDriverState *bs, BlockDriverState *file, QDict *options, Error **errp) { int ret, open_flags; @@ -1861,8 +1861,8 @@ static int bdrv_open_common(BlockDriverState *bs, Blo= ckBackend *file, } =20 if (file !=3D NULL) { - bdrv_refresh_filename(blk_bs(file)); - filename =3D blk_bs(file)->filename; + bdrv_refresh_filename(file); + filename =3D file->filename; } else { /* * Caution: while qdict_get_try_str() is fine, getting @@ -3883,7 +3883,7 @@ static BlockDriverState *bdrv_open_inherit(const char= *filename, Error **errp) { int ret; - BlockBackend *file =3D NULL; + BlockDriverState *file_bs =3D NULL; BlockDriverState *bs; BlockDriver *drv =3D NULL; BdrvChild *child; @@ -4016,8 +4016,6 @@ static BlockDriverState *bdrv_open_inherit(const char= *filename, * probing, the block drivers will do their own bdrv_open_child() for = the * same BDS, which is why we put the node name back into options. */ if ((flags & BDRV_O_PROTOCOL) =3D=3D 0) { - BlockDriverState *file_bs; - file_bs =3D bdrv_open_child_bs(filename, options, "file", bs, &child_of_bds, BDRV_CHILD_IMAGE, true, &local_err); @@ -4025,24 +4023,28 @@ static BlockDriverState *bdrv_open_inherit(const ch= ar *filename, goto fail; } if (file_bs !=3D NULL) { - /* Not requesting BLK_PERM_CONSISTENT_READ because we're only - * looking at the header to guess the image format. This works= even - * in cases where a guest would not see a consistent state. */ - file =3D blk_new(bdrv_get_aio_context(file_bs), 0, BLK_PERM_AL= L); - blk_insert_bs(file, file_bs, &local_err); - bdrv_unref(file_bs); - if (local_err) { - goto fail; - } - qdict_put_str(options, "file", bdrv_get_node_name(file_bs)); } } =20 /* Image format probing */ bs->probed =3D !drv; - if (!drv && file) { + if (!drv && file_bs) { + /* + * Not requesting BLK_PERM_CONSISTENT_READ because we're only + * looking at the header to guess the image format. This works even + * in cases where a guest would not see a consistent state. + */ + BlockBackend *file =3D blk_new(bdrv_get_aio_context(file_bs), 0, + BLK_PERM_ALL); + blk_insert_bs(file, file_bs, &local_err); + if (local_err) { + blk_unref(file); + goto fail; + } + ret =3D find_image_format(file, filename, &drv, &local_err); + blk_unref(file); if (ret < 0) { goto fail; } @@ -4068,17 +4070,17 @@ static BlockDriverState *bdrv_open_inherit(const ch= ar *filename, assert(!!(flags & BDRV_O_PROTOCOL) =3D=3D !!drv->bdrv_file_open); /* file must be NULL if a protocol BDS is about to be created * (the inverse results in an error message from bdrv_open_common()) */ - assert(!(flags & BDRV_O_PROTOCOL) || !file); + assert(!(flags & BDRV_O_PROTOCOL) || !file_bs); =20 /* Open the image */ - ret =3D bdrv_open_common(bs, file, options, &local_err); + ret =3D bdrv_open_common(bs, file_bs, options, &local_err); if (ret < 0) { goto fail; } =20 - if (file) { - blk_unref(file); - file =3D NULL; + if (file_bs) { + bdrv_unref(file_bs); + file_bs =3D NULL; } =20 /* If there is a backing file, use it */ @@ -4142,7 +4144,7 @@ static BlockDriverState *bdrv_open_inherit(const char= *filename, return bs; =20 fail: - blk_unref(file); + bdrv_unref(file_bs); qobject_unref(snapshot_options); qobject_unref(bs->explicit_options); qobject_unref(bs->options); --=20 2.35.1 From nobody Mon Dec 15 11:58:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=openvz.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1648684844970763.9270489316585; Wed, 30 Mar 2022 17:00:44 -0700 (PDT) Received: from localhost ([::1]:37690 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nZiF1-00025W-O8 for importer@patchew.org; Wed, 30 Mar 2022 20:00:43 -0400 Received: from eggs.gnu.org ([209.51.188.92]:35788) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nZftG-0008MY-HT for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:30:08 -0400 Received: from [2a00:1450:4864:20::12f] (port=40628 helo=mail-lf1-x12f.google.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nZftB-0003St-Mj for qemu-devel@nongnu.org; Wed, 30 Mar 2022 17:30:05 -0400 Received: by mail-lf1-x12f.google.com with SMTP id t25so38068064lfg.7 for ; Wed, 30 Mar 2022 14:30:00 -0700 (PDT) Received: from fedora.. ([185.215.60.153]) by smtp.gmail.com with ESMTPSA id y3-20020a056512044300b0044a9bda3242sm1057573lfk.90.2022.03.30.14.29.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Mar 2022 14:29:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openvz-org.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=2OE/MsvsxnMAX47sMi6igwm2uGZqPl+rPYnGsx/0bCc=; b=jQfVTtFqr12w5H26AkQLSl49X7vgja+pFpWilzxemBPNrC/eOVCNz+/C4AjqwJjmyB vRCgSF3Y6DsJngryZ+ZJeyFhgIvwYmrsFpGy8Vq7g8ypSHJdtLbB7J+iBKU3XcLCd/Ts LHBRuV9Z+vb8FgW62KMvSxS89wG8zl4Dac+5H6d9JbpYnsS9in1uqrufy+lprv2FAz08 TmkWR/PhbE2T67d03C/L+FGgHfBgY/DidMNGUNGdMrfAFdoMt7QFOWAKaF0aWEYDNy42 Vc5JOKSZUrp2ihL9Uefrr+ISDeGFpng/XcvyPgYyzqReNj3P2P4HbTTrQd5qnyZWiMoM BrHg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=2OE/MsvsxnMAX47sMi6igwm2uGZqPl+rPYnGsx/0bCc=; b=xJcbAOcXW3IIv/LwQtMpjO2mLiqNEhLN6pco0knsQMeJRS9GIB/48nEeELQa50OOe6 xi8BzLe8bEMjH3fWW4TK06JttoJ5WTOAs9hnF72aYgo30K4Fd4S1Ayo4sGRgfSfkixZc izrDjNRs4vr1emJWLVaqocPQgTQ+sYI/+QOkyHlRfV16XllWVtFHHrZBAPNfvwYOztcH aKsEfrEgMJNF6ML2XL5WLxSKeVMbkW9Pqsu2tfKNmsm18vtU9SDtKGlkE+di20CWVWwG k6i/JQpXbdZgd5Y2QJcifEJYo2Zdtz0FQTbMDRUxbVYTbyR4DJAWgWgcZhqWbacxTY6n tmPw== X-Gm-Message-State: AOAM533C+ObpK9med4aM9fwe1tvgQ2YtaC4D9E6BOhSU8TzqYSztSFYC EpqxD18DI4IT64Tsbh9ZkceOPA== X-Google-Smtp-Source: ABdhPJxlCtFV6JDNhxs4yN45grvQOp3oUWedgshNfnrXX2ijRlOFv3QYeIe1z1Yhs9ZOtrhIH0pnVw== X-Received: by 2002:ac2:5549:0:b0:44a:6da1:b17e with SMTP id l9-20020ac25549000000b0044a6da1b17emr8527342lfk.679.1648675799585; Wed, 30 Mar 2022 14:29:59 -0700 (PDT) From: Vladimir Sementsov-Ogievskiy X-Google-Original-From: Vladimir Sementsov-Ogievskiy To: qemu-block@nongnu.org Subject: [PATCH v5 45/45] block/copy-before-write: correct permission scheme Date: Thu, 31 Mar 2022 00:29:02 +0300 Message-Id: <20220330212902.590099-46-vsementsov@openvz.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220330212902.590099-1-vsementsov@openvz.org> References: <20220330212902.590099-1-vsementsov@openvz.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Host-Lookup-Failed: Reverse DNS lookup failed for 2a00:1450:4864:20::12f (failed) 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=2a00:1450:4864:20::12f; envelope-from=vladimir.sementsov-ogievskiy@openvz.org; helo=mail-lf1-x12f.google.com X-Spam_score_int: -4 X-Spam_score: -0.5 X-Spam_bar: / X-Spam_report: (-0.5 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, PDS_HP_HELO_NORDNS=0.659, RCVD_IN_DNSWL_NONE=-0.0001, RDNS_NONE=0.793, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Wed, 30 Mar 2022 19:17:26 -0400 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: , Cc: kwolf@redhat.com, v.sementsov-og@mail.ru, qemu-devel@nongnu.org, hreitz@redhat.com, vsementsov@openvz.org, John Snow Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1648684846694100002 Content-Type: text/plain; charset="utf-8" Finally we can strictly unshare write on source node, as all write must go through copy-before-write filter. For this to work: - Declare independent close, so that blockdev-del transaction action may detach children of removed node at prepare phase (that's for filter removement). We can do it because copy-before-write filter doesn't do any IO on its children on close(). - Support BDRV_O_NOPERM, so that blockdev-add transaction action can skip intermediate permission update. We can do it because copy-before-write filter doesn't do any IO on its children on open(). - Move to new block-graph modifying API in iotest image-fleecing. Separate qom-set + del/add doesn't work anymore for copy-before-write filter, because intermediate state violate new strict permissions. Signed-off-by: Vladimir Sementsov-Ogievskiy --- block/copy-before-write.c | 17 ++++++++--------- tests/qemu-iotests/tests/image-fleecing | 20 +++++++++++++++----- tests/qemu-iotests/tests/image-fleecing.out | 8 -------- 3 files changed, 23 insertions(+), 22 deletions(-) diff --git a/block/copy-before-write.c b/block/copy-before-write.c index 4fad564691..90a9c7874a 100644 --- a/block/copy-before-write.c +++ b/block/copy-before-write.c @@ -319,12 +319,8 @@ static void cbw_child_perm(BlockDriverState *bs, BdrvC= hild *c, bdrv_default_perms(bs, c, role, reopen_queue, perm, shared, nperm, nshared); =20 - if (!QLIST_EMPTY(&bs->parents)) { - if (perm & BLK_PERM_WRITE) { - *nperm =3D *nperm | BLK_PERM_CONSISTENT_READ; - } - *nshared &=3D ~(BLK_PERM_WRITE | BLK_PERM_RESIZE); - } + *nperm =3D *nperm | BLK_PERM_CONSISTENT_READ; + *nshared &=3D ~(BLK_PERM_WRITE | BLK_PERM_RESIZE); } } =20 @@ -378,13 +374,15 @@ static int cbw_open(BlockDriverState *bs, QDict *opti= ons, int flags, int64_t cluster_size; int ret; =20 - ret =3D bdrv_open_file_child(NULL, options, "file", bs, errp); + ret =3D bdrv_open_file_child_common(NULL, options, "file", bs, + !(flags & BDRV_O_NOPERM), errp); if (ret < 0) { return ret; } =20 - s->target =3D bdrv_open_child(NULL, options, "target", bs, &child_of_b= ds, - BDRV_CHILD_DATA, false, errp); + s->target =3D bdrv_open_child_common(NULL, options, "target", bs, + &child_of_bds, BDRV_CHILD_DATA, fal= se, + !(flags & BDRV_O_NOPERM), errp); if (!s->target) { return -EINVAL; } @@ -444,6 +442,7 @@ static void cbw_close(BlockDriverState *bs) BlockDriver bdrv_cbw_filter =3D { .format_name =3D "copy-before-write", .instance_size =3D sizeof(BDRVCopyBeforeWriteState), + .independent_close =3D true, =20 .bdrv_open =3D cbw_open, .bdrv_close =3D cbw_close, diff --git a/tests/qemu-iotests/tests/image-fleecing b/tests/qemu-iotests/t= ests/image-fleecing index b7e5076104..23b55ded70 100755 --- a/tests/qemu-iotests/tests/image-fleecing +++ b/tests/qemu-iotests/tests/image-fleecing @@ -131,9 +131,13 @@ def do_test(vm, use_cbw, use_snapshot_access_filter, b= ase_img_path, if bitmap: fl_cbw['bitmap'] =3D {'node': src_node, 'name': 'bitmap0'} =20 - log(vm.qmp('blockdev-add', fl_cbw)) - - log(vm.qmp('qom-set', path=3Dqom_path, property=3D'drive', value= =3D'fl-cbw')) + log(vm.qmp('transaction', {'actions': [ + {'type': 'blockdev-add', 'data': fl_cbw}, + {'type': 'x-blockdev-replace', 'data': { + 'parent-type': 'qdev', + 'qdev-id': 'sda', + 'new-child': 'fl-cbw'}} + ]})) =20 if use_snapshot_access_filter: log(vm.qmp('blockdev-add', { @@ -242,8 +246,14 @@ def do_test(vm, use_cbw, use_snapshot_access_filter, b= ase_img_path, if use_cbw: if use_snapshot_access_filter: log(vm.qmp('blockdev-del', node_name=3D'fl-access')) - log(vm.qmp('qom-set', path=3Dqom_path, property=3D'drive', value= =3Dsrc_node)) - log(vm.qmp('blockdev-del', node_name=3D'fl-cbw')) + log(vm.qmp('transaction', {'actions': [ + {'type': 'x-blockdev-replace', 'data': { + 'parent-type': 'qdev', + 'qdev-id': 'sda', + 'new-child': src_node}}, + {'type': 'blockdev-del', 'data': { + 'node-name': 'fl-cbw'}} + ]})) else: log(vm.qmp('block-job-cancel', device=3D'fleecing')) e =3D vm.event_wait('BLOCK_JOB_CANCELLED') diff --git a/tests/qemu-iotests/tests/image-fleecing.out b/tests/qemu-iotes= ts/tests/image-fleecing.out index acfc89ff0e..33c6c239da 100644 --- a/tests/qemu-iotests/tests/image-fleecing.out +++ b/tests/qemu-iotests/tests/image-fleecing.out @@ -79,7 +79,6 @@ Done =20 --- Setting up Fleecing Graph --- =20 -{"return": {}} {"return": {}} {"return": {}} =20 @@ -124,7 +123,6 @@ read -P0 0x3fe0000 64k {"return": {}} {"return": {}} {"return": {}} -{"return": {}} =20 --- Confirming writes --- =20 @@ -152,7 +150,6 @@ Done {"return": {}} {"return": {}} {"return": {}} -{"return": {}} =20 --- Setting up NBD Export --- =20 @@ -196,7 +193,6 @@ read -P0 0x3fe0000 64k {"return": {}} {"return": {}} {"return": {}} -{"return": {}} =20 --- Confirming writes --- =20 @@ -224,7 +220,6 @@ Done {"return": {}} {"return": {}} {"return": {}} -{"return": {}} =20 --- Setting up NBD Export --- =20 @@ -280,7 +275,6 @@ read failed: Invalid argument {"return": {}} {"return": {}} {"return": {}} -{"return": {}} =20 --- Confirming writes --- =20 @@ -308,7 +302,6 @@ Done {"return": {}} {"return": {}} {"return": {}} -{"return": {}} =20 --- Starting actual backup --- =20 @@ -343,7 +336,6 @@ read -P0 0x3fe0000 64k {"return": {}} {"return": {}} {"return": {}} -{"return": {}} =20 --- Confirming writes --- =20 --=20 2.35.1