Re: [PATCH 11/12] vfs: short-circuit MAY_WRITE access for O_DIRECTORY opens
Jori Koolstra <[email protected]> Sun, 14 Jun 2026 19:01:54 +0200 (CEST)
| Newsgroups | org.kernel.vger.linux-api,org.kernel.vger.linux-fsdevel,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
> Op 14-06-2026 18:44 CEST schreef Jori Koolstra <[email protected]>: > > > Requesting write access on a directory can never succeed. Rather > than performing a path-walk to determine whether the target is > actually a directory (-EISDIR) or not (-ENOTDIR), we short-circuit > to -ENOTDIR. > > Currently O_WRONLY for directories is only blocked in may_open(), > which happens after we have the inode for the target, so after any > create via O_CREAT|O_DIRECTORY. > > The advantage of short-circuiting is that we don't have to add even > more logic to lookup_open() to differentiate -EISDIR/-ENOTDIR. Also, > for filesystems that define atomic_open(), handling this cannot even be > done at the VFS level, as we can't know ahead of calling > ->atomic_open() what the result of the lookup is. > > Suggested-by: Christian Brauner (Amutable) <[email protected]> > Signed-off-by: Jori Koolstra <[email protected]> > --- > fs/open.c | 11 +++++++++-- > 1 file changed, 9 insertions(+), 2 deletions(-) > > diff --git a/fs/open.c b/fs/open.c > index 5cf8ada58483..be980a737c82 100644 > --- a/fs/open.c > +++ b/fs/open.c > @@ -1268,9 +1268,16 @@ inline int build_open_flags(const struct open_how *how, struct open_flags *op) > > op->intent = flags & O_PATH ? 0 : LOOKUP_OPEN; > > + /* > + * Requesting write access on a directory can never succeed. Rather > + * than performing a path-walk to determine whether the target is > + * actually a directory (-EISDIR) or not (-ENOTDIR), we short-circuit > + * to -ENOTDIR. > + */ > + if ((flags & O_DIRECTORY) && (acc_mode & MAY_WRITE)) > + return -ENOTDIR; > + > if (flags & O_CREAT) { > - if ((flags & O_DIRECTORY) && (acc_mode & MAY_WRITE)) > - return -EISDIR; > op->intent |= LOOKUP_CREATE; > if (flags & O_EXCL) { > op->intent |= LOOKUP_EXCL; > -- > 2.54.0 Forgot to cc this to [email protected]. Hereby cc'ed.