{"id":1072881,"url":"http://patchwork.ozlabs.org/api/patches/1072881/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20190401140903.19186-10-eblake@redhat.com/","project":{"id":14,"url":"http://patchwork.ozlabs.org/api/projects/14/?format=json","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":"<20190401140903.19186-10-eblake@redhat.com>","list_archive_url":null,"date":"2019-04-01T14:08:58","name":"[PULL,09/14] nbd/client: Report offsets in bdrv_block_status","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"faba040081d5a75d2437c46594e08a45cbd35c3c","submitter":{"id":6591,"url":"http://patchwork.ozlabs.org/api/people/6591/?format=json","name":"Eric Blake","email":"eblake@redhat.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20190401140903.19186-10-eblake@redhat.com/mbox/","series":[{"id":100345,"url":"http://patchwork.ozlabs.org/api/series/100345/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/list/?series=100345","date":"2019-04-01T14:08:49","name":"[PULL,01/14] qemu-img: Report bdrv_block_status failures","version":1,"mbox":"http://patchwork.ozlabs.org/series/100345/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/1072881/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/1072881/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=209.51.188.17; helo=lists.gnu.org;\n\tenvelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n\treceiver=<UNKNOWN>)","ozlabs.org;\n\tdmarc=fail (p=none dis=none) header.from=redhat.com"],"Received":["from lists.gnu.org (lists.gnu.org [209.51.188.17])\n\t(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 44Xvzb3F9lz9sQt\n\tfor <incoming@patchwork.ozlabs.org>;\n\tTue,  2 Apr 2019 01:36:27 +1100 (AEDT)","from localhost ([127.0.0.1]:40148 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 1hAy2z-0001pV-E3\n\tfor incoming@patchwork.ozlabs.org; Mon, 01 Apr 2019 10:36:25 -0400","from eggs.gnu.org ([209.51.188.92]:45984)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <eblake@redhat.com>) id 1hAxcq-00027u-7Y\n\tfor qemu-devel@nongnu.org; Mon, 01 Apr 2019 10:09:25 -0400","from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <eblake@redhat.com>) id 1hAxco-0004vU-BP\n\tfor qemu-devel@nongnu.org; Mon, 01 Apr 2019 10:09:24 -0400","from mx1.redhat.com ([209.132.183.28]:38448)\n\tby eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32)\n\t(Exim 4.71) (envelope-from <eblake@redhat.com>)\n\tid 1hAxci-0004mi-NN; Mon, 01 Apr 2019 10:09:16 -0400","from smtp.corp.redhat.com\n\t(int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23])\n\t(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby mx1.redhat.com (Postfix) with ESMTPS id 09A5C356F3;\n\tMon,  1 Apr 2019 14:09:16 +0000 (UTC)","from blue.redhat.com (ovpn-116-75.phx2.redhat.com [10.3.116.75])\n\tby smtp.corp.redhat.com (Postfix) with ESMTP id 57D5519C70;\n\tMon,  1 Apr 2019 14:09:15 +0000 (UTC)"],"From":"Eric Blake <eblake@redhat.com>","To":"qemu-devel@nongnu.org","Date":"Mon,  1 Apr 2019 09:08:58 -0500","Message-Id":"<20190401140903.19186-10-eblake@redhat.com>","In-Reply-To":"<20190401140903.19186-1-eblake@redhat.com>","References":"<20190401140903.19186-1-eblake@redhat.com>","MIME-Version":"1.0","X-Scanned-By":"MIMEDefang 2.84 on 10.5.11.23","X-Greylist":"Sender IP whitelisted, not delayed by milter-greylist-4.5.16\n\t(mx1.redhat.com [10.5.110.30]);\n\tMon, 01 Apr 2019 14:09:16 +0000 (UTC)","Content-Transfer-Encoding":"quoted-printable","X-detected-operating-system":"by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]","X-Received-From":"209.132.183.28","Subject":"[Qemu-devel] [PULL 09/14] nbd/client: Report offsets in\n\tbdrv_block_status","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>,\n\tVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>,\n\t\"Richard W . M . Jones\" <rjones@redhat.com>,\n\t\"open list:Network Block Dev...\" <qemu-block@nongnu.org>,\n\tMax Reitz <mreitz@redhat.com>","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":"It is desirable for 'qemu-img map' to have the same output for a file\nwhether it is served over file or nbd protocols. However, ever since\nwe implemented block status for NBD (2.12), the NBD protocol forgot to\ninform the block layer that as the final layer in the chain, the\noffset is valid; without an offset, the human-readable form of\nqemu-img map gives up with the unhelpful:\n\n$ nbdkit -U - data data=\"1\" size=512 --run 'qemu-img map $nbd'\nOffset          Length          Mapped to       File\nqemu-img: File contains external, encrypted or compressed clusters.\n\nThe --output=json form always works, because it is reporting the\nlower-level bdrv_block_status results directly rather than trying to\nfilter out sparse ranges for human consumption - but now it also\nshows the offset member.\n\nWith this patch, the human output changes to:\n\nOffset          Length          Mapped to       File\n0               0x200           0               nbd+unix://?socket=/tmp/nbdkitOxeoLa/socket\n\nThis change is observable to several iotests.\n\nFixes: 78a33ab5\nReported-by: Richard W.M. Jones <rjones@redhat.com>\nSigned-off-by: Eric Blake <eblake@redhat.com>\nMessage-Id: <20190329042750.14704-4-eblake@redhat.com>\nReviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>\n---\n block/nbd-client.c         |  9 +++++++--\n tests/qemu-iotests/209.out |  4 ++--\n tests/qemu-iotests/223.out | 18 +++++++++---------\n tests/qemu-iotests/241.out |  6 +++---\n 4 files changed, 21 insertions(+), 16 deletions(-)","diff":"diff --git a/block/nbd-client.c b/block/nbd-client.c\nindex 150af9cc46f..3edb508f668 100644\n--- a/block/nbd-client.c\n+++ b/block/nbd-client.c\n@@ -972,7 +972,9 @@ int coroutine_fn nbd_client_co_block_status(BlockDriverState *bs,\n\n     if (!client->info.base_allocation) {\n         *pnum = bytes;\n-        return BDRV_BLOCK_DATA;\n+        *map = offset;\n+        *file = bs;\n+        return BDRV_BLOCK_DATA | BDRV_BLOCK_OFFSET_VALID;\n     }\n\n     ret = nbd_co_send_request(bs, &request, NULL);\n@@ -995,8 +997,11 @@ int coroutine_fn nbd_client_co_block_status(BlockDriverState *bs,\n\n     assert(extent.length);\n     *pnum = extent.length;\n+    *map = offset;\n+    *file = bs;\n     return (extent.flags & NBD_STATE_HOLE ? 0 : BDRV_BLOCK_DATA) |\n-           (extent.flags & NBD_STATE_ZERO ? BDRV_BLOCK_ZERO : 0);\n+        (extent.flags & NBD_STATE_ZERO ? BDRV_BLOCK_ZERO : 0) |\n+        BDRV_BLOCK_OFFSET_VALID;\n }\n\n void nbd_client_detach_aio_context(BlockDriverState *bs)\ndiff --git a/tests/qemu-iotests/209.out b/tests/qemu-iotests/209.out\nindex 0d29724e84a..214e27bfcec 100644\n--- a/tests/qemu-iotests/209.out\n+++ b/tests/qemu-iotests/209.out\n@@ -1,2 +1,2 @@\n-[{ \"start\": 0, \"length\": 524288, \"depth\": 0, \"zero\": false, \"data\": true},\n-{ \"start\": 524288, \"length\": 524288, \"depth\": 0, \"zero\": true, \"data\": false}]\n+[{ \"start\": 0, \"length\": 524288, \"depth\": 0, \"zero\": false, \"data\": true, \"offset\": 0},\n+{ \"start\": 524288, \"length\": 524288, \"depth\": 0, \"zero\": true, \"data\": false, \"offset\": 524288}]\ndiff --git a/tests/qemu-iotests/223.out b/tests/qemu-iotests/223.out\nindex 95c40a17ad7..7828a447392 100644\n--- a/tests/qemu-iotests/223.out\n+++ b/tests/qemu-iotests/223.out\n@@ -67,18 +67,18 @@ read 1048576/1048576 bytes at offset 1048576\n 1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)\n read 2097152/2097152 bytes at offset 2097152\n 2 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)\n-[{ \"start\": 0, \"length\": 4096, \"depth\": 0, \"zero\": false, \"data\": true},\n-{ \"start\": 4096, \"length\": 1044480, \"depth\": 0, \"zero\": true, \"data\": false},\n-{ \"start\": 1048576, \"length\": 3145728, \"depth\": 0, \"zero\": false, \"data\": true}]\n+[{ \"start\": 0, \"length\": 4096, \"depth\": 0, \"zero\": false, \"data\": true, \"offset\": OFFSET},\n+{ \"start\": 4096, \"length\": 1044480, \"depth\": 0, \"zero\": true, \"data\": false, \"offset\": OFFSET},\n+{ \"start\": 1048576, \"length\": 3145728, \"depth\": 0, \"zero\": false, \"data\": true, \"offset\": OFFSET}]\n [{ \"start\": 0, \"length\": 65536, \"depth\": 0, \"zero\": false, \"data\": false},\n-{ \"start\": 65536, \"length\": 2031616, \"depth\": 0, \"zero\": false, \"data\": true},\n+{ \"start\": 65536, \"length\": 2031616, \"depth\": 0, \"zero\": false, \"data\": true, \"offset\": OFFSET},\n { \"start\": 2097152, \"length\": 2097152, \"depth\": 0, \"zero\": false, \"data\": false}]\n\n === Contrast to small granularity dirty-bitmap ===\n\n-[{ \"start\": 0, \"length\": 512, \"depth\": 0, \"zero\": false, \"data\": true},\n+[{ \"start\": 0, \"length\": 512, \"depth\": 0, \"zero\": false, \"data\": true, \"offset\": OFFSET},\n { \"start\": 512, \"length\": 512, \"depth\": 0, \"zero\": false, \"data\": false},\n-{ \"start\": 1024, \"length\": 2096128, \"depth\": 0, \"zero\": false, \"data\": true},\n+{ \"start\": 1024, \"length\": 2096128, \"depth\": 0, \"zero\": false, \"data\": true, \"offset\": OFFSET},\n { \"start\": 2097152, \"length\": 2097152, \"depth\": 0, \"zero\": false, \"data\": false}]\n\n === End qemu NBD server ===\n@@ -94,10 +94,10 @@ read 2097152/2097152 bytes at offset 2097152\n === Use qemu-nbd as server ===\n\n [{ \"start\": 0, \"length\": 65536, \"depth\": 0, \"zero\": false, \"data\": false},\n-{ \"start\": 65536, \"length\": 2031616, \"depth\": 0, \"zero\": false, \"data\": true},\n+{ \"start\": 65536, \"length\": 2031616, \"depth\": 0, \"zero\": false, \"data\": true, \"offset\": OFFSET},\n { \"start\": 2097152, \"length\": 2097152, \"depth\": 0, \"zero\": false, \"data\": false}]\n-[{ \"start\": 0, \"length\": 512, \"depth\": 0, \"zero\": false, \"data\": true},\n+[{ \"start\": 0, \"length\": 512, \"depth\": 0, \"zero\": false, \"data\": true, \"offset\": OFFSET},\n { \"start\": 512, \"length\": 512, \"depth\": 0, \"zero\": false, \"data\": false},\n-{ \"start\": 1024, \"length\": 2096128, \"depth\": 0, \"zero\": false, \"data\": true},\n+{ \"start\": 1024, \"length\": 2096128, \"depth\": 0, \"zero\": false, \"data\": true, \"offset\": OFFSET},\n { \"start\": 2097152, \"length\": 2097152, \"depth\": 0, \"zero\": false, \"data\": false}]\n *** done\ndiff --git a/tests/qemu-iotests/241.out b/tests/qemu-iotests/241.out\nindex b76a6234d72..f22eabbf324 100644\n--- a/tests/qemu-iotests/241.out\n+++ b/tests/qemu-iotests/241.out\n@@ -4,7 +4,7 @@ QA output created by 241\n\n   size:  1024\n   min block: 512\n-[{ \"start\": 0, \"length\": 1024, \"depth\": 0, \"zero\": false, \"data\": true}]\n+[{ \"start\": 0, \"length\": 1024, \"depth\": 0, \"zero\": false, \"data\": true, \"offset\": OFFSET}]\n 1 KiB (0x400) bytes     allocated at offset 0 bytes (0x0)\n\n === Exporting unaligned raw image, forced server sector alignment ===\n@@ -14,13 +14,13 @@ WARNING: Image format was not specified for '/home/eblake/qemu/tests/qemu-iotest\n          Specify the 'raw' format explicitly to remove the restrictions.\n   size:  1024\n   min block: 512\n-[{ \"start\": 0, \"length\": 1024, \"depth\": 0, \"zero\": false, \"data\": true}]\n+[{ \"start\": 0, \"length\": 1024, \"depth\": 0, \"zero\": false, \"data\": true, \"offset\": OFFSET}]\n 1 KiB (0x400) bytes     allocated at offset 0 bytes (0x0)\n\n === Exporting unaligned raw image, forced client sector alignment ===\n\n   size:  1024\n   min block: 512\n-[{ \"start\": 0, \"length\": 1024, \"depth\": 0, \"zero\": false, \"data\": true}]\n+[{ \"start\": 0, \"length\": 1024, \"depth\": 0, \"zero\": false, \"data\": true, \"offset\": OFFSET}]\n 1 KiB (0x400) bytes     allocated at offset 0 bytes (0x0)\n *** done\n","prefixes":["PULL","09/14"]}