From: David Laight <david.laight.linux@gmail.com>
To: NeilBrown <neilb@ownmail.net>
Cc: NeilBrown <neil@brown.name>,
"Jori Koolstra" <jkoolstra@xs4all.nl>,
"Jeff Layton" <jlayton@kernel.org>,
"Christian Brauner" <brauner@kernel.org>,
"Al Viro" <viro@zeniv.linux.org.uk>,
"Aleksa Sarai" <aleksa@amutable.com>,
"Amir Goldstein" <amir73il@gmail.com>, "Jan Kara" <jack@suse.cz>,
linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3 01/14] fs/namei.c: use trailing_slashes()
Date: Mon, 6 Jul 2026 08:29:47 +0100 [thread overview]
Message-ID: <20260706082947.248bcd17@pumpkin> (raw)
In-Reply-To: <178331016004.27465.14624469599238469373@noble.neil.brown.name>
On Mon, 06 Jul 2026 13:56:00 +1000
NeilBrown <neilb@ownmail.net> wrote:
> On Sun, 05 Jul 2026, Jori Koolstra wrote:
> > There are several places in fs/namei.c that can use the
> > trailing_slashes() function to improve intent.
>
> I think it would help to state here that trailing_slashes() is changed
> to take a qstr instead of a nameidata as that is useful in more places.
It is also taking the struct 'by value' so should really be always_inline
before something makes a compiler decide it should be a real function.
(Or make it take a pointer)
David
>
> Reviewed-by: NeilBrown <neil@brown.name>
>
> Thanks,
> NeilBrown
>
>
> >
> > Signed-off-by: Jori Koolstra <jkoolstra@xs4all.nl>
> > ---
> > fs/namei.c | 26 +++++++++++++-------------
> > 1 file changed, 13 insertions(+), 13 deletions(-)
> >
> > diff --git a/fs/namei.c b/fs/namei.c
> > index 19ce43c9a6e6..a8890bc0ae21 100644
> > --- a/fs/namei.c
> > +++ b/fs/namei.c
> > @@ -2781,9 +2781,14 @@ static const char *path_init(struct nameidata *nd, unsigned flags)
> > return s;
> > }
> >
> > +static inline bool trailing_slashes(const struct qstr last)
> > +{
> > + return (bool)last.name[last.len];
> > +}
> > +
> > static inline const char *lookup_last(struct nameidata *nd)
> > {
> > - if (nd->last_type == LAST_NORM && nd->last.name[nd->last.len])
> > + if (nd->last_type == LAST_NORM && trailing_slashes(nd->last))
> > nd->flags |= LOOKUP_FOLLOW | LOOKUP_DIRECTORY;
> >
> > return walk_component(nd, WALK_TRAILING);
> > @@ -4521,17 +4526,12 @@ static struct dentry *lookup_open(struct nameidata *nd, struct file *file,
> > return ERR_PTR(error);
> > }
> >
> > -static inline bool trailing_slashes(struct nameidata *nd)
> > -{
> > - return (bool)nd->last.name[nd->last.len];
> > -}
> > -
> > static struct dentry *lookup_fast_for_open(struct nameidata *nd, int open_flag)
> > {
> > struct dentry *dentry;
> >
> > if (open_flag & O_CREAT) {
> > - if (trailing_slashes(nd))
> > + if (trailing_slashes(nd->last))
> > return ERR_PTR(-EISDIR);
> >
> > /* Don't bother on an O_EXCL create */
> > @@ -4539,7 +4539,7 @@ static struct dentry *lookup_fast_for_open(struct nameidata *nd, int open_flag)
> > return NULL;
> > }
> >
> > - if (trailing_slashes(nd))
> > + if (trailing_slashes(nd->last))
> > nd->flags |= LOOKUP_FOLLOW | LOOKUP_DIRECTORY;
> >
> > dentry = lookup_fast(nd);
> > @@ -4950,7 +4950,7 @@ static struct dentry *filename_create(int dfd, struct filename *name,
> > * Do the final lookup. Suppress 'create' if there is a trailing
> > * '/', and a directory wasn't requested.
> > */
> > - if (last.name[last.len] && !want_dir)
> > + if (trailing_slashes(last) && !want_dir)
> > create_flags &= ~LOOKUP_CREATE;
> > dentry = start_dirop(path->dentry, &last, reval_flag | create_flags);
> > if (IS_ERR(dentry))
> > @@ -5569,7 +5569,7 @@ int filename_unlinkat(int dfd, struct filename *name)
> > goto exit_drop_write;
> >
> > /* Why not before? Because we want correct error value */
> > - if (unlikely(last.name[last.len])) {
> > + if (unlikely(trailing_slashes(last))) {
> > if (d_is_dir(dentry))
> > error = -EISDIR;
> > else
> > @@ -6171,16 +6171,16 @@ int filename_renameat2(int olddfd, struct filename *from,
> > if (flags & RENAME_EXCHANGE) {
> > if (!d_is_dir(rd.new_dentry)) {
> > error = -ENOTDIR;
> > - if (new_last.name[new_last.len])
> > + if (trailing_slashes(new_last))
> > goto exit_unlock;
> > }
> > }
> > /* unless the source is a directory trailing slashes give -ENOTDIR */
> > if (!d_is_dir(rd.old_dentry)) {
> > error = -ENOTDIR;
> > - if (old_last.name[old_last.len])
> > + if (trailing_slashes(old_last))
> > goto exit_unlock;
> > - if (!(flags & RENAME_EXCHANGE) && new_last.name[new_last.len])
> > + if (!(flags & RENAME_EXCHANGE) && trailing_slashes(new_last))
> > goto exit_unlock;
> > }
> >
> > --
> > 2.55.0
> >
> >
>
>
next prev parent reply other threads:[~2026-07-06 7:29 UTC|newest]
Thread overview: 62+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-04 16:41 [PATCH v3 00/14] vfs: add O_CREAT|O_DIRECTORY to open*(2) Jori Koolstra
2026-07-04 16:41 ` [PATCH v3 01/14] fs/namei.c: use trailing_slashes() Jori Koolstra
2026-07-06 3:56 ` NeilBrown
2026-07-06 7:29 ` David Laight [this message]
2026-07-06 20:55 ` Jori Koolstra
2026-07-07 7:42 ` David Laight
2026-07-07 10:51 ` Christian Brauner
2026-07-04 16:41 ` [PATCH v3 02/14] vfs: move create error && negative dentry case in lookup_open() up Jori Koolstra
2026-07-04 16:41 ` [PATCH v3 03/14] vfs: prepare vfs_creat|mkdir_no_perm for reuse in lookup_open() Jori Koolstra
2026-07-07 10:51 ` Christian Brauner
2026-07-04 16:41 ` [PATCH v3 04/14] vfs: call audit_inode_child() in lookup_open() on failure too Jori Koolstra
2026-07-06 5:33 ` NeilBrown
2026-07-06 21:20 ` Jori Koolstra
2026-07-06 23:02 ` NeilBrown
2026-07-07 10:51 ` Christian Brauner
2026-07-04 16:41 ` [PATCH v3 05/14] fs/namei.c: update docstring of atomic_open() Jori Koolstra
2026-07-06 5:36 ` NeilBrown
2026-07-07 10:51 ` Christian Brauner
2026-07-04 16:41 ` [PATCH v3 06/14] vfs: lookup_open(): move setting FMODE_CREATED down Jori Koolstra
2026-07-04 16:41 ` [PATCH v3 07/14] vfs: move ->create check in lookup_open() to before try_break_deleg() Jori Koolstra
2026-07-06 5:37 ` NeilBrown
2026-07-07 10:51 ` Christian Brauner
2026-07-04 16:41 ` [PATCH v3 08/14] vfs: lookup_open(): use vfs_create_no_perm() Jori Koolstra
2026-07-06 5:38 ` NeilBrown
2026-07-07 10:51 ` Christian Brauner
2026-07-04 16:41 ` [PATCH v3 09/14] vfs: add O_CREAT|O_DIRECTORY to open*(2) Jori Koolstra
2026-07-06 5:46 ` NeilBrown
2026-07-07 8:35 ` Pedro Falcato
2026-07-07 10:04 ` Christian Brauner
2026-07-07 13:04 ` Pedro Falcato
2026-07-07 13:30 ` Christian Brauner
2026-07-13 9:54 ` Christoph Hellwig
2026-07-13 21:35 ` NeilBrown
2026-07-14 5:10 ` Christoph Hellwig
2026-07-14 10:50 ` Jori Koolstra
2026-07-14 10:46 ` Jori Koolstra
2026-07-07 10:06 ` Jori Koolstra
2026-07-07 13:55 ` Pedro Falcato
2026-07-07 14:18 ` Jori Koolstra
2026-07-08 15:39 ` Pedro Falcato
2026-07-09 6:24 ` Christoph Hellwig
2026-07-09 10:51 ` Jori Koolstra
2026-07-09 14:21 ` Christian Brauner
2026-07-09 14:34 ` Jori Koolstra
2026-07-13 9:50 ` Christoph Hellwig
2026-07-07 10:51 ` Christian Brauner
2026-07-10 18:55 ` Jori Koolstra
2026-07-12 12:39 ` Christian Brauner
2026-07-04 16:41 ` [PATCH v3 10/14] vfs: move O_IS_MKDIR check from lookup_open() into individual filesystems Jori Koolstra
2026-07-06 5:50 ` NeilBrown
2026-07-07 10:51 ` Christian Brauner
2026-07-04 16:41 ` [PATCH v3 11/14] vfs: refuse O_CREAT for directories through a dangling symlink Jori Koolstra
2026-07-06 5:51 ` NeilBrown
2026-07-04 16:41 ` [PATCH v3 12/14] vfs: short-circuit MAY_WRITE access for O_DIRECTORY opens Jori Koolstra
2026-07-06 5:51 ` NeilBrown
2026-07-04 16:41 ` [PATCH v3 13/14] selftest: fix headers in fclog.c Jori Koolstra
2026-07-06 5:57 ` NeilBrown
2026-07-06 21:07 ` Jori Koolstra
2026-07-07 10:51 ` Christian Brauner
2026-07-04 16:41 ` [PATCH v3 14/14] selftest: add tests for open*(O_CREAT|O_DIRECTORY) Jori Koolstra
2026-07-07 10:51 ` Christian Brauner
2026-07-07 10:51 ` [PATCH v3 00/14] vfs: add O_CREAT|O_DIRECTORY to open*(2) 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=20260706082947.248bcd17@pumpkin \
--to=david.laight.linux@gmail.com \
--cc=aleksa@amutable.com \
--cc=amir73il@gmail.com \
--cc=brauner@kernel.org \
--cc=jack@suse.cz \
--cc=jkoolstra@xs4all.nl \
--cc=jlayton@kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=neil@brown.name \
--cc=neilb@ownmail.net \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.