Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/813850/?format=api
{ "id": 813850, "url": "http://patchwork.ozlabs.org/api/patches/813850/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20170914144032.14945-2-eblake@redhat.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": "<20170914144032.14945-2-eblake@redhat.com>", "list_archive_url": null, "date": "2017-09-14T14:40:13", "name": "[v3,01/20] block: Add .bdrv_co_block_status() callback", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "cb1a0a593bf57011c563b9906c4ec9385b80d237", "submitter": { "id": 6591, "url": "http://patchwork.ozlabs.org/api/people/6591/?format=api", "name": "Eric Blake", "email": "eblake@redhat.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20170914144032.14945-2-eblake@redhat.com/mbox/", "series": [ { "id": 3114, "url": "http://patchwork.ozlabs.org/api/series/3114/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=3114", "date": "2017-09-14T14:40:12", "name": "add byte-based block_status driver callbacks", "version": 3, "mbox": "http://patchwork.ozlabs.org/series/3114/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/813850/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/813850/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>)", "ext-mx08.extmail.prod.ext.phx2.redhat.com;\n\tdmarc=none (p=none dis=none) header.from=redhat.com", "ext-mx08.extmail.prod.ext.phx2.redhat.com;\n\tspf=fail smtp.mailfrom=eblake@redhat.com" ], "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 3xtLw63QYpz9s0Z\n\tfor <incoming@patchwork.ozlabs.org>;\n\tFri, 15 Sep 2017 00:47:02 +1000 (AEST)", "from localhost ([::1]:48203 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 1dsVPw-0002bb-CO\n\tfor incoming@patchwork.ozlabs.org; Thu, 14 Sep 2017 10:47:00 -0400", "from eggs.gnu.org ([2001:4830:134:3::10]:46267)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <eblake@redhat.com>) id 1dsVK5-0005Zf-2e\n\tfor qemu-devel@nongnu.org; Thu, 14 Sep 2017 10:40:58 -0400", "from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <eblake@redhat.com>) id 1dsVK0-0002Na-KK\n\tfor qemu-devel@nongnu.org; Thu, 14 Sep 2017 10:40:57 -0400", "from mx1.redhat.com ([209.132.183.28]:56090)\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 1dsVJr-0002Fj-Tg; Thu, 14 Sep 2017 10:40:44 -0400", "from smtp.corp.redhat.com\n\t(int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13])\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 C0786C057FA7;\n\tThu, 14 Sep 2017 14:40:42 +0000 (UTC)", "from red.redhat.com (ovpn-123-70.rdu2.redhat.com [10.10.123.70])\n\tby smtp.corp.redhat.com (Postfix) with ESMTP id 7D63C60841;\n\tThu, 14 Sep 2017 14:40:39 +0000 (UTC)" ], "DMARC-Filter": "OpenDMARC Filter v1.3.2 mx1.redhat.com C0786C057FA7", "From": "Eric Blake <eblake@redhat.com>", "To": "qemu-devel@nongnu.org", "Date": "Thu, 14 Sep 2017 09:40:13 -0500", "Message-Id": "<20170914144032.14945-2-eblake@redhat.com>", "In-Reply-To": "<20170914144032.14945-1-eblake@redhat.com>", "References": "<20170914144032.14945-1-eblake@redhat.com>", "X-Scanned-By": "MIMEDefang 2.79 on 10.5.11.13", "X-Greylist": "Sender IP whitelisted, not delayed by milter-greylist-4.5.16\n\t(mx1.redhat.com [10.5.110.32]);\n\tThu, 14 Sep 2017 14:40:42 +0000 (UTC)", "X-detected-operating-system": "by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]\n\t[fuzzy]", "X-Received-From": "209.132.183.28", "Subject": "[Qemu-devel] [PATCH v3 01/20] block: Add .bdrv_co_block_status()\n\tcallback", "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": "kwolf@redhat.com, famz@redhat.com, qemu-block@nongnu.org,\n\tMax Reitz <mreitz@redhat.com>,\n\tStefan Hajnoczi <stefanha@redhat.com>, jsnow@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": "We are gradually moving away from sector-based interfaces, towards\nbyte-based. Now that the block layer exposes byte-based allocation,\nit's time to tackle the drivers. Add a new callback that operates\non as small as byte boundaries. Subsequent patches will then update\nindividual drivers, then finally remove .bdrv_co_get_block_status().\nThe old code now uses a goto in order to minimize churn at that later\nremoval.\n\nThe new code also passes through the 'mapping' hint, which will\nallow subsequent patches to further optimize callers that only care\nabout how much of the image is allocated, rather than which offsets\nthe allocation actually maps to.\n\nNote that most drivers give sector-aligned answers, except at\nend-of-file, even when request_alignment is smaller than a sector.\nHowever, bdrv_getlength() is sector-aligned (even though it gives a\nbyte answer), often by exceeding the actual file size. If we were to\ngive back strict results, at least file-posix.c would report a\ntransition from DATA to HOLE at the end of a file even in the middle\nof a sector, which can throw off callers; so we intentionally lie and\nstate that any partial sector at the end of a file has the same\nstatus for the entire sector.\n\nSigned-off-by: Eric Blake <eblake@redhat.com>\n\n---\nv2: improve alignment handling, ensure all iotests still pass\n---\n include/block/block_int.h | 11 ++++++++---\n block/io.c | 27 ++++++++++++++++++++++++---\n 2 files changed, 32 insertions(+), 6 deletions(-)", "diff": "diff --git a/include/block/block_int.h b/include/block/block_int.h\nindex b1ceffba78..0ba57dc35c 100644\n--- a/include/block/block_int.h\n+++ b/include/block/block_int.h\n@@ -206,13 +206,18 @@ struct BlockDriver {\n * bdrv_is_allocated[_above]. The driver should answer only\n * according to the current layer, and should not set\n * BDRV_BLOCK_ALLOCATED, but may set BDRV_BLOCK_RAW. See block.h\n- * for the meaning of _DATA, _ZERO, and _OFFSET_VALID. The block\n- * layer guarantees input aligned to request_alignment, as well as\n- * non-NULL pnum and file.\n+ * for the meaning of _DATA, _ZERO, and _OFFSET_VALID. As a hint,\n+ * the flag mapping is true if the caller cares more about precise\n+ * mappings (favor _OFFSET_VALID) or false for overall allocation\n+ * (favor larger *pnum). The block layer guarantees input aligned\n+ * to request_alignment, as well as non-NULL pnum and file.\n */\n int64_t coroutine_fn (*bdrv_co_get_block_status)(BlockDriverState *bs,\n int64_t sector_num, int nb_sectors, int *pnum,\n BlockDriverState **file);\n+ int64_t coroutine_fn (*bdrv_co_block_status)(BlockDriverState *bd,\n+ bool mapping, int64_t offset, int64_t bytes, int64_t *pnum,\n+ BlockDriverState **file);\n\n /*\n * Invalidate any cached meta-data.\ndiff --git a/block/io.c b/block/io.c\nindex e0f9bca7e2..4fb544d25c 100644\n--- a/block/io.c\n+++ b/block/io.c\n@@ -1794,7 +1794,7 @@ static int64_t coroutine_fn bdrv_co_block_status(BlockDriverState *bs,\n bytes = n;\n }\n\n- if (!bs->drv->bdrv_co_get_block_status) {\n+ if (!bs->drv->bdrv_co_get_block_status && !bs->drv->bdrv_co_block_status) {\n *pnum = bytes;\n ret = BDRV_BLOCK_DATA | BDRV_BLOCK_ALLOCATED;\n if (offset + bytes == total_size) {\n@@ -1814,11 +1814,14 @@ static int64_t coroutine_fn bdrv_co_block_status(BlockDriverState *bs,\n bdrv_inc_in_flight(bs);\n\n /* Round out to request_alignment boundaries */\n- align = MAX(bs->bl.request_alignment, BDRV_SECTOR_SIZE);\n+ align = bs->bl.request_alignment;\n+ if (bs->drv->bdrv_co_get_block_status && align < BDRV_SECTOR_SIZE) {\n+ align = BDRV_SECTOR_SIZE;\n+ }\n aligned_offset = QEMU_ALIGN_DOWN(offset, align);\n aligned_bytes = ROUND_UP(offset + bytes, align) - aligned_offset;\n\n- {\n+ if (bs->drv->bdrv_co_get_block_status) {\n int count; /* sectors */\n\n assert(QEMU_IS_ALIGNED(aligned_offset | aligned_bytes,\n@@ -1832,8 +1835,26 @@ static int64_t coroutine_fn bdrv_co_block_status(BlockDriverState *bs,\n goto out;\n }\n *pnum = count * BDRV_SECTOR_SIZE;\n+ goto refine;\n }\n\n+ ret = bs->drv->bdrv_co_block_status(bs, mapping, aligned_offset,\n+ aligned_bytes, pnum, &local_file);\n+ if (ret < 0) {\n+ *pnum = 0;\n+ goto out;\n+ }\n+\n+ /*\n+ * total_size is always sector-aligned, by sometimes exceeding actual\n+ * file size. Expand pnum if it lands mid-sector due to end-of-file.\n+ */\n+ if (QEMU_ALIGN_UP(*pnum + aligned_offset,\n+ BDRV_SECTOR_SIZE) == total_size) {\n+ *pnum = total_size - aligned_offset;\n+ }\n+\n+ refine:\n /* Clamp pnum and ret to original request */\n assert(QEMU_IS_ALIGNED(*pnum, align));\n *pnum -= offset - aligned_offset;\n", "prefixes": [ "v3", "01/20" ] }