| From: |
| Jori Koolstra <jkoolstra-AT-xs4all.nl> |
| To: |
| Jeff Layton <jlayton-AT-kernel.org>, Christian Brauner <brauner-AT-kernel.org>, Al Viro <viro-AT-zeniv.linux.org.uk>, Aleksa Sarai <aleksa-AT-amutable.com>, NeilBrown <neil-AT-brown.name>, Amir Goldstein <amir73il-AT-gmail.com>, Jan Kara <jack-AT-suse.cz> |
| Subject: |
| [PATCH v3 00/14] vfs: add O_CREAT|O_DIRECTORY to open*(2) |
| Date: |
| Sat, 04 Jul 2026 18:41:34 +0200 |
| Message-ID: |
| <20260704164149.3480051-1-jkoolstra@xs4all.nl> |
| Cc: |
| linux-fsdevel-AT-vger.kernel.org, linux-kernel-AT-vger.kernel.org, Jori Koolstra <jkoolstra-AT-xs4all.nl> |
| Archive-link: |
| Article |
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).
Most of the work happens in "vfs: add O_CREAT|O_DIRECTORY to open*(2),"
as may be expected. Before that there is some clean-up work and
preparation. Also, the inconsistency in calling audit_inode_child() in
lookup_open() versus vfs_create() path is addressed. The
"vfs: short-circuit MAY_WRITE access for O_DIRECTORY opens" patch is
also worth paying extra attention to as it short-circuits doomed opening
of directories as writable. This check for regular files is now done
very late in do_open(), but for O_CREAT|O_DIRECTORY this is unacceptable
as this would create the directory and then still fail.
Jori Koolstra (14):
fs/namei.c: use trailing_slashes()
vfs: move create error && negative dentry case in lookup_open() up
vfs: prepare vfs_creat|mkdir_no_perm for reuse in lookup_open()
vfs: call audit_inode_child() in lookup_open() on failure too
fs/namei.c: update docstring of atomic_open()
vfs: lookup_open(): move setting FMODE_CREATED down
vfs: move ->create check in lookup_open() 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 from lookup_open() into individual
filesystems
vfs: refuse O_CREAT for directories through a dangling symlink
vfs: short-circuit MAY_WRITE access for O_DIRECTORY opens
selftest: fix headers in fclog.c
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 | 313 ++++++++++++------
fs/nfs/dir.c | 6 +
fs/open.c | 32 +-
fs/smb/client/dir.c | 3 +
fs/vboxsf/dir.c | 3 +
include/linux/fcntl.h | 6 +
.../testing/selftests/filesystems/.gitignore | 1 +
tools/testing/selftests/filesystems/Makefile | 2 +-
tools/testing/selftests/filesystems/fclog.c | 4 +-
.../filesystems/open_o_creat_o_dir.c | 197 +++++++++++
15 files changed, 463 insertions(+), 119 deletions(-)
create mode 100644 tools/testing/selftests/filesystems/open_o_creat_o_dir.c
--
2.55.0