summaryrefslogtreecommitdiff
path: root/include/linux
diff options
context:
space:
mode:
authorChristian Brauner <brauner@kernel.org>2026-04-16 13:58:57 +0300
committerChristian Brauner <brauner@kernel.org>2026-05-21 16:33:48 +0300
commit21688d812289d11ccf3018a94e0dfa2c98e73ec4 (patch)
tree29fa743999d99a13dcfefd9e09bd90a14eecb44c /include/linux
parent09e8b7a428b3f52b7625870edb4cd42e621fac07 (diff)
parent6045a75399b45f6805f07a03020abf384b9f53c3 (diff)
downloadlinux-21688d812289d11ccf3018a94e0dfa2c98e73ec4.tar.xz
Merge patch series "OPENAT2_REGULAR flag support for openat2"
Dorjoy Chowdhury <dorjoychy111@gmail.com> says: I came upon this "Ability to only open regular files" uapi feature suggestion from https://uapi-group.org/kernel-features/#ability-to-only-open-regular-files and thought it would be something I could do as a first patch and get to know the kernel code a bit better. The following filesystems have been tested by building and booting the kernel x86 bzImage in a Fedora 43 VM in QEMU. I have tested with OPENAT2_REGULAR that regular files can be successfully opened and non-regular files (directory, fifo etc) return -EFTYPE. - btrfs - NFS (loopback) - SMB (loopback) Christian Brauner (Amutable) <brauner@kernel.org>: All atomic_open implementations were audited for OPENAT2_REGULAR handling. Explicit checks were added to ceph, gfs2, nfs (v4), and cifs/smb — these are the filesystems whose atomic_open can encounter an existing non-regular file and would otherwise call finish_open() on it or return a misleading error code. The checks allow these filesystems to return -EFTYPE directly and avoid unnecessary open+close round-trips. The remaining implementations (9p, fuse, vboxsf, nfs v2/v3) don't need explicit checks. They only call finish_open() on freshly created files (always S_IFREG) and use finish_no_open() for lookup hits, letting the VFS catch non-regular files via the do_open() safety net. Notably, fuse also validates the server response (S_ISREG check on the reply) before reaching finish_open(). * patches from https://patch.msgid.link/20260328172314.45807-1-dorjoychy111@gmail.com: kselftest/openat2: test for OPENAT2_REGULAR flag openat2: new OPENAT2_REGULAR flag support Link: https://patch.msgid.link/20260328172314.45807-1-dorjoychy111@gmail.com Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/fcntl.h18
1 files changed, 18 insertions, 0 deletions
diff --git a/include/linux/fcntl.h b/include/linux/fcntl.h
index c65c5c73d362..6ad6b9e7a226 100644
--- a/include/linux/fcntl.h
+++ b/include/linux/fcntl.h
@@ -4,6 +4,7 @@
#include <linux/stat.h>
#include <uapi/linux/fcntl.h>
+#include <uapi/linux/openat2.h>
/* List of all valid flags for the open/openat flags argument: */
#define VALID_OPEN_FLAGS \
@@ -12,6 +13,23 @@
FASYNC | O_DIRECT | O_LARGEFILE | O_DIRECTORY | O_NOFOLLOW | \
O_NOATIME | O_CLOEXEC | O_PATH | __O_TMPFILE | O_EMPTYPATH)
+/* List of all valid flags for openat2(2)'s how->flags argument. */
+#define VALID_OPENAT2_FLAGS (VALID_OPEN_FLAGS | OPENAT2_REGULAR)
+
+/*
+ * Kernel-internal carrier for OPENAT2_REGULAR. The UAPI bit lives in the
+ * upper 32 bits of open_how::flags so open()/openat() cannot encode it.
+ * build_open_flags() translates it to this internal flag, which then
+ * propagates through op->open_flag and f->f_flags exactly like __FMODE_EXEC.
+ * do_dentry_open() strips it so userspace cannot observe it via
+ * fcntl(F_GETFL).
+ *
+ * Bit 30 is not claimed by any O_* flag on any architecture and stays clear
+ * of the sign bit of the int op->open_flag. fcntl_init() enforces that it
+ * never aliases an open-flag bit.
+ */
+#define __O_REGULAR (1 << 30)
+
/* List of all valid flags for the how->resolve argument: */
#define VALID_RESOLVE_FLAGS \
(RESOLVE_NO_XDEV | RESOLVE_NO_MAGICLINKS | RESOLVE_NO_SYMLINKS | \