[RFC PATCH v6 0/9] vfs: add O_CREAT|O_DIRECTORY to open*(2)
From: Jori Koolstra
Date: Sun May 31 2026 - 14:22:49 EST
This series implements new semantics for the O_CREAT|O_DIRECTORY flag
combination for open*(2): perform a mkdir and open the resulting
directory; return a pinning fd (which mkdir does not).
Changes:
v6: split up the series in more steps. Call may_create_in_sticky() also
for directories. Revert to old errnos on missing i_op functions
instead of EOPNOTSUPP.
v5: fixed Sashiko reported issues [1]. Moved to EINVAL banning
O_CREAT|O_DIRECTORY in each individual atomic_open implementation
instead of in the generic atomic_open() in fs/namei.c.
v3/4: fixed syzbot reported bugs
v2: don't introduce a new syscall (mkdirat2) but implement this
functionality as O_CREAT|O_DIRECTORY in open*(2).
[1]:
https://sashiko.dev/#/patchset/20260518165237.2084042-1-jkoolstra%40xs4all.nl
Jori Koolstra (9):
fs/namei.c: make lookup_last() use trailing_slashes()
fs/namei.c: move create error && negative dentry case in lookup_open
up
vfs: prepare vfs_creat|mkdir_no_perm for reuse in lookup_open()
vfs: lookup_open(): move setting FMODE_CREATED up when calling
create()
vfs: lookup_open(): move audit_inode_child() and i_op->create check to
before try_break_deleg()
vfs: lookup_open(): use vfs_create_no_perm()
vfs: add O_CREAT|O_DIRECTORY to open*(2)
vfs: move O_IS_MKDIR check out atomic_open() to individual filesystems
selftest: add tests for open*(O_CREAT|O_DIRECTORY)
fs/9p/vfs_inode.c | 3 +
fs/9p/vfs_inode_dotl.c | 3 +
fs/ceph/file.c | 3 +
fs/fuse/dir.c | 3 +
fs/gfs2/inode.c | 3 +
fs/namei.c | 213 ++++++++++++------
fs/nfs/dir.c | 3 +
fs/nfs/file.c | 3 +
fs/open.c | 25 +-
fs/smb/client/dir.c | 3 +
fs/vboxsf/dir.c | 3 +
include/linux/fcntl.h | 7 +
.../testing/selftests/filesystems/.gitignore | 1 +
tools/testing/selftests/filesystems/Makefile | 4 +-
tools/testing/selftests/filesystems/fclog.c | 1 +
.../filesystems/open_o_creat_o_dir.c | 197 ++++++++++++++++
16 files changed, 389 insertions(+), 86 deletions(-)
create mode 100644 tools/testing/selftests/filesystems/open_o_creat_o_dir.c
base-commit: 174914ea551314c52a61713b9c4bde9e42d48073
--
2.54.0