get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/806891/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 806891,
    "url": "http://patchwork.ozlabs.org/api/patches/806891/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/1503965694-10794-76-git-send-email-mdroth@linux.vnet.ibm.com/",
    "project": {
        "id": 14,
        "url": "http://patchwork.ozlabs.org/api/projects/14/?format=api",
        "name": "QEMU Development",
        "link_name": "qemu-devel",
        "list_id": "qemu-devel.nongnu.org",
        "list_email": "qemu-devel@nongnu.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": "",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<1503965694-10794-76-git-send-email-mdroth@linux.vnet.ibm.com>",
    "list_archive_url": null,
    "date": "2017-08-29T00:14:50",
    "name": "[75/79] block: Skip implicit nodes in query-block/blockstats",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "b0ea4c3de7f32b03bfaf1a1e2102495618321aef",
    "submitter": {
        "id": 5549,
        "url": "http://patchwork.ozlabs.org/api/people/5549/?format=api",
        "name": "Michael Roth",
        "email": "mdroth@linux.vnet.ibm.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/1503965694-10794-76-git-send-email-mdroth@linux.vnet.ibm.com/mbox/",
    "series": [
        {
            "id": 281,
            "url": "http://patchwork.ozlabs.org/api/series/281/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=281",
            "date": "2017-08-29T00:13:45",
            "name": "Patch Round-up for stable 2.9.1, freeze on 2017-09-04",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/281/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/806891/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/806891/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>",
        "X-Original-To": "incoming@patchwork.ozlabs.org",
        "Delivered-To": "patchwork-incoming@bilbo.ozlabs.org",
        "Authentication-Results": "ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=nongnu.org\n\t(client-ip=2001:4830:134:3::11; helo=lists.gnu.org;\n\tenvelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n\treceiver=<UNKNOWN>)",
        "Received": [
            "from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11])\n\t(using TLSv1 with cipher AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xh9fP6n27z9sP5\n\tfor <incoming@patchwork.ozlabs.org>;\n\tTue, 29 Aug 2017 11:14:53 +1000 (AEST)",
            "from localhost ([::1]:42221 helo=lists.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.71) (envelope-from\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>)\n\tid 1dmV7D-00032n-Nm\n\tfor incoming@patchwork.ozlabs.org; Mon, 28 Aug 2017 21:14:51 -0400",
            "from eggs.gnu.org ([2001:4830:134:3::10]:49088)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <mdroth@linux.vnet.ibm.com>) id 1dmUCx-0001uL-6i\n\tfor qemu-devel@nongnu.org; Mon, 28 Aug 2017 20:16:46 -0400",
            "from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <mdroth@linux.vnet.ibm.com>) id 1dmUCt-0006JM-7y\n\tfor qemu-devel@nongnu.org; Mon, 28 Aug 2017 20:16:43 -0400",
            "from mx0b-001b2d01.pphosted.com ([148.163.158.5]:56179\n\thelo=mx0a-001b2d01.pphosted.com)\n\tby eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32)\n\t(Exim 4.71) (envelope-from <mdroth@linux.vnet.ibm.com>)\n\tid 1dmUCt-0006Is-0H\n\tfor qemu-devel@nongnu.org; Mon, 28 Aug 2017 20:16:39 -0400",
            "from pps.filterd (m0098419.ppops.net [127.0.0.1])\n\tby mx0b-001b2d01.pphosted.com (8.16.0.21/8.16.0.21) with SMTP id\n\tv7T0ESbC087634\n\tfor <qemu-devel@nongnu.org>; Mon, 28 Aug 2017 20:16:38 -0400",
            "from e32.co.us.ibm.com (e32.co.us.ibm.com [32.97.110.150])\n\tby mx0b-001b2d01.pphosted.com with ESMTP id 2cmvhgarmn-1\n\t(version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT)\n\tfor <qemu-devel@nongnu.org>; Mon, 28 Aug 2017 20:16:38 -0400",
            "from localhost\n\tby e32.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use\n\tOnly! Violators will be prosecuted\n\tfor <qemu-devel@nongnu.org> from <mdroth@linux.vnet.ibm.com>;\n\tMon, 28 Aug 2017 18:16:37 -0600",
            "from b03cxnp08026.gho.boulder.ibm.com (9.17.130.18)\n\tby e32.co.us.ibm.com (192.168.1.132) with IBM ESMTP SMTP Gateway:\n\tAuthorized Use Only! Violators will be prosecuted; \n\tMon, 28 Aug 2017 18:16:36 -0600",
            "from b03ledav002.gho.boulder.ibm.com\n\t(b03ledav002.gho.boulder.ibm.com [9.17.130.233])\n\tby b03cxnp08026.gho.boulder.ibm.com (8.14.9/8.14.9/NCO v10.0) with\n\tESMTP id v7T0GanL65208360; Mon, 28 Aug 2017 17:16:36 -0700",
            "from b03ledav002.gho.boulder.ibm.com (unknown [127.0.0.1])\n\tby IMSVA (Postfix) with ESMTP id 07D71136040;\n\tMon, 28 Aug 2017 18:16:36 -0600 (MDT)",
            "from localhost (unknown [9.80.85.217])\n\tby b03ledav002.gho.boulder.ibm.com (Postfix) with ESMTP id\n\tBEFFB13603A; Mon, 28 Aug 2017 18:16:35 -0600 (MDT)"
        ],
        "From": "Michael Roth <mdroth@linux.vnet.ibm.com>",
        "To": "qemu-devel@nongnu.org",
        "Date": "Mon, 28 Aug 2017 19:14:50 -0500",
        "X-Mailer": "git-send-email 2.7.4",
        "In-Reply-To": "<1503965694-10794-1-git-send-email-mdroth@linux.vnet.ibm.com>",
        "References": "<1503965694-10794-1-git-send-email-mdroth@linux.vnet.ibm.com>",
        "X-TM-AS-GCONF": "00",
        "x-cbid": "17082900-0004-0000-0000-000012D6D532",
        "X-IBM-SpamModules-Scores": "",
        "X-IBM-SpamModules-Versions": "BY=3.00007630; HX=3.00000241; KW=3.00000007;\n\tPH=3.00000004; SC=3.00000226; SDB=6.00909028; UDB=6.00455849;\n\tIPR=6.00689279; \n\tBA=6.00005557; NDR=6.00000001; ZLA=6.00000005; ZF=6.00000009;\n\tZB=6.00000000; \n\tZP=6.00000000; ZH=6.00000000; ZU=6.00000002; MB=3.00016909;\n\tXFM=3.00000015; UTC=2017-08-29 00:16:37",
        "X-IBM-AV-DETECTION": "SAVI=unused REMOTE=unused XFE=unused",
        "x-cbparentid": "17082900-0005-0000-0000-000080E59ECB",
        "Message-Id": "<1503965694-10794-76-git-send-email-mdroth@linux.vnet.ibm.com>",
        "X-Proofpoint-Virus-Version": "vendor=fsecure engine=2.50.10432:, ,\n\tdefinitions=2017-08-28_13:, , signatures=0",
        "X-Proofpoint-Spam-Details": "rule=outbound_notspam policy=outbound score=0\n\tspamscore=0 suspectscore=3\n\tmalwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam\n\tadjust=0 reason=mlx scancount=1 engine=8.0.1-1707230000\n\tdefinitions=main-1708290001",
        "X-detected-operating-system": "by eggs.gnu.org: GNU/Linux 3.x [generic] [fuzzy]",
        "X-Received-From": "148.163.158.5",
        "Subject": "[Qemu-devel] [PATCH 75/79] block: Skip implicit nodes in\n\tquery-block/blockstats",
        "X-BeenThere": "qemu-devel@nongnu.org",
        "X-Mailman-Version": "2.1.21",
        "Precedence": "list",
        "List-Id": "<qemu-devel.nongnu.org>",
        "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>",
        "List-Archive": "<http://lists.nongnu.org/archive/html/qemu-devel/>",
        "List-Post": "<mailto:qemu-devel@nongnu.org>",
        "List-Help": "<mailto:qemu-devel-request@nongnu.org?subject=help>",
        "List-Subscribe": "<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=subscribe>",
        "Cc": "Kevin Wolf <kwolf@redhat.com>, qemu-stable@nongnu.org",
        "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org",
        "Sender": "\"Qemu-devel\"\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>"
    },
    "content": "From: Kevin Wolf <kwolf@redhat.com>\n\nCommits 0db832f and 6cdbceb introduced the automatic insertion of filter\nnodes above the top layer of mirror and commit block jobs. The\nassumption made there was that since libvirt doesn't do node-level\nmanagement of the block layer yet, it shouldn't be affected by added\nnodes.\n\nThis is true as far as commands issued by libvirt are concerned. It only\nuses BlockBackend names to address nodes, so any operations it performs\nstill operate on the root of the tree as intended.\n\nHowever, the assumption breaks down when you consider query commands,\nwhich return data for the wrong node now. These commands also return\ninformation on some child nodes (bs->file and/or bs->backing), which\nlibvirt does make use of, and which refer to the wrong nodes, too.\n\nOne of the consequences is that oVirt gets wrong information about the\nimage size and stops the VM in response as long as a mirror or commit\njob is running:\n\nhttps://bugzilla.redhat.com/show_bug.cgi?id=1470634\n\nThis patch fixes the problem by hiding the implicit nodes created\nautomatically by the mirror and commit block jobs in the output of\nquery-block and BlockBackend-based query-blockstats as long as the user\ndoesn't indicate that they are aware of those nodes by providing a node\nname for them in the QMP command to start the block job.\n\nThe node-based commands query-named-block-nodes and query-blockstats\nwith query-nodes=true still show all nodes, including implicit ones.\nThis ensures that users that are capable of node-level management can\nstill access the full information; users that only know BlockBackends\nwon't use these commands.\n\nCc: qemu-stable@nongnu.org\nSigned-off-by: Kevin Wolf <kwolf@redhat.com>\nReviewed-by: Peter Krempa <pkrempa@redhat.com>\nReviewed-by: Max Reitz <mreitz@redhat.com>\nTested-by: Eric Blake <eblake@redhat.com>\n(cherry picked from commit d3c8c67469ee70fcae116d5abc277a7ebc8a19fd)\n Conflicts:\n\tblock/qapi.c\n\tinclude/block/block_int.h\n* fix context deps on 46eade7b and 5a9347c6\nSigned-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>\n---\n block.c                    | 13 -------------\n block/commit.c             |  3 +++\n block/mirror.c             |  3 +++\n block/qapi.c               | 34 ++++++++++++++++++++++++++++------\n include/block/block.h      |  1 -\n include/block/block_int.h  |  1 +\n qapi/block-core.json       |  6 ++++--\n tests/qemu-iotests/040     | 30 +++++++++++++++++++++++++++++-\n tests/qemu-iotests/040.out |  4 ++--\n tests/qemu-iotests/041     | 38 +++++++++++++++++++++++++++++++++++++-\n tests/qemu-iotests/041.out |  4 ++--\n 11 files changed, 109 insertions(+), 28 deletions(-)",
    "diff": "diff --git a/block.c b/block.c\nindex 21cb65e..46ea4a3 100644\n--- a/block.c\n+++ b/block.c\n@@ -3863,19 +3863,6 @@ BlockDriverState *bdrv_find_backing_image(BlockDriverState *bs,\n     return retval;\n }\n \n-int bdrv_get_backing_file_depth(BlockDriverState *bs)\n-{\n-    if (!bs->drv) {\n-        return 0;\n-    }\n-\n-    if (!bs->backing) {\n-        return 0;\n-    }\n-\n-    return 1 + bdrv_get_backing_file_depth(bs->backing->bs);\n-}\n-\n void bdrv_init(void)\n {\n     module_call_init(MODULE_INIT_BLOCK);\ndiff --git a/block/commit.c b/block/commit.c\nindex 66e3418..b4c1be7 100644\n--- a/block/commit.c\n+++ b/block/commit.c\n@@ -351,6 +351,9 @@ void commit_start(const char *job_id, BlockDriverState *bs,\n     if (commit_top_bs == NULL) {\n         goto fail;\n     }\n+    if (!filter_node_name) {\n+        commit_top_bs->implicit = true;\n+    }\n     commit_top_bs->total_sectors = top->total_sectors;\n     bdrv_set_aio_context(commit_top_bs, bdrv_get_aio_context(top));\n \ndiff --git a/block/mirror.c b/block/mirror.c\nindex 4e8f124..9bf5f89 100644\n--- a/block/mirror.c\n+++ b/block/mirror.c\n@@ -1152,6 +1152,9 @@ static void mirror_start_job(const char *job_id, BlockDriverState *bs,\n     if (mirror_top_bs == NULL) {\n         return;\n     }\n+    if (!filter_node_name) {\n+        mirror_top_bs->implicit = true;\n+    }\n     mirror_top_bs->total_sectors = bs->total_sectors;\n     bdrv_set_aio_context(mirror_top_bs, bdrv_get_aio_context(bs));\n \ndiff --git a/block/qapi.c b/block/qapi.c\nindex a40922e..803205b 100644\n--- a/block/qapi.c\n+++ b/block/qapi.c\n@@ -64,7 +64,6 @@ BlockDeviceInfo *bdrv_block_device_info(BlockBackend *blk,\n         info->backing_file = g_strdup(bs->backing_file);\n     }\n \n-    info->backing_file_depth = bdrv_get_backing_file_depth(bs);\n     info->detect_zeroes = bs->detect_zeroes;\n \n     if (blk && blk_get_public(blk)->throttle_state) {\n@@ -125,6 +124,7 @@ BlockDeviceInfo *bdrv_block_device_info(BlockBackend *blk,\n \n     bs0 = bs;\n     p_image_info = &info->image;\n+    info->backing_file_depth = 0;\n     while (1) {\n         Error *local_err = NULL;\n         bdrv_query_image_info(bs0, p_image_info, &local_err);\n@@ -133,13 +133,21 @@ BlockDeviceInfo *bdrv_block_device_info(BlockBackend *blk,\n             qapi_free_BlockDeviceInfo(info);\n             return NULL;\n         }\n+\n         if (bs0->drv && bs0->backing) {\n+            info->backing_file_depth++;\n             bs0 = bs0->backing->bs;\n             (*p_image_info)->has_backing_image = true;\n             p_image_info = &((*p_image_info)->backing_image);\n         } else {\n             break;\n         }\n+\n+        /* Skip automatically inserted nodes that the user isn't aware of for\n+         * query-block (blk != NULL), but not for query-named-block-nodes */\n+        while (blk && bs0 && bs0->drv && bs0->implicit) {\n+            bs0 = backing_bs(bs0);\n+        }\n     }\n \n     return info;\n@@ -322,6 +330,12 @@ static void bdrv_query_info(BlockBackend *blk, BlockInfo **p_info,\n {\n     BlockInfo *info = g_malloc0(sizeof(*info));\n     BlockDriverState *bs = blk_bs(blk);\n+\n+    /* Skip automatically inserted nodes that the user isn't aware of */\n+    while (bs && bs->drv && bs->implicit) {\n+        bs = backing_bs(bs);\n+    }\n+\n     info->device = g_strdup(blk_name(blk));\n     info->type = g_strdup(\"unknown\");\n     info->locked = blk_dev_is_medium_locked(blk);\n@@ -424,8 +438,8 @@ static void bdrv_query_blk_stats(BlockDeviceStats *ds, BlockBackend *blk)\n     }\n }\n \n-static BlockStats *bdrv_query_bds_stats(const BlockDriverState *bs,\n-                                 bool query_backing)\n+static BlockStats *bdrv_query_bds_stats(BlockDriverState *bs,\n+                                        bool blk_level)\n {\n     BlockStats *s = NULL;\n \n@@ -436,6 +450,14 @@ static BlockStats *bdrv_query_bds_stats(const BlockDriverState *bs,\n         return s;\n     }\n \n+    /* Skip automatically inserted nodes that the user isn't aware of in\n+     * a BlockBackend-level command. Stay at the exact node for a node-level\n+     * command. */\n+    while (blk_level && bs->drv && bs->implicit) {\n+        bs = backing_bs(bs);\n+        assert(bs);\n+    }\n+\n     if (bdrv_get_node_name(bs)[0]) {\n         s->has_node_name = true;\n         s->node_name = g_strdup(bdrv_get_node_name(bs));\n@@ -445,12 +467,12 @@ static BlockStats *bdrv_query_bds_stats(const BlockDriverState *bs,\n \n     if (bs->file) {\n         s->has_parent = true;\n-        s->parent = bdrv_query_bds_stats(bs->file->bs, query_backing);\n+        s->parent = bdrv_query_bds_stats(bs->file->bs, blk_level);\n     }\n \n-    if (query_backing && bs->backing) {\n+    if (blk_level && bs->backing) {\n         s->has_backing = true;\n-        s->backing = bdrv_query_bds_stats(bs->backing->bs, query_backing);\n+        s->backing = bdrv_query_bds_stats(bs->backing->bs, blk_level);\n     }\n \n     return s;\ndiff --git a/include/block/block.h b/include/block/block.h\nindex 4bf4843..060c08c 100644\n--- a/include/block/block.h\n+++ b/include/block/block.h\n@@ -292,7 +292,6 @@ int coroutine_fn bdrv_co_pwrite_zeroes(BdrvChild *child, int64_t offset,\n                                        int count, BdrvRequestFlags flags);\n BlockDriverState *bdrv_find_backing_image(BlockDriverState *bs,\n     const char *backing_file);\n-int bdrv_get_backing_file_depth(BlockDriverState *bs);\n void bdrv_refresh_filename(BlockDriverState *bs);\n int bdrv_truncate(BdrvChild *child, int64_t offset, Error **errp);\n int64_t bdrv_nb_sectors(BlockDriverState *bs);\ndiff --git a/include/block/block_int.h b/include/block/block_int.h\nindex 59400bd..89d7b45 100644\n--- a/include/block/block_int.h\n+++ b/include/block/block_int.h\n@@ -518,6 +518,7 @@ struct BlockDriverState {\n     bool valid_key; /* if true, a valid encryption key has been set */\n     bool sg;        /* if true, the device is a /dev/sg* */\n     bool probed;    /* if true, format was probed rather than specified */\n+    bool implicit;  /* if true, this filter node was automatically inserted */\n \n     BlockDriver *drv; /* NULL means no media */\n     void *opaque;\ndiff --git a/qapi/block-core.json b/qapi/block-core.json\nindex 38edada..7ce90ec 100644\n--- a/qapi/block-core.json\n+++ b/qapi/block-core.json\n@@ -467,7 +467,8 @@\n #\n # Get a list of BlockInfo for all virtual block devices.\n #\n-# Returns: a list of @BlockInfo describing each virtual block device\n+# Returns: a list of @BlockInfo describing each virtual block device. Filter\n+# nodes that were created implicitly are skipped over.\n #\n # Since: 0.14.0\n #\n@@ -723,7 +724,8 @@\n #               information, but not \"backing\".\n #               If false or omitted, the behavior is as before - query all the\n #               device backends, recursively including their \"parent\" and\n-#               \"backing\". (Since 2.3)\n+#               \"backing\". Filter nodes that were created implicitly are\n+#               skipped over in this mode. (Since 2.3)\n #\n # Returns: A list of @BlockStats for each virtual block devices.\n #\ndiff --git a/tests/qemu-iotests/040 b/tests/qemu-iotests/040\nindex 9d381d9..95b7510 100755\n--- a/tests/qemu-iotests/040\n+++ b/tests/qemu-iotests/040\n@@ -81,7 +81,7 @@ class TestSingleDrive(ImageCommitTestCase):\n         qemu_img('create', '-f', iotests.imgfmt, '-o', 'backing_file=%s' % mid_img, test_img)\n         qemu_io('-f', 'raw', '-c', 'write -P 0xab 0 524288', backing_img)\n         qemu_io('-f', iotests.imgfmt, '-c', 'write -P 0xef 524288 524288', mid_img)\n-        self.vm = iotests.VM().add_drive(test_img, interface=\"none\")\n+        self.vm = iotests.VM().add_drive(test_img, \"node-name=top,backing.node-name=mid,backing.backing.node-name=base\", interface=\"none\")\n         self.vm.add_device(\"virtio-scsi-pci\")\n         self.vm.add_device(\"scsi-hd,id=scsi0,drive=drive0\")\n         self.vm.launch()\n@@ -163,6 +163,34 @@ class TestSingleDrive(ImageCommitTestCase):\n \n         self.assert_no_active_block_jobs()\n \n+    # Tests that the insertion of the commit_top filter node doesn't make a\n+    # difference to query-blockstat\n+    def test_implicit_node(self):\n+        if self.image_len == 0:\n+            return\n+\n+        self.assert_no_active_block_jobs()\n+        result = self.vm.qmp('block-commit', device='drive0', top=mid_img,\n+                             base=backing_img, speed=(self.image_len / 4))\n+        self.assert_qmp(result, 'return', {})\n+\n+        result = self.vm.qmp('query-block')\n+        self.assert_qmp(result, 'return[0]/inserted/file', test_img)\n+        self.assert_qmp(result, 'return[0]/inserted/drv', iotests.imgfmt)\n+        self.assert_qmp(result, 'return[0]/inserted/backing_file', mid_img)\n+        self.assert_qmp(result, 'return[0]/inserted/backing_file_depth', 2)\n+        self.assert_qmp(result, 'return[0]/inserted/image/filename', test_img)\n+        self.assert_qmp(result, 'return[0]/inserted/image/backing-image/filename', mid_img)\n+        self.assert_qmp(result, 'return[0]/inserted/image/backing-image/backing-image/filename', backing_img)\n+\n+        result = self.vm.qmp('query-blockstats')\n+        self.assert_qmp(result, 'return[0]/node-name', 'top')\n+        self.assert_qmp(result, 'return[0]/backing/node-name', 'mid')\n+        self.assert_qmp(result, 'return[0]/backing/backing/node-name', 'base')\n+\n+        self.cancel_and_wait()\n+        self.assert_no_active_block_jobs()\n+\n class TestRelativePaths(ImageCommitTestCase):\n     image_len = 1 * 1024 * 1024\n     test_len = 1 * 1024 * 256\ndiff --git a/tests/qemu-iotests/040.out b/tests/qemu-iotests/040.out\nindex 6d9bee1..e20a75c 100644\n--- a/tests/qemu-iotests/040.out\n+++ b/tests/qemu-iotests/040.out\n@@ -1,5 +1,5 @@\n-...........................\n+.............................\n ----------------------------------------------------------------------\n-Ran 27 tests\n+Ran 29 tests\n \n OK\ndiff --git a/tests/qemu-iotests/041 b/tests/qemu-iotests/041\nindex 2f54986..60f09cc 100755\n--- a/tests/qemu-iotests/041\n+++ b/tests/qemu-iotests/041\n@@ -42,7 +42,7 @@ class TestSingleDrive(iotests.QMPTestCase):\n     def setUp(self):\n         iotests.create_image(backing_img, self.image_len)\n         qemu_img('create', '-f', iotests.imgfmt, '-o', 'backing_file=%s' % backing_img, test_img)\n-        self.vm = iotests.VM().add_drive(test_img)\n+        self.vm = iotests.VM().add_drive(test_img, \"node-name=top,backing.node-name=base\")\n         if iotests.qemu_default_machine == 'pc':\n             self.vm.add_drive(None, 'media=cdrom', 'ide')\n         self.vm.launch()\n@@ -169,6 +169,42 @@ class TestSingleDrive(iotests.QMPTestCase):\n         self.assertTrue(iotests.compare_images(test_img, target_img),\n                         'target image does not match source after mirroring')\n \n+    # Tests that the insertion of the mirror_top filter node doesn't make a\n+    # difference to query-block\n+    def test_implicit_node(self):\n+        self.assert_no_active_block_jobs()\n+\n+        result = self.vm.qmp(self.qmp_cmd, device='drive0', sync='full',\n+                             target=self.qmp_target)\n+        self.assert_qmp(result, 'return', {})\n+\n+        result = self.vm.qmp('query-block')\n+        self.assert_qmp(result, 'return[0]/inserted/file', test_img)\n+        self.assert_qmp(result, 'return[0]/inserted/drv', iotests.imgfmt)\n+        self.assert_qmp(result, 'return[0]/inserted/backing_file', backing_img)\n+        self.assert_qmp(result, 'return[0]/inserted/backing_file_depth', 1)\n+        self.assert_qmp(result, 'return[0]/inserted/image/filename', test_img)\n+        self.assert_qmp(result, 'return[0]/inserted/image/backing-image/filename', backing_img)\n+\n+        result = self.vm.qmp('query-blockstats')\n+        self.assert_qmp(result, 'return[0]/node-name', 'top')\n+        self.assert_qmp(result, 'return[0]/backing/node-name', 'base')\n+\n+        self.cancel_and_wait(force=True)\n+        result = self.vm.qmp('query-block')\n+        self.assert_qmp(result, 'return[0]/inserted/file', test_img)\n+        self.assert_qmp(result, 'return[0]/inserted/drv', iotests.imgfmt)\n+        self.assert_qmp(result, 'return[0]/inserted/backing_file', backing_img)\n+        self.assert_qmp(result, 'return[0]/inserted/backing_file_depth', 1)\n+        self.assert_qmp(result, 'return[0]/inserted/image/filename', test_img)\n+        self.assert_qmp(result, 'return[0]/inserted/image/backing-image/filename', backing_img)\n+\n+        result = self.vm.qmp('query-blockstats')\n+        self.assert_qmp(result, 'return[0]/node-name', 'top')\n+        self.assert_qmp(result, 'return[0]/backing/node-name', 'base')\n+\n+        self.vm.shutdown()\n+\n     def test_medium_not_found(self):\n         if iotests.qemu_default_machine != 'pc':\n             return\ndiff --git a/tests/qemu-iotests/041.out b/tests/qemu-iotests/041.out\nindex e30fd3b..c28b392 100644\n--- a/tests/qemu-iotests/041.out\n+++ b/tests/qemu-iotests/041.out\n@@ -1,5 +1,5 @@\n-...............................................................................\n+.....................................................................................\n ----------------------------------------------------------------------\n-Ran 79 tests\n+Ran 85 tests\n \n OK\n",
    "prefixes": [
        "75/79"
    ]
}