get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 2216293,
    "url": "http://patchwork.ozlabs.org/api/patches/2216293/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260326091948.194529-2-silvan@quobyte.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": "<20260326091948.194529-2-silvan@quobyte.com>",
    "list_archive_url": null,
    "date": "2026-03-26T09:19:46",
    "name": "[1/3] block: Add 'posix' option for file locking",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "21ed5624cd766000be42ca8a48330cf5bcb46ea5",
    "submitter": {
        "id": 92975,
        "url": "http://patchwork.ozlabs.org/api/people/92975/?format=api",
        "name": "Silvan Kaiser",
        "email": "silvan@quobyte.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260326091948.194529-2-silvan@quobyte.com/mbox/",
    "series": [
        {
            "id": 497558,
            "url": "http://patchwork.ozlabs.org/api/series/497558/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=497558",
            "date": "2026-03-26T09:19:45",
            "name": "block: Add 'posix' option for file locking",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/497558/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2216293/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2216293/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@legolas.ozlabs.org",
        "Authentication-Results": [
            "legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=quobyte.com header.i=@quobyte.com header.a=rsa-sha256\n header.s=google header.b=yKtRcrCC;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"
        ],
        "Received": [
            "from lists.gnu.org (lists.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fhJF80mTCz1y1x\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 26 Mar 2026 20:21:48 +1100 (AEDT)",
            "from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1w5gtm-0000oY-CU; Thu, 26 Mar 2026 05:21:06 -0400",
            "from eggs.gnu.org ([2001:470:142:3::10])\n by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <silvan@quobyte.com>)\n id 1w5gtk-0000lj-Vt\n for qemu-devel@nongnu.org; Thu, 26 Mar 2026 05:21:05 -0400",
            "from mail-wm1-x333.google.com ([2a00:1450:4864:20::333])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)\n (Exim 4.90_1) (envelope-from <silvan@quobyte.com>)\n id 1w5gth-0000KS-VX\n for qemu-devel@nongnu.org; Thu, 26 Mar 2026 05:21:04 -0400",
            "by mail-wm1-x333.google.com with SMTP id\n 5b1f17b1804b1-48540d21f7dso8006935e9.0\n for <qemu-devel@nongnu.org>; Thu, 26 Mar 2026 02:21:01 -0700 (PDT)",
            "from kaisers.corp.quobyte.com ([24.134.167.61])\n by smtp.gmail.com with ESMTPSA id\n 5b1f17b1804b1-48722c9506dsm16474295e9.7.2026.03.26.02.20.58\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Thu, 26 Mar 2026 02:20:59 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=quobyte.com; s=google; t=1774516860; x=1775121660; darn=nongnu.org;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:from:to:cc:subject:date\n :message-id:reply-to;\n bh=7G7nq1NGmHEb9erj4D2akBfJiwls4FugzcHGpskJvPs=;\n b=yKtRcrCCXQ492PWxrdnz5Y1JkH69ODHnMtS+7pFLvwo19qBhUp1KIwOKHEF8/jWZTh\n 0VZyvhWKQH54hAfGES2Anvb8BWtCk185OOHLgus02b4eYIMBp8WBVu/Te1t3ehxWvfe+\n Zh9RT4PtN0FMOJNOdkTrVf+tEj9LdnxEd8QjM=",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1774516860; x=1775121660;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from\n :to:cc:subject:date:message-id:reply-to;\n bh=7G7nq1NGmHEb9erj4D2akBfJiwls4FugzcHGpskJvPs=;\n b=gYEU5x4KnIBZN0c5RtYzZaR6W2r15JYYrP4lBetl4aXERKq+t/Gy0aGduS+Jf9TQub\n 1lkncHgChy9ruOJWdlTOSiu6gXDa6MyW8Z4m+6OH+xtp66tiuZ+RLCbEHLwmg0IadJci\n BDIZfEhrAvRDOuhAkIw6rw/B/YX7thV/jmYOKXYJ+6CJ5Vags3DwbA+ANMvE8HlsRUoK\n PUhX01eARhtzswm90XejaivnMymz+0VcFlGudeggQ1OBEaRY99ewR5P2/0SkDqmN7URf\n q4xmzD17YkdJ3KbKMnDB+zQU4SpJ1fJEWFIZhX4YjRAGuvPMZp04wBtFUVwUafPAQlSk\n BGSA==",
        "X-Gm-Message-State": "AOJu0Yzr+aA7VuMcgo1NFhrCBBiey3tNrZWeqMPddv8ftD69lnoJN5Tq\n l1kIrQ/noJAxDGZn0EVTd2r41C1sKeL+uL7zQZNXKaQbGDm+opXbPj2Pr4xhujk7ATgiO9v8tBC\n j2yuLoY5dYTw2T1m7yWk988dmSpKjsx1/RbHJ9uRCOaQV52TsTovfl5dzHDVuSJrJdtTX",
        "X-Gm-Gg": "ATEYQzwyglRdzQ1aluqHu0dBz5XwR65sOVBY792aY/7eQWE2QQo/EgyfbLvpf9+Bcen\n hxvWRcxvfWw5H+rafNL1hS9VCNggIuKmtU5R6o6KerMsq2NMGUv1/uB5aNpKJSTn2a7EFG8R8Gq\n 2MRzW3Bgz/uTrb+SWOyh5Ab/L3tg3xKaTN4AvPZBjItkUPgBGYVkFYVnSiAQhlz6kgVtC6q1lBH\n +kWf0QQ9oVFuL05WkifmatccziaeWNNHRAS/758Zn9BE9y2bZmAMsA5YNJ5tZm60Pzwgp3J3tGj\n eSm8i00Iig//DzTn9kbUCkvJ7WuVZCtRM+IFaGrF/IPwp1rzRNdb2JRFR033eHfNYQ+bcU+tDJJ\n CZzJtvJx5LxOwwWveKLUBi9stfzdJmFACsYULwbHmnaXLW/xRM0ujkSIEnjcyrKXDvNR0eL8VG4\n nV/Gl2X4IKt2YraVzj4HeIhPy4bM91ZQjqmXgtJYVi3Ql+rZF+y0VhsnkUSOYrR80SzPr3ztF/4\n +9UqjEGM4/ct6dryhMhUBXz5ptMyKJAIj6wuaxjN2Sn5+FHUxl6Qv7bInw=",
        "X-Received": "by 2002:a05:600c:6ca:b0:487:1fb4:7e1 with SMTP id\n 5b1f17b1804b1-4871fb409d4mr16150575e9.22.1774516859932;\n Thu, 26 Mar 2026 02:20:59 -0700 (PDT)",
        "From": "Silvan Kaiser <silvan@quobyte.com>",
        "To": "qemu-devel@nongnu.org",
        "Cc": "qemu-block@nongnu.org, kwolf@redhat.com, hreitz@redhat.com,\n pierrick.bouvier@linaro.org, eblake@redhat.com, armbru@redhat.com,\n Silvan Kaiser <silvan@quobyte.com>",
        "Subject": "[PATCH 1/3] block: Add 'posix' option for file locking",
        "Date": "Thu, 26 Mar 2026 10:19:46 +0100",
        "Message-ID": "<20260326091948.194529-2-silvan@quobyte.com>",
        "X-Mailer": "git-send-email 2.47.3",
        "In-Reply-To": "<20260326091948.194529-1-silvan@quobyte.com>",
        "References": "<20260326091948.194529-1-silvan@quobyte.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=\"UTF-8\"",
        "Content-Transfer-Encoding": "quoted-printable",
        "Received-SPF": "pass client-ip=2a00:1450:4864:20::333;\n envelope-from=silvan@quobyte.com; helo=mail-wm1-x333.google.com",
        "X-Spam_score_int": "-20",
        "X-Spam_score": "-2.1",
        "X-Spam_bar": "--",
        "X-Spam_report": "(-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,\n DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001,\n SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no",
        "X-Spam_action": "no action",
        "X-BeenThere": "qemu-devel@nongnu.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "qemu development <qemu-devel.nongnu.org>",
        "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>",
        "List-Archive": "<https://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 <mailto:qemu-devel-request@nongnu.org?subject=subscribe>",
        "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org",
        "Sender": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"
    },
    "content": "The new 'posix' value for the 'locking' property of file-based block\ndevices forces the use of traditional POSIX locks (F_SETLK/F_GETLK)\ninstead of OFD (Open File Descriptor) locks.\n\nWhile OFD locks are preferred when available — they are per file descriptor and\nthus survive QEMU-internal fd operations such as hot-plug and block jobs — some\nuserspace filesystem implementations (e.g. FUSE) handle POSIX locks correctly\nbut do not fully support OFD lock semantics. Issues with OFD support detection\non underlying file systems and some OFD guarantees not being fully supported\ncan prohibit users from using the default OFD locking.\nPreviously, users in this situation had no way to force POSIX locks without\ndisabling locking entirely; 'locking=on' would silently fall back to POSIX only\nwhen OFD was unavailable.\n\nThe new 'posix' option makes the choice explicit and allows users to set up a\nclear POSIX config, allowing users to control the locking setup for any scenario\nwhere OFD locking is not advisable.\nNote that the known shortcoming of POSIX locks still applies: locks\ncan be silently lost when QEMU closes and reopens file descriptors\nduring hot-plug or block job operations.\n\nSigned-off-by: Silvan Kaiser <silvan@quobyte.com>\n---\n block/file-posix.c   | 18 +++++++++++-------\n include/qemu/osdep.h |  1 +\n qapi/block-core.json | 18 ++++++++++++++++--\n util/osdep.c         |  9 +++++++--\n 4 files changed, 35 insertions(+), 11 deletions(-)",
    "diff": "diff --git a/block/file-posix.c b/block/file-posix.c\nindex e49b13d6ab..c99974000d 100644\n--- a/block/file-posix.c\n+++ b/block/file-posix.c\n@@ -625,7 +625,7 @@ static int raw_open_common(BlockDriverState *bs, QDict *options,\n     BlockdevAioOptions aio, aio_default;\n     int fd, ret;\n     struct stat st;\n-    OnOffAuto locking;\n+    BlockdevLockingOptions locking;\n \n     opts = qemu_opts_create(&raw_runtime_opts, NULL, 0, &error_abort);\n     if (!qemu_opts_absorb_qdict(opts, options, errp)) {\n@@ -666,16 +666,16 @@ static int raw_open_common(BlockDriverState *bs, QDict *options,\n \n     s->aio_max_batch = qemu_opt_get_number(opts, \"aio-max-batch\", 0);\n \n-    locking = qapi_enum_parse(&OnOffAuto_lookup,\n-                              qemu_opt_get(opts, \"locking\"),\n-                              ON_OFF_AUTO_AUTO, &local_err);\n+    locking = qapi_enum_parse(&BlockdevLockingOptions_lookup,\n+                          qemu_opt_get(opts, \"locking\"),\n+                          BLOCKDEV_LOCKING_OPTIONS_AUTO, &local_err);\n     if (local_err) {\n         error_propagate(errp, local_err);\n         ret = -EINVAL;\n         goto fail;\n     }\n     switch (locking) {\n-    case ON_OFF_AUTO_ON:\n+    case BLOCKDEV_LOCKING_OPTIONS_ON:\n         s->use_lock = true;\n         if (!qemu_has_ofd_lock()) {\n             warn_report(\"File lock requested but OFD locking syscall is \"\n@@ -684,12 +684,16 @@ static int raw_open_common(BlockDriverState *bs, QDict *options,\n                          \"unexpectedly.\\n\");\n         }\n         break;\n-    case ON_OFF_AUTO_OFF:\n+    case BLOCKDEV_LOCKING_OPTIONS_OFF:\n         s->use_lock = false;\n         break;\n-    case ON_OFF_AUTO_AUTO:\n+    case BLOCKDEV_LOCKING_OPTIONS_AUTO:\n         s->use_lock = qemu_has_ofd_lock();\n         break;\n+    case BLOCKDEV_LOCKING_OPTIONS_POSIX:\n+        s->use_lock = true;\n+        qemu_use_posix_locks();\n+        break;\n     default:\n         abort();\n     }\ndiff --git a/include/qemu/osdep.h b/include/qemu/osdep.h\nindex f151578b5c..8ea506e462 100644\n--- a/include/qemu/osdep.h\n+++ b/include/qemu/osdep.h\n@@ -634,6 +634,7 @@ int qemu_unlock_fd(int fd, int64_t start, int64_t len);\n int qemu_lock_fd_test(int fd, int64_t start, int64_t len, bool exclusive);\n bool qemu_has_ofd_lock(void);\n int qemu_fcntl_addfl(int fd, int flag);\n+void qemu_use_posix_locks(void);\n #endif\n \n bool qemu_has_direct_io(void);\ndiff --git a/qapi/block-core.json b/qapi/block-core.json\nindex 508b081ac1..cec369f0fe 100644\n--- a/qapi/block-core.json\n+++ b/qapi/block-core.json\n@@ -3362,6 +3362,19 @@\n             { 'name': 'virtio-blk-vhost-vdpa', 'if': 'CONFIG_BLKIO' },\n             'vmdk', 'vpc', 'vvfat' ] }\n \n+##\n+# @BlockdevLockingOptions:\n+#\n+# @off: Disable locking.\n+# @on: Enable locking (prefer OFD).\n+# @auto: Use locking if OFD is available.\n+# @posix: Force use of traditional POSIX locks.\n+#\n+# Since: 10.3\n+##\n+{ 'enum': 'BlockdevLockingOptions',\n+  'data': [ 'off', 'on', 'auto', 'posix' ] }\n+\n ##\n # @BlockdevOptionsFile:\n #\n@@ -3382,7 +3395,8 @@\n #     automatically.  (default: 0, since 6.2)\n #\n # @locking: whether to enable file locking.  If set to 'auto', only\n-#     enable when Open File Descriptor (OFD) locking API is available\n+#     enable when Open File Descriptor (OFD) locking API is available.\n+#     'posix' forces use of POSIX locks.\n #     (default: auto, since 2.10)\n #\n # @drop-cache: invalidate page cache during live migration.  This\n@@ -3412,7 +3426,7 @@\n { 'struct': 'BlockdevOptionsFile',\n   'data': { 'filename': 'str',\n             '*pr-manager': 'str',\n-            '*locking': 'OnOffAuto',\n+            '*locking': 'BlockdevLockingOptions',\n             '*aio': 'BlockdevAioOptions',\n             '*aio-max-batch': 'int',\n             '*drop-cache': {'type': 'bool',\ndiff --git a/util/osdep.c b/util/osdep.c\nindex 000e7daac8..76495282cc 100644\n--- a/util/osdep.c\n+++ b/util/osdep.c\n@@ -223,8 +223,7 @@ static void qemu_probe_lock_ops(void)\n             fcntl_op_getlk = F_GETLK;\n         }\n #else\n-        fcntl_op_setlk = F_SETLK;\n-        fcntl_op_getlk = F_GETLK;\n+        qemu_use_posix_locks();\n #endif\n     }\n }\n@@ -239,6 +238,12 @@ bool qemu_has_ofd_lock(void)\n #endif\n }\n \n+void qemu_use_posix_locks(void)\n+{\n+    fcntl_op_setlk = F_SETLK;\n+    fcntl_op_getlk = F_GETLK;\n+}\n+\n static int qemu_lock_fcntl(int fd, int64_t start, int64_t len, int fl_type)\n {\n     int ret;\n",
    "prefixes": [
        "1/3"
    ]
}