get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 806866,
    "url": "http://patchwork.ozlabs.org/api/patches/806866/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/1503965694-10794-41-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-41-git-send-email-mdroth@linux.vnet.ibm.com>",
    "list_archive_url": null,
    "date": "2017-08-29T00:14:15",
    "name": "[40/79] blkdebug: Add pass-through write_zero and discard support",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "999672af76ba79a0eb4a3ec9b81231058e50c23c",
    "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-41-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/806866/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/806866/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 3xh9FG0qjtz9s7M\n\tfor <incoming@patchwork.ozlabs.org>;\n\tTue, 29 Aug 2017 10:56:34 +1000 (AEST)",
            "from localhost ([::1]:42110 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 1dmUpU-0003ZV-0O\n\tfor incoming@patchwork.ozlabs.org; Mon, 28 Aug 2017 20:56:32 -0400",
            "from eggs.gnu.org ([2001:4830:134:3::10]:48114)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <mdroth@linux.vnet.ibm.com>) id 1dmUCV-0001KK-HJ\n\tfor qemu-devel@nongnu.org; Mon, 28 Aug 2017 20:16:18 -0400",
            "from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <mdroth@linux.vnet.ibm.com>) id 1dmUCS-0005V2-Id\n\tfor qemu-devel@nongnu.org; Mon, 28 Aug 2017 20:16:15 -0400",
            "from mx0a-001b2d01.pphosted.com ([148.163.156.1]:56461)\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 1dmUCS-0005U3-9h\n\tfor qemu-devel@nongnu.org; Mon, 28 Aug 2017 20:16:12 -0400",
            "from pps.filterd (m0098410.ppops.net [127.0.0.1])\n\tby mx0a-001b2d01.pphosted.com (8.16.0.21/8.16.0.21) with SMTP id\n\tv7T0EA97042733\n\tfor <qemu-devel@nongnu.org>; Mon, 28 Aug 2017 20:16:11 -0400",
            "from e15.ny.us.ibm.com (e15.ny.us.ibm.com [129.33.205.205])\n\tby mx0a-001b2d01.pphosted.com with ESMTP id 2cmr8nf038-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:11 -0400",
            "from localhost\n\tby e15.ny.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 20:16:09 -0400",
            "from b01cxnp23033.gho.pok.ibm.com (9.57.198.28)\n\tby e15.ny.us.ibm.com (146.89.104.202) with IBM ESMTP SMTP Gateway:\n\tAuthorized Use Only! Violators will be prosecuted; \n\tMon, 28 Aug 2017 20:16:07 -0400",
            "from b01ledav001.gho.pok.ibm.com (b01ledav001.gho.pok.ibm.com\n\t[9.57.199.106])\n\tby b01cxnp23033.gho.pok.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP\n\tid v7T0G6v22752814; Tue, 29 Aug 2017 00:16:06 GMT",
            "from b01ledav001.gho.pok.ibm.com (unknown [127.0.0.1])\n\tby IMSVA (Postfix) with ESMTP id E262D28056;\n\tMon, 28 Aug 2017 20:15:59 -0400 (EDT)",
            "from localhost (unknown [9.80.85.217])\n\tby b01ledav001.gho.pok.ibm.com (Postfix) with ESMTP id B449F2803E;\n\tMon, 28 Aug 2017 20:15:59 -0400 (EDT)"
        ],
        "From": "Michael Roth <mdroth@linux.vnet.ibm.com>",
        "To": "qemu-devel@nongnu.org",
        "Date": "Mon, 28 Aug 2017 19:14:15 -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-0036-0000-0000-000002603F70",
        "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.00909027; 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:08",
        "X-IBM-AV-DETECTION": "SAVI=unused REMOTE=unused XFE=unused",
        "x-cbparentid": "17082900-0037-0000-0000-000041964A75",
        "Message-Id": "<1503965694-10794-41-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=1\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.156.1",
        "Subject": "[Qemu-devel] [PATCH 40/79] blkdebug: Add pass-through write_zero\n\tand discard support",
        "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": "qemu-stable@nongnu.org, Max 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": "From: Eric Blake <eblake@redhat.com>\n\nIn order to test the effects of artificial geometry constraints\non operations like write zero or discard, we first need blkdebug\nto manage these actions.  It also allows us to inject errors on\nthose operations, just like we can for read/write/flush.\n\nWe can also test the contract promised by the block layer; namely,\nif a device has specified limits on alignment or maximum size,\nthen those limits must be obeyed (for now, the blkdebug driver\nmerely inherits limits from whatever it is wrapping, but the next\npatch will further enhance it to allow specific limit overrides).\n\nThis patch intentionally refuses to service requests smaller than\nthe requested alignments; this is because an upcoming patch adds\na qemu-iotest to prove that the block layer is correctly handling\nfragmentation, but the test only works if there is a way to tell\nthe difference at artificial alignment boundaries when blkdebug is\nusing a larger-than-default alignment.  If we let the blkdebug\nlayer always defer to the underlying layer, which potentially has\na smaller granularity, the iotest will be thwarted.\n\nTested by setting up an NBD server with export 'foo', then invoking:\n$ ./qemu-io\nqemu-io> open -o driver=blkdebug blkdebug::nbd://localhost:10809/foo\nqemu-io> d 0 15M\nqemu-io> w -z 0 15M\n\nPre-patch, the server never sees the discard (it was silently\neaten by the block layer); post-patch it is passed across the\nwire.  Likewise, pre-patch the write is always passed with\nNBD_WRITE (with 15M of zeroes on the wire), while post-patch\nit can utilize NBD_WRITE_ZEROES (for less traffic).\n\nSigned-off-by: Eric Blake <eblake@redhat.com>\nReviewed-by: Max Reitz <mreitz@redhat.com>\nMessage-id: 20170429191419.30051-7-eblake@redhat.com\nSigned-off-by: Max Reitz <mreitz@redhat.com>\n(cherry picked from commit 63188c245013dbe383e8b031e665f813e2452ea5)\n* prereq for 81c219a\nSigned-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>\n---\n block/blkdebug.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n 1 file changed, 74 insertions(+)",
    "diff": "diff --git a/block/blkdebug.c b/block/blkdebug.c\nindex c5d2edb..a3dc5f6 100644\n--- a/block/blkdebug.c\n+++ b/block/blkdebug.c\n@@ -1,6 +1,7 @@\n /*\n  * Block protocol for I/O error injection\n  *\n+ * Copyright (C) 2016-2017 Red Hat, Inc.\n  * Copyright (c) 2010 Kevin Wolf <kwolf@redhat.com>\n  *\n  * Permission is hereby granted, free of charge, to any person obtaining a copy\n@@ -382,6 +383,11 @@ static int blkdebug_open(BlockDriverState *bs, QDict *options, int flags,\n         goto out;\n     }\n \n+    bs->supported_write_flags = BDRV_REQ_FUA &\n+        bs->file->bs->supported_write_flags;\n+    bs->supported_zero_flags = (BDRV_REQ_FUA | BDRV_REQ_MAY_UNMAP) &\n+        bs->file->bs->supported_zero_flags;\n+\n     /* Set request alignment */\n     align = qemu_opt_get_size(opts, \"align\", 0);\n     if (align < INT_MAX && is_power_of_2(align)) {\n@@ -494,6 +500,72 @@ static int blkdebug_co_flush(BlockDriverState *bs)\n     return bdrv_co_flush(bs->file->bs);\n }\n \n+static int coroutine_fn blkdebug_co_pwrite_zeroes(BlockDriverState *bs,\n+                                                  int64_t offset, int count,\n+                                                  BdrvRequestFlags flags)\n+{\n+    uint32_t align = MAX(bs->bl.request_alignment,\n+                         bs->bl.pwrite_zeroes_alignment);\n+    int err;\n+\n+    /* Only pass through requests that are larger than requested\n+     * preferred alignment (so that we test the fallback to writes on\n+     * unaligned portions), and check that the block layer never hands\n+     * us anything unaligned that crosses an alignment boundary.  */\n+    if (count < align) {\n+        assert(QEMU_IS_ALIGNED(offset, align) ||\n+               QEMU_IS_ALIGNED(offset + count, align) ||\n+               DIV_ROUND_UP(offset, align) ==\n+               DIV_ROUND_UP(offset + count, align));\n+        return -ENOTSUP;\n+    }\n+    assert(QEMU_IS_ALIGNED(offset, align));\n+    assert(QEMU_IS_ALIGNED(count, align));\n+    if (bs->bl.max_pwrite_zeroes) {\n+        assert(count <= bs->bl.max_pwrite_zeroes);\n+    }\n+\n+    err = rule_check(bs, offset, count);\n+    if (err) {\n+        return err;\n+    }\n+\n+    return bdrv_co_pwrite_zeroes(bs->file, offset, count, flags);\n+}\n+\n+static int coroutine_fn blkdebug_co_pdiscard(BlockDriverState *bs,\n+                                             int64_t offset, int count)\n+{\n+    uint32_t align = bs->bl.pdiscard_alignment;\n+    int err;\n+\n+    /* Only pass through requests that are larger than requested\n+     * minimum alignment, and ensure that unaligned requests do not\n+     * cross optimum discard boundaries. */\n+    if (count < bs->bl.request_alignment) {\n+        assert(QEMU_IS_ALIGNED(offset, align) ||\n+               QEMU_IS_ALIGNED(offset + count, align) ||\n+               DIV_ROUND_UP(offset, align) ==\n+               DIV_ROUND_UP(offset + count, align));\n+        return -ENOTSUP;\n+    }\n+    assert(QEMU_IS_ALIGNED(offset, bs->bl.request_alignment));\n+    assert(QEMU_IS_ALIGNED(count, bs->bl.request_alignment));\n+    if (align && count >= align) {\n+        assert(QEMU_IS_ALIGNED(offset, align));\n+        assert(QEMU_IS_ALIGNED(count, align));\n+    }\n+    if (bs->bl.max_pdiscard) {\n+        assert(count <= bs->bl.max_pdiscard);\n+    }\n+\n+    err = rule_check(bs, offset, count);\n+    if (err) {\n+        return err;\n+    }\n+\n+    return bdrv_co_pdiscard(bs->file->bs, offset, count);\n+}\n \n static void blkdebug_close(BlockDriverState *bs)\n {\n@@ -748,6 +820,8 @@ static BlockDriver bdrv_blkdebug = {\n     .bdrv_co_preadv         = blkdebug_co_preadv,\n     .bdrv_co_pwritev        = blkdebug_co_pwritev,\n     .bdrv_co_flush_to_disk  = blkdebug_co_flush,\n+    .bdrv_co_pwrite_zeroes  = blkdebug_co_pwrite_zeroes,\n+    .bdrv_co_pdiscard       = blkdebug_co_pdiscard,\n \n     .bdrv_debug_event           = blkdebug_debug_event,\n     .bdrv_debug_breakpoint      = blkdebug_debug_breakpoint,\n",
    "prefixes": [
        "40/79"
    ]
}