From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id F3E5AEEB567 for ; Fri, 8 Sep 2023 17:58:06 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 80F1D6B00F1; Fri, 8 Sep 2023 13:58:06 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 7C0BF6B00F4; Fri, 8 Sep 2023 13:58:06 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 67CDA6B00F3; Fri, 8 Sep 2023 13:58:06 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 5B51F6B00F1 for ; Fri, 8 Sep 2023 13:58:06 -0400 (EDT) Received: from smtpin30.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 2E0EAC03E4 for ; Fri, 8 Sep 2023 17:58:06 +0000 (UTC) X-FDA: 81214188972.30.1832863 Received: from mail-yw1-f202.google.com (mail-yw1-f202.google.com [209.85.128.202]) by imf12.hostedemail.com (Postfix) with ESMTP id 6E1064000C for ; Fri, 8 Sep 2023 17:58:03 +0000 (UTC) Authentication-Results: imf12.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=q4PmvAMW; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf12.hostedemail.com: domain of 3qmD7ZAoKCIcxnwl0ty3vtrzzrwp.nzxwty58-xxv6lnv.z2r@flex--mclapinski.bounces.google.com designates 209.85.128.202 as permitted sender) smtp.mailfrom=3qmD7ZAoKCIcxnwl0ty3vtrzzrwp.nzxwty58-xxv6lnv.z2r@flex--mclapinski.bounces.google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1694195883; a=rsa-sha256; cv=none; b=PCeovcBvsIDVrRm44SHUewKM5s058yAYC03O262P3OGyOanNjMDIxgba4ldNqV0fzlIKcI 9iyIgmmZcXLYm+5JKQqgHnLCq00dIWb4aatXaYuGAmwddE9qQx54CApfHp56cR1BDExTQq rTVWaOLNlu8IRYtARy5F3efijYEoOrc= ARC-Authentication-Results: i=1; imf12.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=q4PmvAMW; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf12.hostedemail.com: domain of 3qmD7ZAoKCIcxnwl0ty3vtrzzrwp.nzxwty58-xxv6lnv.z2r@flex--mclapinski.bounces.google.com designates 209.85.128.202 as permitted sender) smtp.mailfrom=3qmD7ZAoKCIcxnwl0ty3vtrzzrwp.nzxwty58-xxv6lnv.z2r@flex--mclapinski.bounces.google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1694195883; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=fOWw6cIr3DHErX8Jy6XcNouUGNoG83SlOd1aTTOGtPk=; b=eUdHp2QGYJX0SuURNnFkgWGx01L0ZgXVj9srmG1StLvQnAK9YgNTk7R1Dm0ZLTatQBnaC5 EUSc/W1DLMS7nU9rCUiGh60IEUvQimjv2l2bQbsm5aNNVEyo61Svy5DDjDKmTwWyRBPcEq ewjIhY16D7P81FE0FSRqg8zJfO0ZuQ4= Received: by mail-yw1-f202.google.com with SMTP id 00721157ae682-5958487ca15so25460407b3.1 for ; Fri, 08 Sep 2023 10:58:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1694195882; x=1694800682; darn=kvack.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=fOWw6cIr3DHErX8Jy6XcNouUGNoG83SlOd1aTTOGtPk=; b=q4PmvAMWNLqIZGfnCPRyNIGEO17kFGuKXjUFVa+nCAqHeKU2uG7BxVk/PP0tpn7kyV O9O+H5LbLpajVx/NELPlvvV2O1FsXzDNZiakRtHS36MAtYhwNcJZu/TXoe4GPUKHVUVp YBeeo3Jf7zcMrB8fKC2BxySV1pL+LVLsFiJkCiqlJfIL7K4cRycIssRhcyrGxVYz/IEy L+IK6NQv/Siz9/hqvteleLnb8S+D2tjSzoBqVGukP4PJRdN7AkmAKj0aDyZgxd/XW1qh lNK7bwgAZ8C4UgP4B2rtifugxv/VEtsMd5wxEn/+p8u7Aob5YEKTL5El1/yoiOMIGyuW GMVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1694195882; x=1694800682; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=fOWw6cIr3DHErX8Jy6XcNouUGNoG83SlOd1aTTOGtPk=; b=O/WWHf/dzM844XM44h3h1A2uWsCQ0ClAOiEkuB/jty2tFvg5CkhW+P8OltC2nIli7z 2TymW14BW3U4foQPEIgNyoAfxAXDVOlx1W/g3Y2fQo0a7zq8A+5Ir1+VKdHRpuP6FmY1 F3BRMlm7BMqGvsDx/EcO/TRt7/8NFuu0wskADtNxODDjSnplLxRp7SgudbtCTb52lyLn bJIib2TEAARDaRtVBaTM/UYFCazI77PhVsYaK9PnuQqPgrLhXwB5N11nVTd4dAYjUekH /gG06NQ9oNV1bEQ1gAM30mV7bRpjM16+qqr64Qlql6CuWwTT6XDzlvyO05NxErS8KzF7 8W2g== X-Gm-Message-State: AOJu0YzylbwMnf/6zVBKeM5R5hvFRKoI5IbNLUhk/8P3EhsvZSs2E5gf NIibD6HWB9ntr0EJCrXGtg79voqXhdPpQfce X-Google-Smtp-Source: AGHT+IE5bvyoUpPyi5zts+0vRvDDIo/LdDOiErDcfAUR6eXex8q5LfTR+2Qdlr+ta/HZrQD4sEhbFIAJ61n546Jd X-Received: from mclapinski.waw.corp.google.com ([2a00:79e0:9b:0:aa82:a90b:b76f:32b0]) (user=mclapinski job=sendgmr) by 2002:a81:ae66:0:b0:58c:6ddd:d27c with SMTP id g38-20020a81ae66000000b0058c6dddd27cmr76506ywk.6.1694195882399; Fri, 08 Sep 2023 10:58:02 -0700 (PDT) Date: Fri, 8 Sep 2023 19:57:37 +0200 In-Reply-To: <20230908175738.41895-1-mclapinski@google.com> Mime-Version: 1.0 References: <20230908175738.41895-1-mclapinski@google.com> X-Mailer: git-send-email 2.42.0.283.g2d96d420d3-goog Message-ID: <20230908175738.41895-2-mclapinski@google.com> Subject: [PATCH v2 1/2] mm/memfd: add ioctl(MEMFD_CHECK_IF_ORIGINAL) From: Michal Clapinski To: Jonathan Corbet , Mike Kravetz , Muchun Song , Andrew Morton , Hugh Dickins , Shuah Khan , Greg Kroah-Hartman , Arnd Bergmann , Yi Liu , Dominik Brodowski , Hans Verkuil , Steve French , Simon Ser , Jason Gunthorpe , Marc Dionne , Jiri Slaby , David Howells , Luca Vizzarro , Jeff Xu , Aleksa Sarai , Kees Cook , Daniel Verkamp , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-kselftest@vger.kernel.org Cc: Michal Clapinski Content-Type: text/plain; charset="UTF-8" X-Rspam-User: X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: 6E1064000C X-Stat-Signature: fzztk7koh5tsxpznrr1sedg8yyh9r678 X-HE-Tag: 1694195883-933694 X-HE-Meta: U2FsdGVkX1+iTxXNsrm5RkM8+JVU9dAW9CcIENP7/KbD5hBsoCBtzsr1Zfl3kNkwMWhO49pQhqu09o6trLQrSbTMi8RKNQnF2rkZKg2KRk5c6L6QmrcDNWjqOx/lyxv5cck1Fs+8oom/RuYpdkpbQhp5J5A3MiI6NMXwF4J5B762mRW+LaB6PUHUR1q3PDBwrBZIaQCRkDZqCWg57+/5dQZJn7KT6/qY828mjLGk/Uf0RQedVtSs7ir1ctMChAwyDSrZqr31J0kLUqVBqwGnp7iRHBTxfVVsOtG5+NHXj71wpBwwhx+lwVNr/aJmXRQZcF6tK2bjFkMVbbobRI7n4mX7+YmBa9/PH9Bfxp97mNPKVmPHXIYzy2pAaOVSdbJ13M9M77uBcxSU/raJXk38TUjmoMzRgYcqffXTf4VVjeUOLfbpDfT196stdltBWQi16OYYnICPiC5EYZpQV0SGcVzrFWBvks3VC2m+9P0Mb/da7C0mN2LTuv2OqStfpiJ0R/eJpT2PNf+tKiDxp38j0nolTLC/gEgAfRgEMPFcxb36P3RtK7/l7+uUC8yJipOadFjcpvHwq8Az5DNUqaVOA1yV/s7QWggrAGUbJefWIe53Fn997RRcGlysqkWuLXxJOe1Uvv9aCwa1ZKdfk/4OEq68vZL68oxT352yFZ0Cc6QOjBzxyqanwE6z/LccmTIYUqO8iLbW5rrtqPOKKIMP7jnStjQVW1jC+SD+ECEvOT0/T4bXQYwQus4RGMETrEVUqvKWy/s7vkWpP0rs4hv0zL0IbMIlkEggSRqykvaubbjaMpZCzG74upBzXwRx9qzP0gkLRpAxgN8PcvCm3Lfyzywf2/w9tJQesOtsEw02tO88wpool4mrTlPOlbUlV04TlQCsWJ/Vc8TXch9KKax+bOmUx8BqShMI+DTU+QjEM6I24wPQSPvkaqP7cx3sTcDPivwF6kgACFuDGzgO8vV 5kBBDZ+m I4gpWEkjOn4w4gFrH9k4bkwA4Tf6g8jSwbIpnbHg3MTfLqn2Y68wwsE31lYe8euFEloaMjGic8a6dW+LNL+MLM45gmF7i3lSemCkAR60I8noCwcBXHfGYGeYM/TeOnwEooy6RUnBfgUk1LeFCsCCAinuAfPe1oU4P/rCNPXiSlytMSrSbbP+Zfm97SLVV8BCv9P3pn7AdWa48GA2yrh8Ycsu/i+b2lF7b7nz9q4tS1chVm0el+T1EH/2WsonVSZQn24UXo/KPZceCX+oATn8p4GqBTMsIobxOWL7qzbJQvf194WJJyozfUV6YmJSyLJJvnGvEx+G/eVXfMuqipeLLtEXvtg86t3IrEyJBzcLbDO2Ylq2rUhbF+0+iCPbJr/HPTl0g4ccHc/qZmN1f3tHEOJ+cz3L+FWhKXl69BMdcoCybTmCNNb4tLfP04v0C7EbG2BtWmfBMS5Fcrq2PvAqgQBZaJwYYR9Wmea73RID7bLf2ASa7K6we5r+UWGCv/DL6ZBQp0f2KuG8Ejas7hqWqviEgbOBZ4qWnxRjx1YA4gL1y0OoambBYUHvr62UC1p2TDGwLgWYOTM2+7MK/avUBf2yqPfI+kMirnI0QanWTinncBfOqZNYjeVpUiXfjNH0vprPWpF/uDN6Q+K5q/g52bVQ5JFk5EvJDR0lwF3Nk0NfLQYjUuHrRPYnttAxS75IN8RoKq8DH8Ic6jlp86+e4gfCrm+wsRg0tTKQXJOLTEF8jv3BRYBIvdthFi+19/Xotz4Z8w3hPAklK57GCJxO91+LSk86u2jnisSUsYBvDoC6ubi3q9pUFEReIjg== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Add a way to check if an fd points to the memfd's original open fd (the one created by memfd_create). Useful because only the original open fd can be both writable and executable. Signed-off-by: Michal Clapinski --- Documentation/userspace-api/ioctl/ioctl-number.rst | 1 + fs/hugetlbfs/inode.c | 9 +++++++++ include/linux/memfd.h | 12 ++++++++++++ mm/memfd.c | 9 +++++++++ mm/shmem.c | 9 +++++++++ 5 files changed, 40 insertions(+) diff --git a/Documentation/userspace-api/ioctl/ioctl-number.rst b/Documentation/userspace-api/ioctl/ioctl-number.rst index 4ea5b837399a..9a0782116ac2 100644 --- a/Documentation/userspace-api/ioctl/ioctl-number.rst +++ b/Documentation/userspace-api/ioctl/ioctl-number.rst @@ -355,6 +355,7 @@ Code Seq# Include File Comments 0xB6 all linux/fpga-dfl.h 0xB7 all uapi/linux/remoteproc_cdev.h 0xB7 all uapi/linux/nsfs.h > +0xB8 00 linux/memfd.h 0xC0 00-0F linux/usb/iowarrior.h 0xCA 00-0F uapi/misc/cxl.h 0xCA 10-2F uapi/misc/ocxl.h diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index 316c4cebd3f3..89ff46f7ac54 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c @@ -35,6 +35,7 @@ #include #include #include +#include #include #include @@ -1324,6 +1325,12 @@ static void init_once(void *foo) inode_init_once(&ei->vfs_inode); } +static long hugetlbfs_file_ioctl(struct file *file, unsigned int cmd, + unsigned long arg) +{ + return memfd_ioctl(file, cmd, arg); +} + const struct file_operations hugetlbfs_file_operations = { .read_iter = hugetlbfs_read_iter, .mmap = hugetlbfs_file_mmap, @@ -1331,6 +1338,8 @@ const struct file_operations hugetlbfs_file_operations = { .get_unmapped_area = hugetlb_get_unmapped_area, .llseek = default_llseek, .fallocate = hugetlbfs_fallocate, + .unlocked_ioctl = hugetlbfs_file_ioctl, + .compat_ioctl = hugetlbfs_file_ioctl, }; static const struct inode_operations hugetlbfs_dir_inode_operations = { diff --git a/include/linux/memfd.h b/include/linux/memfd.h index e7abf6fa4c52..50f512624c92 100644 --- a/include/linux/memfd.h +++ b/include/linux/memfd.h @@ -3,14 +3,26 @@ #define __LINUX_MEMFD_H #include +#include #ifdef CONFIG_MEMFD_CREATE extern long memfd_fcntl(struct file *file, unsigned int cmd, unsigned int arg); +extern long memfd_ioctl(struct file *file, unsigned int cmd, unsigned int arg); #else static inline long memfd_fcntl(struct file *f, unsigned int c, unsigned int a) { return -EINVAL; } +static inline long memfd_ioctl(struct file *f, unsigned int c, unsigned int a) +{ + return -EINVAL; +} #endif +/* + * Return 1 if the memfd is original (i.e. was created by memfd_create, + * not reopened), 0 otherwise. + */ +#define MEMFD_CHECK_IF_ORIGINAL _IOR(0xB8, 0, int) + #endif /* __LINUX_MEMFD_H */ diff --git a/mm/memfd.c b/mm/memfd.c index 1cad1904fc26..06bcb970c387 100644 --- a/mm/memfd.c +++ b/mm/memfd.c @@ -262,6 +262,15 @@ long memfd_fcntl(struct file *file, unsigned int cmd, unsigned int arg) return error; } +long memfd_ioctl(struct file *file, unsigned int cmd, unsigned int arg) +{ + if (cmd == MEMFD_CHECK_IF_ORIGINAL) + return (file->f_mode & FMODE_WRITE) && + !(file->f_mode & FMODE_WRITER); + + return -EINVAL; +} + #define MFD_NAME_PREFIX "memfd:" #define MFD_NAME_PREFIX_LEN (sizeof(MFD_NAME_PREFIX) - 1) #define MFD_NAME_MAX_LEN (NAME_MAX - MFD_NAME_PREFIX_LEN) diff --git a/mm/shmem.c b/mm/shmem.c index 02e62fccc80d..347fcba15fb7 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -79,6 +79,7 @@ static struct vfsmount *shm_mnt; #include #include #include +#include #include @@ -4459,6 +4460,12 @@ const struct address_space_operations shmem_aops = { }; EXPORT_SYMBOL(shmem_aops); +static long shmem_file_ioctl(struct file *file, unsigned int cmd, + unsigned long arg) +{ + return memfd_ioctl(file, cmd, arg); +} + static const struct file_operations shmem_file_operations = { .mmap = shmem_mmap, .open = shmem_file_open, @@ -4471,6 +4478,8 @@ static const struct file_operations shmem_file_operations = { .splice_read = shmem_file_splice_read, .splice_write = iter_file_splice_write, .fallocate = shmem_fallocate, + .unlocked_ioctl = shmem_file_ioctl, + .compat_ioctl = shmem_file_ioctl, #endif }; -- 2.42.0.283.g2d96d420d3-goog