get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 829956,
    "url": "http://patchwork.ozlabs.org/api/1.2/patches/829956/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/linux-ext4/patch/20171024152415.22864-2-jack@suse.cz/",
    "project": {
        "id": 8,
        "url": "http://patchwork.ozlabs.org/api/1.2/projects/8/?format=api",
        "name": "Linux ext4 filesystem development",
        "link_name": "linux-ext4",
        "list_id": "linux-ext4.vger.kernel.org",
        "list_email": "linux-ext4@vger.kernel.org",
        "web_url": null,
        "scm_url": null,
        "webscm_url": null,
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20171024152415.22864-2-jack@suse.cz>",
    "list_archive_url": null,
    "date": "2017-10-24T15:23:58",
    "name": "[01/17] mm: introduce MAP_SHARED_VALIDATE, a mechanism to safely define new mmap flags",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "34d81c2a6b1cc6e01b731ba343db6c1e47e3e56b",
    "submitter": {
        "id": 363,
        "url": "http://patchwork.ozlabs.org/api/1.2/people/363/?format=api",
        "name": "Jan Kara",
        "email": "jack@suse.cz"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/linux-ext4/patch/20171024152415.22864-2-jack@suse.cz/mbox/",
    "series": [
        {
            "id": 10008,
            "url": "http://patchwork.ozlabs.org/api/1.2/series/10008/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/linux-ext4/list/?series=10008",
            "date": "2017-10-24T15:23:57",
            "name": "dax, ext4, xfs: Synchronous page faults",
            "version": 5,
            "mbox": "http://patchwork.ozlabs.org/series/10008/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/829956/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/829956/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<linux-ext4-owner@vger.kernel.org>",
        "X-Original-To": "patchwork-incoming@ozlabs.org",
        "Delivered-To": "patchwork-incoming@ozlabs.org",
        "Authentication-Results": "ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=linux-ext4-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)",
        "Received": [
            "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3yLxvm2LTDz9t3p\n\tfor <patchwork-incoming@ozlabs.org>;\n\tWed, 25 Oct 2017 02:27:00 +1100 (AEDT)",
            "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S932512AbdJXP05 (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tTue, 24 Oct 2017 11:26:57 -0400",
            "from mx2.suse.de ([195.135.220.15]:36068 \"EHLO mx2.suse.de\"\n\trhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP\n\tid S1751566AbdJXPZa (ORCPT <rfc822;linux-ext4@vger.kernel.org>);\n\tTue, 24 Oct 2017 11:25:30 -0400",
            "from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254])\n\tby mx2.suse.de (Postfix) with ESMTP id D49ABAC67;\n\tTue, 24 Oct 2017 15:25:27 +0000 (UTC)",
            "by quack2.suse.cz (Postfix, from userid 1000)\n\tid 53FF91E34C5; Tue, 24 Oct 2017 17:25:27 +0200 (CEST)"
        ],
        "X-Virus-Scanned": "by amavisd-new at test-mx.suse.de",
        "From": "Jan Kara <jack@suse.cz>",
        "To": "Dan Williams <dan.j.williams@intel.com>",
        "Cc": "Ross Zwisler <ross.zwisler@linux.intel.com>,\n\tChristoph Hellwig <hch@infradead.org>,\n\t<linux-ext4@vger.kernel.org>, linux-nvdimm@lists.01.org,\n\t<linux-fsdevel@vger.kernel.org>, <linux-xfs@vger.kernel.org>,\n\tlinux-api@vger.kernel.org, <linux-mm@kvack.org>,\n\tJan Kara <jack@suse.cz>, Arnd Bergmann <arnd@arndb.de>,\n\tAndy Lutomirski <luto@kernel.org>,\n\tAndrew Morton <akpm@linux-foundation.org>",
        "Subject": "[PATCH 01/17] mm: introduce MAP_SHARED_VALIDATE,\n\ta mechanism to safely define new mmap flags",
        "Date": "Tue, 24 Oct 2017 17:23:58 +0200",
        "Message-Id": "<20171024152415.22864-2-jack@suse.cz>",
        "X-Mailer": "git-send-email 2.12.3",
        "In-Reply-To": "<20171024152415.22864-1-jack@suse.cz>",
        "References": "<20171024152415.22864-1-jack@suse.cz>",
        "Sender": "linux-ext4-owner@vger.kernel.org",
        "Precedence": "bulk",
        "List-ID": "<linux-ext4.vger.kernel.org>",
        "X-Mailing-List": "linux-ext4@vger.kernel.org"
    },
    "content": "From: Dan Williams <dan.j.williams@intel.com>\n\nThe mmap(2) syscall suffers from the ABI anti-pattern of not validating\nunknown flags. However, proposals like MAP_SYNC need a mechanism to\ndefine new behavior that is known to fail on older kernels without the\nsupport. Define a new MAP_SHARED_VALIDATE flag pattern that is\nguaranteed to fail on all legacy mmap implementations.\n\nIt is worth noting that the original proposal was for a standalone\nMAP_VALIDATE flag. However, when that  could not be supported by all\narchs Linus observed:\n\n    I see why you *think* you want a bitmap. You think you want\n    a bitmap because you want to make MAP_VALIDATE be part of MAP_SYNC\n    etc, so that people can do\n\n    ret = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED\n\t\t    | MAP_SYNC, fd, 0);\n\n    and \"know\" that MAP_SYNC actually takes.\n\n    And I'm saying that whole wish is bogus. You're fundamentally\n    depending on special semantics, just make it explicit. It's already\n    not portable, so don't try to make it so.\n\n    Rename that MAP_VALIDATE as MAP_SHARED_VALIDATE, make it have a value\n    of 0x3, and make people do\n\n    ret = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED_VALIDATE\n\t\t    | MAP_SYNC, fd, 0);\n\n    and then the kernel side is easier too (none of that random garbage\n    playing games with looking at the \"MAP_VALIDATE bit\", but just another\n    case statement in that map type thing.\n\n    Boom. Done.\n\nSimilar to ->fallocate() we also want the ability to validate the\nsupport for new flags on a per ->mmap() 'struct file_operations'\ninstance basis.  Towards that end arrange for flags to be generically\nvalidated against a mmap_supported_flags exported by 'struct\nfile_operations'. By default all existing flags are implicitly\nsupported, but new flags require MAP_SHARED_VALIDATE and\nper-instance-opt-in.\n\nCc: Jan Kara <jack@suse.cz>\nCc: Arnd Bergmann <arnd@arndb.de>\nCc: Andy Lutomirski <luto@kernel.org>\nCc: Andrew Morton <akpm@linux-foundation.org>\nSuggested-by: Christoph Hellwig <hch@lst.de>\nSuggested-by: Linus Torvalds <torvalds@linux-foundation.org>\nSigned-off-by: Dan Williams <dan.j.williams@intel.com>\nSigned-off-by: Jan Kara <jack@suse.cz>\n---\n arch/alpha/include/uapi/asm/mman.h           |  1 +\n arch/mips/include/uapi/asm/mman.h            |  1 +\n arch/parisc/include/uapi/asm/mman.h          |  1 +\n arch/xtensa/include/uapi/asm/mman.h          |  1 +\n include/linux/fs.h                           |  1 +\n include/linux/mman.h                         | 39 ++++++++++++++++++++++++++++\n include/uapi/asm-generic/mman-common.h       |  1 +\n mm/mmap.c                                    | 15 +++++++++++\n tools/include/uapi/asm-generic/mman-common.h |  1 +\n 9 files changed, 61 insertions(+)",
    "diff": "diff --git a/arch/alpha/include/uapi/asm/mman.h b/arch/alpha/include/uapi/asm/mman.h\nindex 3b26cc62dadb..f6d118aaedb9 100644\n--- a/arch/alpha/include/uapi/asm/mman.h\n+++ b/arch/alpha/include/uapi/asm/mman.h\n@@ -11,6 +11,7 @@\n \n #define MAP_SHARED\t0x01\t\t/* Share changes */\n #define MAP_PRIVATE\t0x02\t\t/* Changes are private */\n+#define MAP_SHARED_VALIDATE 0x03\t/* share + validate extension flags */\n #define MAP_TYPE\t0x0f\t\t/* Mask for type of mapping (OSF/1 is _wrong_) */\n #define MAP_FIXED\t0x100\t\t/* Interpret addr exactly */\n #define MAP_ANONYMOUS\t0x10\t\t/* don't use a file */\ndiff --git a/arch/mips/include/uapi/asm/mman.h b/arch/mips/include/uapi/asm/mman.h\nindex da3216007fe0..93268e4cd3c7 100644\n--- a/arch/mips/include/uapi/asm/mman.h\n+++ b/arch/mips/include/uapi/asm/mman.h\n@@ -28,6 +28,7 @@\n  */\n #define MAP_SHARED\t0x001\t\t/* Share changes */\n #define MAP_PRIVATE\t0x002\t\t/* Changes are private */\n+#define MAP_SHARED_VALIDATE 0x003\t/* share + validate extension flags */\n #define MAP_TYPE\t0x00f\t\t/* Mask for type of mapping */\n #define MAP_FIXED\t0x010\t\t/* Interpret addr exactly */\n \ndiff --git a/arch/parisc/include/uapi/asm/mman.h b/arch/parisc/include/uapi/asm/mman.h\nindex 775b5d5e41a1..bca652aa1677 100644\n--- a/arch/parisc/include/uapi/asm/mman.h\n+++ b/arch/parisc/include/uapi/asm/mman.h\n@@ -11,6 +11,7 @@\n \n #define MAP_SHARED\t0x01\t\t/* Share changes */\n #define MAP_PRIVATE\t0x02\t\t/* Changes are private */\n+#define MAP_SHARED_VALIDATE 0x03\t/* share + validate extension flags */\n #define MAP_TYPE\t0x03\t\t/* Mask for type of mapping */\n #define MAP_FIXED\t0x04\t\t/* Interpret addr exactly */\n #define MAP_ANONYMOUS\t0x10\t\t/* don't use a file */\ndiff --git a/arch/xtensa/include/uapi/asm/mman.h b/arch/xtensa/include/uapi/asm/mman.h\nindex b15b278aa314..9ab426374714 100644\n--- a/arch/xtensa/include/uapi/asm/mman.h\n+++ b/arch/xtensa/include/uapi/asm/mman.h\n@@ -35,6 +35,7 @@\n  */\n #define MAP_SHARED\t0x001\t\t/* Share changes */\n #define MAP_PRIVATE\t0x002\t\t/* Changes are private */\n+#define MAP_SHARED_VALIDATE 0x003\t/* share + validate extension flags */\n #define MAP_TYPE\t0x00f\t\t/* Mask for type of mapping */\n #define MAP_FIXED\t0x010\t\t/* Interpret addr exactly */\n \ndiff --git a/include/linux/fs.h b/include/linux/fs.h\nindex 13dab191a23e..57added3201d 100644\n--- a/include/linux/fs.h\n+++ b/include/linux/fs.h\n@@ -1701,6 +1701,7 @@ struct file_operations {\n \tlong (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);\n \tlong (*compat_ioctl) (struct file *, unsigned int, unsigned long);\n \tint (*mmap) (struct file *, struct vm_area_struct *);\n+\tunsigned long mmap_supported_flags;\n \tint (*open) (struct inode *, struct file *);\n \tint (*flush) (struct file *, fl_owner_t id);\n \tint (*release) (struct inode *, struct file *);\ndiff --git a/include/linux/mman.h b/include/linux/mman.h\nindex c8367041fafd..94b63b4d71ff 100644\n--- a/include/linux/mman.h\n+++ b/include/linux/mman.h\n@@ -7,6 +7,45 @@\n #include <linux/atomic.h>\n #include <uapi/linux/mman.h>\n \n+/*\n+ * Arrange for legacy / undefined architecture specific flags to be\n+ * ignored by default in LEGACY_MAP_MASK.\n+ */\n+#ifndef MAP_32BIT\n+#define MAP_32BIT 0\n+#endif\n+#ifndef MAP_HUGE_2MB\n+#define MAP_HUGE_2MB 0\n+#endif\n+#ifndef MAP_HUGE_1GB\n+#define MAP_HUGE_1GB 0\n+#endif\n+#ifndef MAP_UNINITIALIZED\n+#define MAP_UNINITIALIZED 0\n+#endif\n+\n+/*\n+ * The historical set of flags that all mmap implementations implicitly\n+ * support when a ->mmap_validate() op is not provided in file_operations.\n+ */\n+#define LEGACY_MAP_MASK (MAP_SHARED \\\n+\t\t| MAP_PRIVATE \\\n+\t\t| MAP_FIXED \\\n+\t\t| MAP_ANONYMOUS \\\n+\t\t| MAP_DENYWRITE \\\n+\t\t| MAP_EXECUTABLE \\\n+\t\t| MAP_UNINITIALIZED \\\n+\t\t| MAP_GROWSDOWN \\\n+\t\t| MAP_LOCKED \\\n+\t\t| MAP_NORESERVE \\\n+\t\t| MAP_POPULATE \\\n+\t\t| MAP_NONBLOCK \\\n+\t\t| MAP_STACK \\\n+\t\t| MAP_HUGETLB \\\n+\t\t| MAP_32BIT \\\n+\t\t| MAP_HUGE_2MB \\\n+\t\t| MAP_HUGE_1GB)\n+\n extern int sysctl_overcommit_memory;\n extern int sysctl_overcommit_ratio;\n extern unsigned long sysctl_overcommit_kbytes;\ndiff --git a/include/uapi/asm-generic/mman-common.h b/include/uapi/asm-generic/mman-common.h\nindex 203268f9231e..8ce7f5a0800f 100644\n--- a/include/uapi/asm-generic/mman-common.h\n+++ b/include/uapi/asm-generic/mman-common.h\n@@ -16,6 +16,7 @@\n \n #define MAP_SHARED\t0x01\t\t/* Share changes */\n #define MAP_PRIVATE\t0x02\t\t/* Changes are private */\n+#define MAP_SHARED_VALIDATE 0x03\t/* share + validate extension flags */\n #define MAP_TYPE\t0x0f\t\t/* Mask for type of mapping */\n #define MAP_FIXED\t0x10\t\t/* Interpret addr exactly */\n #define MAP_ANONYMOUS\t0x20\t\t/* don't use a file */\ndiff --git a/mm/mmap.c b/mm/mmap.c\nindex 680506faceae..924839fac0e6 100644\n--- a/mm/mmap.c\n+++ b/mm/mmap.c\n@@ -1387,9 +1387,24 @@ unsigned long do_mmap(struct file *file, unsigned long addr,\n \n \tif (file) {\n \t\tstruct inode *inode = file_inode(file);\n+\t\tunsigned long flags_mask;\n+\n+\t\tflags_mask = LEGACY_MAP_MASK | file->f_op->mmap_supported_flags;\n \n \t\tswitch (flags & MAP_TYPE) {\n \t\tcase MAP_SHARED:\n+\t\t\t/*\n+\t\t\t * Force use of MAP_SHARED_VALIDATE with non-legacy\n+\t\t\t * flags. E.g. MAP_SYNC is dangerous to use with\n+\t\t\t * MAP_SHARED as you don't know which consistency model\n+\t\t\t * you will get. We silently ignore unsupported flags\n+\t\t\t * with MAP_SHARED to preserve backward compatibility.\n+\t\t\t */\n+\t\t\tflags &= LEGACY_MAP_MASK;\n+\t\t\t/* fall through */\n+\t\tcase MAP_SHARED_VALIDATE:\n+\t\t\tif (flags & ~flags_mask)\n+\t\t\t\treturn -EOPNOTSUPP;\n \t\t\tif ((prot&PROT_WRITE) && !(file->f_mode&FMODE_WRITE))\n \t\t\t\treturn -EACCES;\n \ndiff --git a/tools/include/uapi/asm-generic/mman-common.h b/tools/include/uapi/asm-generic/mman-common.h\nindex 203268f9231e..8ce7f5a0800f 100644\n--- a/tools/include/uapi/asm-generic/mman-common.h\n+++ b/tools/include/uapi/asm-generic/mman-common.h\n@@ -16,6 +16,7 @@\n \n #define MAP_SHARED\t0x01\t\t/* Share changes */\n #define MAP_PRIVATE\t0x02\t\t/* Changes are private */\n+#define MAP_SHARED_VALIDATE 0x03\t/* share + validate extension flags */\n #define MAP_TYPE\t0x0f\t\t/* Mask for type of mapping */\n #define MAP_FIXED\t0x10\t\t/* Interpret addr exactly */\n #define MAP_ANONYMOUS\t0x20\t\t/* don't use a file */\n",
    "prefixes": [
        "01/17"
    ]
}