From: Jori Koolstra <jkoolstra@xs4all.nl>
To: Christian Brauner <brauner@kernel.org>,
Jeff Layton <jlayton@kernel.org>,
Al Viro <viro@zeniv.linux.org.uk>,
Aleksa Sarai <aleksa@amutable.com>, NeilBrown <neil@brown.name>,
Amir Goldstein <amir73il@gmail.com>, Jan Kara <jack@suse.cz>,
linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org
Cc: Jori Koolstra <jkoolstra@xs4all.nl>
Subject: [PATCH v6 00/12] vfs: add O_CREAT|O_DIRECTORY to open*(2)
Date: Sun, 13 Sep 2026 20:50:04 +0200 [thread overview]
Message-ID: <20260913185016.523376-1-jkoolstra@xs4all.nl> (raw)
Hi Christian/Neil,
Finally got back from holiday. I know Neil is also attempting to make
changes to the same code paths as the O_CREAT|O_DIRECTORY series touch,
so I hope, now that I have a bit more time, that I can push this
forwards before I have to do more rebasing.
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. 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 (to
prevent one from opening directories as writable) is currently done very
late in do_open(), after an inode has been obtained. However, when
introducing O_CREAT|O_DIRECTORY this is unacceptable as it would create
the directory and then still fail. This patch does however change some
user visible error codes.
Moreover, "vfs: change ->create/->mkdir operations unavailable errno"
also changes the ->create and ->mkdir unavailable errnos to -EOPNOTSUPP.
A previous attempt to do this more widely stranded before.[1] However,
that regression was only for vfat and does seem specific to changing the
return code from vfs_symlink(). We can drop this patch if needed, but it
would be _really_ ugly.
Changes from vn to v(n+1):
v5: https://lore.kernel.org/linux-fsdevel/20260823160706.358293-1-jkoolstra@xs4all.nl/
- Uniformize ->create and ->mkdir unavailable errnos to -EOPNOTSUPP.
- Return -EOPNOTSUPP instead of -ENOENT when O_CREAT|O_DIRECTORY is
not supported by a ->atomic_open filesystem.
- Added test cases for dangling symlink and sticky directory
behaviour, and a test that verifies O_TMPFILE|O_CREAT is still
-EINVAL.
- Split off "vfs: lookup_open(): lock the parent as I_MUTEX_PARENT"
as a separate patch.
- Fixed the issues pointed out by Brauner in v5.
v4: https://lore.kernel.org/linux-fsdevel/20260712175539.1565444-1-jkoolstra@xs4all.nl/
- rebased on 7.2, which includes my changes to auditing in
lookup_open() as well as Neil Brown's changes to the same function
for the implementation of vfs_lookup_open().
v3: https://lore.kernel.org/linux-fsdevel/20260704164149.3480051-1-jkoolstra@xs4all.nl/
- address the inconsistency in calling audit_inode_child() in
lookup_open() versus vfs_create() in a separate series.
- fclog.c selftest header fix moved to separate patch.
- add a "with trailing slash test" success test to the included
selftests.
- pass struct qstr by pointer to trailing_slashes() and add a comment
on what it does
- changed commit message of "vfs: add O_CREAT|O_DIRECTORY to
open*(2)" to address comments of Brauner
[1]: https://lore.kernel.org/linux-fsdevel/90228c39-04e7-41ef-ad91-84a8bb866650@sirena.org.uk/
Jori Koolstra (12):
fs/namei.c: use trailing_slashes()
vfs: prepare vfs_creat|mkdir_no_perm for reuse in lookup_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: lookup_open(): lock the parent as I_MUTEX_PARENT
vfs: add O_CREAT|O_DIRECTORY to open*(2)
vfs: change ->create/->mkdir operations unavailable errno
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: add tests for open*(O_CREAT|O_DIRECTORY)
fs/9p/vfs_inode.c | 5 +
fs/9p/vfs_inode_dotl.c | 5 +
fs/ceph/file.c | 5 +
fs/fuse/dir.c | 5 +
fs/gfs2/inode.c | 5 +
fs/namei.c | 247 ++++++++++-----
fs/nfs/dir.c | 10 +
fs/open.c | 32 +-
fs/smb/client/dir.c | 5 +
fs/vboxsf/dir.c | 5 +
include/linux/fcntl.h | 6 +
include/uapi/asm-generic/errno.h | 2 +-
.../testing/selftests/filesystems/.gitignore | 1 +
tools/testing/selftests/filesystems/Makefile | 2 +-
.../filesystems/open_o_creat_o_dir.c | 296 ++++++++++++++++++
.../testing/selftests/filesystems/wrappers.h | 11 +
16 files changed, 554 insertions(+), 88 deletions(-)
create mode 100644 tools/testing/selftests/filesystems/open_o_creat_o_dir.c
base-commit: 2f0c1cf72f4682178506f513bbf015e591b1aa4a
--
2.55.0
next reply other threads:[~2026-09-13 18:49 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-13 18:50 Jori Koolstra [this message]
2026-09-13 18:50 ` [PATCH v6 01/12] fs/namei.c: use trailing_slashes() Jori Koolstra
2026-09-13 18:50 ` [PATCH v6 02/12] vfs: prepare vfs_creat|mkdir_no_perm for reuse in lookup_open() Jori Koolstra
2026-09-13 18:50 ` [PATCH v6 03/12] vfs: lookup_open(): move setting FMODE_CREATED down Jori Koolstra
2026-09-13 18:50 ` [PATCH v6 04/12] vfs: move ->create check in lookup_open() to before try_break_deleg() Jori Koolstra
2026-09-13 18:50 ` [PATCH v6 05/12] vfs: lookup_open(): use vfs_create_no_perm() Jori Koolstra
2026-09-13 18:50 ` [PATCH v6 06/12] vfs: lookup_open(): lock the parent as I_MUTEX_PARENT Jori Koolstra
2026-09-13 18:50 ` [PATCH v6 07/12] vfs: add O_CREAT|O_DIRECTORY to open*(2) Jori Koolstra
2026-09-18 8:17 ` Christian Brauner
2026-09-18 10:07 ` NeilBrown
2026-09-19 0:01 ` NeilBrown
2026-09-25 13:57 ` Christian Brauner
2026-09-25 21:26 ` NeilBrown
2026-09-25 22:53 ` Jori Koolstra
2026-09-29 11:54 ` Jori Koolstra
2026-09-29 22:15 ` NeilBrown
2026-09-30 9:45 ` Amir Goldstein
2026-09-30 22:16 ` Jori Koolstra
2026-10-01 9:29 ` Amir Goldstein
2026-10-01 10:08 ` NeilBrown
2026-10-01 11:29 ` Amir Goldstein
2026-10-01 15:42 ` Jori Koolstra
2026-10-01 15:59 ` Amir Goldstein
2026-10-01 16:23 ` Jori Koolstra
2026-10-01 17:53 ` Amir Goldstein
2026-09-30 22:33 ` Jori Koolstra
2026-09-30 22:56 ` NeilBrown
2026-09-30 23:25 ` Jori Koolstra
2026-10-01 1:00 ` NeilBrown
2026-10-01 14:07 ` Jori Koolstra
2026-09-25 23:13 ` Jori Koolstra
2026-09-13 18:50 ` [PATCH v6 08/12] vfs: change ->create/->mkdir operations unavailable errno Jori Koolstra
2026-09-18 8:04 ` Christian Brauner
2026-09-25 22:55 ` Jori Koolstra
2026-09-13 18:50 ` [PATCH v6 09/12] vfs: move O_IS_MKDIR check from lookup_open() into individual filesystems Jori Koolstra
2026-09-13 18:50 ` [PATCH v6 10/12] vfs: refuse O_CREAT for directories through a dangling symlink Jori Koolstra
2026-09-13 18:50 ` [PATCH v6 11/12] vfs: short-circuit MAY_WRITE access for O_DIRECTORY opens Jori Koolstra
2026-09-13 18:50 ` [PATCH v6 12/12] selftest: add tests for open*(O_CREAT|O_DIRECTORY) Jori Koolstra
2026-09-17 10:38 ` [PATCH v6 00/12] vfs: add O_CREAT|O_DIRECTORY to open*(2) Christian Brauner
2026-09-18 8:18 ` Christian Brauner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260913185016.523376-1-jkoolstra@xs4all.nl \
--to=jkoolstra@xs4all.nl \
--cc=aleksa@amutable.com \
--cc=amir73il@gmail.com \
--cc=brauner@kernel.org \
--cc=jack@suse.cz \
--cc=jlayton@kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=neil@brown.name \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®