From nobody Sun Apr 28 20:45:35 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1500453987372597.2718412375102; Wed, 19 Jul 2017 01:46:27 -0700 (PDT) Received: from localhost ([::1]:60551 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dXkck-00082S-40 for importer@patchew.org; Wed, 19 Jul 2017 04:46:26 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60288) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dXkbM-00079n-P6 for qemu-devel@nongnu.org; Wed, 19 Jul 2017 04:45:02 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dXkbL-0006yS-4L for qemu-devel@nongnu.org; Wed, 19 Jul 2017 04:45:00 -0400 Received: from mx1.redhat.com ([209.132.183.28]:40608) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dXkbF-0006tR-I5; Wed, 19 Jul 2017 04:44:53 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5D441C04B939; Wed, 19 Jul 2017 08:44:52 +0000 (UTC) Received: from noname.redhat.com (ovpn-116-87.ams2.redhat.com [10.36.116.87]) by smtp.corp.redhat.com (Postfix) with ESMTP id 3D9767E135; Wed, 19 Jul 2017 08:44:50 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 5D441C04B939 Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=kwolf@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 5D441C04B939 From: Kevin Wolf To: qemu-block@nongnu.org Date: Wed, 19 Jul 2017 10:44:47 +0200 Message-Id: <1500453887-20819-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Wed, 19 Jul 2017 08:44:52 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH for-2.10] block: Skip implicit nodes in query-block/blockstats X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, pkrempa@redhat.com, qemu-devel@nongnu.org, armbru@redhat.com, mreitz@redhat.com, nsoffer@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Commits 0db832f and 6cdbceb introduced the automatic insertion of filter nodes above the top layer of mirror and commit block jobs. The assumption made there was that since libvirt doesn't do node-level management of the block layer yet, it shouldn't be affected by added nodes. This is true as far as commands issued by libvirt are concerned. It only uses BlockBackend names to address nodes, so any operations it performs still operate on the root of the tree as intended. However, the assumption breaks down when you consider query commands, which return data for the wrong node now. These commands also return information on some child nodes (bs->file and/or bs->backing), which libvirt does make use of, and which refer to the wrong nodes, too. One of the consequences is that oVirt gets wrong information about the image size and stops the VM in response as long as a mirror or commit job is running: https://bugzilla.redhat.com/show_bug.cgi?id=3D1470634 This patch fixes the problem by hiding the implict nodes created automatically by the mirror and commit block jobs in the output of query-block and BlockBackend-based query-blockstats as long as the user doesn't indicate that they are aware of those nodes by providing a node name for them in the QMP command to start the block job. The node-based commands query-named-block-nodes and query-blockstats with query-nodes=3Dtrue still show all nodes, including implicit ones. This ensures that users that are capable of node-level management can still access the full information; users that only know BlockBackends won't use these commands. Cc: qemu-stable@nongnu.org Signed-off-by: Kevin Wolf Reviewed-by. Reviewed-by: Manos Pitsidianakis --- block/commit.c | 3 +++ block/mirror.c | 3 +++ block/qapi.c | 13 ++++++++++++- include/block/block_int.h | 1 + qapi/block-core.json | 6 ++++-- tests/qemu-iotests/041 | 23 +++++++++++++++++++++++ tests/qemu-iotests/041.out | 4 ++-- 7 files changed, 48 insertions(+), 5 deletions(-) diff --git a/block/commit.c b/block/commit.c index 5cc910f..c7857c3 100644 --- a/block/commit.c +++ b/block/commit.c @@ -346,6 +346,9 @@ void commit_start(const char *job_id, BlockDriverState = *bs, if (commit_top_bs =3D=3D NULL) { goto fail; } + if (!filter_node_name) { + commit_top_bs->implicit =3D true; + } commit_top_bs->total_sectors =3D top->total_sectors; bdrv_set_aio_context(commit_top_bs, bdrv_get_aio_context(top)); =20 diff --git a/block/mirror.c b/block/mirror.c index 8583b76..c9a6a3c 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -1168,6 +1168,9 @@ static void mirror_start_job(const char *job_id, Bloc= kDriverState *bs, if (mirror_top_bs =3D=3D NULL) { return; } + if (!filter_node_name) { + mirror_top_bs->implicit =3D true; + } mirror_top_bs->total_sectors =3D bs->total_sectors; bdrv_set_aio_context(mirror_top_bs, bdrv_get_aio_context(bs)); =20 diff --git a/block/qapi.c b/block/qapi.c index 95b2e2d..0ed23b8 100644 --- a/block/qapi.c +++ b/block/qapi.c @@ -324,6 +324,11 @@ static void bdrv_query_info(BlockBackend *blk, BlockIn= fo **p_info, BlockDriverState *bs =3D blk_bs(blk); char *qdev; =20 + /* Skip automatically inserted nodes that the user isn't aware of */ + while (bs && bs->drv && bs->implicit) { + bs =3D backing_bs(bs); + } + info->device =3D g_strdup(blk_name(blk)); info->type =3D g_strdup("unknown"); info->locked =3D blk_dev_is_medium_locked(blk); @@ -518,12 +523,18 @@ BlockStatsList *qmp_query_blockstats(bool has_query_n= odes, } } else { for (blk =3D blk_next(NULL); blk; blk =3D blk_next(blk)) { + BlockDriverState *bs =3D blk_bs(blk); BlockStatsList *info =3D g_malloc0(sizeof(*info)); AioContext *ctx =3D blk_get_aio_context(blk); BlockStats *s; =20 + /* Skip automatically inserted nodes that the user isn't aware= of */ + while (bs && bs->drv && bs->implicit) { + bs =3D backing_bs(bs); + } + aio_context_acquire(ctx); - s =3D bdrv_query_bds_stats(blk_bs(blk), true); + s =3D bdrv_query_bds_stats(bs, true); s->has_device =3D true; s->device =3D g_strdup(blk_name(blk)); bdrv_query_blk_stats(s->stats, blk); diff --git a/include/block/block_int.h b/include/block/block_int.h index 5c6b761..d4f4ea7 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -549,6 +549,7 @@ struct BlockDriverState { bool sg; /* if true, the device is a /dev/sg* */ bool probed; /* if true, format was probed rather than specified */ bool force_share; /* if true, always allow all shared permissions */ + bool implicit; /* if true, this filter node was automatically inserte= d */ =20 BlockDriver *drv; /* NULL means no media */ void *opaque; diff --git a/qapi/block-core.json b/qapi/block-core.json index ff8e2ba..006e048 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -520,7 +520,8 @@ # # Get a list of BlockInfo for all virtual block devices. # -# Returns: a list of @BlockInfo describing each virtual block device +# Returns: a list of @BlockInfo describing each virtual block device. Filt= er +# nodes that were created implicitly are skipped over. # # Since: 0.14.0 # @@ -780,7 +781,8 @@ # information, but not "backing". # If false or omitted, the behavior is as before - query all= the # device backends, recursively including their "parent" and -# "backing". (Since 2.3) +# "backing". Filter nodes that were created implicitly are +# skipped over in this mode. (Since 2.3) # # Returns: A list of @BlockStats for each virtual block devices. # diff --git a/tests/qemu-iotests/041 b/tests/qemu-iotests/041 index 2f54986..b798cca 100755 --- a/tests/qemu-iotests/041 +++ b/tests/qemu-iotests/041 @@ -169,6 +169,29 @@ class TestSingleDrive(iotests.QMPTestCase): self.assertTrue(iotests.compare_images(test_img, target_img), 'target image does not match source after mirrorin= g') =20 + # Tests that the insertion of the mirror_top filter node doesn't make a + # difference to query-block + def test_implicit_node(self): + self.assert_no_active_block_jobs() + + result =3D self.vm.qmp(self.qmp_cmd, device=3D'drive0', sync=3D'fu= ll', + target=3Dself.qmp_target) + self.assert_qmp(result, 'return', {}) + + result =3D self.vm.qmp('query-block') + self.assert_qmp(result, 'return[0]/inserted/file', test_img) + self.assert_qmp(result, 'return[0]/inserted/drv', iotests.imgfmt) + self.assert_qmp(result, 'return[0]/inserted/backing_file', backing= _img) + self.assert_qmp(result, 'return[0]/inserted/backing_file_depth', 1) + + self.cancel_and_wait(force=3DTrue) + result =3D self.vm.qmp('query-block') + self.assert_qmp(result, 'return[0]/inserted/file', test_img) + self.assert_qmp(result, 'return[0]/inserted/drv', iotests.imgfmt) + self.assert_qmp(result, 'return[0]/inserted/backing_file', backing= _img) + self.assert_qmp(result, 'return[0]/inserted/backing_file_depth', 1) + self.vm.shutdown() + def test_medium_not_found(self): if iotests.qemu_default_machine !=3D 'pc': return diff --git a/tests/qemu-iotests/041.out b/tests/qemu-iotests/041.out index e30fd3b..c28b392 100644 --- a/tests/qemu-iotests/041.out +++ b/tests/qemu-iotests/041.out @@ -1,5 +1,5 @@ -..........................................................................= ..... +..........................................................................= ........... ---------------------------------------------------------------------- -Ran 79 tests +Ran 85 tests =20 OK --=20 1.8.3.1