get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 806845,
    "url": "http://patchwork.ozlabs.org/api/patches/806845/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/1503965694-10794-31-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-31-git-send-email-mdroth@linux.vnet.ibm.com>",
    "list_archive_url": null,
    "date": "2017-08-29T00:14:05",
    "name": "[30/79] curl: avoid recursive locking of BDRVCURLState mutex",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "5ec667c93925448099a8603bc6301f8edf0f5441",
    "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-31-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/806845/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/806845/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 3xh8vJ0zKjz9sNc\n\tfor <incoming@patchwork.ozlabs.org>;\n\tTue, 29 Aug 2017 10:41:00 +1000 (AEST)",
            "from localhost ([::1]:42019 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 1dmUaP-0006Oq-UC\n\tfor incoming@patchwork.ozlabs.org; Mon, 28 Aug 2017 20:40:58 -0400",
            "from eggs.gnu.org ([2001:4830:134:3::10]:47834)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <mdroth@linux.vnet.ibm.com>) id 1dmUCM-00018X-RN\n\tfor qemu-devel@nongnu.org; Mon, 28 Aug 2017 20:16:09 -0400",
            "from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <mdroth@linux.vnet.ibm.com>) id 1dmUCJ-0005M3-MV\n\tfor qemu-devel@nongnu.org; Mon, 28 Aug 2017 20:16:06 -0400",
            "from mx0a-001b2d01.pphosted.com ([148.163.156.1]:57325)\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 1dmUCJ-0005Ku-Er\n\tfor qemu-devel@nongnu.org; Mon, 28 Aug 2017 20:16:03 -0400",
            "from pps.filterd (m0098394.ppops.net [127.0.0.1])\n\tby mx0a-001b2d01.pphosted.com (8.16.0.21/8.16.0.21) with SMTP id\n\tv7T0E8sW041493\n\tfor <qemu-devel@nongnu.org>; Mon, 28 Aug 2017 20:16:02 -0400",
            "from e14.ny.us.ibm.com (e14.ny.us.ibm.com [129.33.205.204])\n\tby mx0a-001b2d01.pphosted.com with ESMTP id 2cmsrsj1fp-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:02 -0400",
            "from localhost\n\tby e14.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:01 -0400",
            "from b01cxnp23034.gho.pok.ibm.com (9.57.198.29)\n\tby e14.ny.us.ibm.com (146.89.104.201) with IBM ESMTP SMTP Gateway:\n\tAuthorized Use Only! Violators will be prosecuted; \n\tMon, 28 Aug 2017 20:15:58 -0400",
            "from b01ledav001.gho.pok.ibm.com (b01ledav001.gho.pok.ibm.com\n\t[9.57.199.106])\n\tby b01cxnp23034.gho.pok.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP\n\tid v7T0Fw3w25952488; Tue, 29 Aug 2017 00:15:58 GMT",
            "from b01ledav001.gho.pok.ibm.com (unknown [127.0.0.1])\n\tby IMSVA (Postfix) with ESMTP id 6216B2804A;\n\tMon, 28 Aug 2017 20:15:51 -0400 (EDT)",
            "from localhost (unknown [9.80.85.217])\n\tby b01ledav001.gho.pok.ibm.com (Postfix) with ESMTP id 298F928046;\n\tMon, 28 Aug 2017 20:15:51 -0400 (EDT)"
        ],
        "From": "Michael Roth <mdroth@linux.vnet.ibm.com>",
        "To": "qemu-devel@nongnu.org",
        "Date": "Mon, 28 Aug 2017 19:14:05 -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-0052-0000-0000-000002573341",
        "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:15:59",
        "X-IBM-AV-DETECTION": "SAVI=unused REMOTE=unused XFE=unused",
        "x-cbparentid": "17082900-0053-0000-0000-000051D1D941",
        "Message-Id": "<1503965694-10794-31-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.156.1",
        "Subject": "[Qemu-devel] [PATCH 30/79] curl: avoid recursive locking of\n\tBDRVCURLState mutex",
        "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": "Paolo Bonzini <pbonzini@redhat.com>, Jeff Cody <jcody@redhat.com>,\n\tqemu-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: Paolo Bonzini <pbonzini@redhat.com>\n\nThe curl driver has a ugly hack where, if it cannot find an empty CURLState,\nit just uses aio_poll to wait for one to be empty.  This is probably\nbuggy when used together with dataplane, and the simplest way to fix it\nis to use coroutines instead.\n\nA more immediate effect of the bug however is that it can cause a\nrecursive call to curl_readv_bh_cb and recursively taking the\nBDRVCURLState mutex.  This causes a deadlock.\n\nThe fix is to unlock the mutex around aio_poll, but for cleanliness we\nshould also take the mutex around all calls to curl_init_state, even if\nreaching the unlock/lock pair is impossible.  The same is true for\ncurl_clean_state.\n\nReported-by: Kun Wei <kuwei@redhat.com>\nTested-by: Richard W.M. Jones <rjones@redhat.com>\nReviewed-by: Max Reitz <mreitz@redhat.com>\nReviewed-by: Jeff Cody <jcody@redhat.com>\nSigned-off-by: Paolo Bonzini <pbonzini@redhat.com>\nMessage-id: 20170515100059.15795-4-pbonzini@redhat.com\nCc: qemu-stable@nongnu.org\nCc: Jeff Cody <jcody@redhat.com>\nSigned-off-by: Paolo Bonzini <pbonzini@redhat.com>\nSigned-off-by: Jeff Cody <jcody@redhat.com>\n(cherry picked from commit 456af346297ebef86aa097b3609534d34f3d2f75)\nSigned-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>\n---\n block/curl.c | 14 +++++++++++++-\n 1 file changed, 13 insertions(+), 1 deletion(-)",
    "diff": "diff --git a/block/curl.c b/block/curl.c\nindex 59e69c6..dddf5ef 100644\n--- a/block/curl.c\n+++ b/block/curl.c\n@@ -281,6 +281,7 @@ read_end:\n     return size * nmemb;\n }\n \n+/* Called with s->mutex held.  */\n static int curl_find_buf(BDRVCURLState *s, size_t start, size_t len,\n                          CURLAIOCB *acb)\n {\n@@ -453,6 +454,7 @@ static void curl_multi_timeout_do(void *arg)\n #endif\n }\n \n+/* Called with s->mutex held.  */\n static CURLState *curl_init_state(BlockDriverState *bs, BDRVCURLState *s)\n {\n     CURLState *state = NULL;\n@@ -471,7 +473,9 @@ static CURLState *curl_init_state(BlockDriverState *bs, BDRVCURLState *s)\n             break;\n         }\n         if (!state) {\n+            qemu_mutex_unlock(&s->mutex);\n             aio_poll(bdrv_get_aio_context(bs), true);\n+            qemu_mutex_lock(&s->mutex);\n         }\n     } while(!state);\n \n@@ -534,6 +538,7 @@ static CURLState *curl_init_state(BlockDriverState *bs, BDRVCURLState *s)\n     return state;\n }\n \n+/* Called with s->mutex held.  */\n static void curl_clean_state(CURLState *s)\n {\n     int j;\n@@ -565,6 +570,7 @@ static void curl_detach_aio_context(BlockDriverState *bs)\n     BDRVCURLState *s = bs->opaque;\n     int i;\n \n+    qemu_mutex_lock(&s->mutex);\n     for (i = 0; i < CURL_NUM_STATES; i++) {\n         if (s->states[i].in_use) {\n             curl_clean_state(&s->states[i]);\n@@ -580,6 +586,7 @@ static void curl_detach_aio_context(BlockDriverState *bs)\n         curl_multi_cleanup(s->multi);\n         s->multi = NULL;\n     }\n+    qemu_mutex_unlock(&s->mutex);\n \n     timer_del(&s->timer);\n }\n@@ -677,6 +684,7 @@ static int curl_open(BlockDriverState *bs, QDict *options, int flags,\n         return -EROFS;\n     }\n \n+    qemu_mutex_init(&s->mutex);\n     opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);\n     qemu_opts_absorb_qdict(opts, options, &local_err);\n     if (local_err) {\n@@ -747,7 +755,9 @@ static int curl_open(BlockDriverState *bs, QDict *options, int flags,\n     DPRINTF(\"CURL: Opening %s\\n\", file);\n     s->aio_context = bdrv_get_aio_context(bs);\n     s->url = g_strdup(file);\n+    qemu_mutex_lock(&s->mutex);\n     state = curl_init_state(bs, s);\n+    qemu_mutex_unlock(&s->mutex);\n     if (!state)\n         goto out_noclean;\n \n@@ -791,11 +801,12 @@ static int curl_open(BlockDriverState *bs, QDict *options, int flags,\n     }\n     DPRINTF(\"CURL: Size = %zd\\n\", s->len);\n \n+    qemu_mutex_lock(&s->mutex);\n     curl_clean_state(state);\n+    qemu_mutex_unlock(&s->mutex);\n     curl_easy_cleanup(state->curl);\n     state->curl = NULL;\n \n-    qemu_mutex_init(&s->mutex);\n     curl_attach_aio_context(bs, bdrv_get_aio_context(bs));\n \n     qemu_opts_del(opts);\n@@ -806,6 +817,7 @@ out:\n     curl_easy_cleanup(state->curl);\n     state->curl = NULL;\n out_noclean:\n+    qemu_mutex_destroy(&s->mutex);\n     g_free(s->cookie);\n     g_free(s->url);\n     qemu_opts_del(opts);\n",
    "prefixes": [
        "30/79"
    ]
}