Re: [PATCH 02/12] fs/namei.c: move create error && negative dentry case in lookup_open up

From: David Laight

Date: Mon Jun 15 2026 - 05:37:29 EST


On Sun, 14 Jun 2026 18:44:28 +0200
Jori Koolstra <jkoolstra@xxxxxxxxx> wrote:

> O_CREAT is stripped when create_error is set in lookup_open(), so when
> lookup does not return an inode, the case
>
> if (!dentry->d_inode && (open_flag & O_CREAT))
>
> is always skipped. We can get rid of this cognitive step by handling the
> error case first.

You've just added an extra test into a normal/fast path.
OTOH the test isn't ideal the compiler needs to reverse the order of
the arguments to the && in spite of the unlikely().

Perhaps:
if (dentry->d_inode)
return dentry;

if (open_flag & O_CREAT) {
...
} else {
if (unlikely(create_error)) {
error = create_error();
goto out_dput;
}
}
return dentry;

-- David

>
> Signed-off-by: Jori Koolstra <jkoolstra@xxxxxxxxx>
> ---
> fs/namei.c | 10 ++++++----
> 1 file changed, 6 insertions(+), 4 deletions(-)
>
> diff --git a/fs/namei.c b/fs/namei.c
> index 64b91ed9efb7..f169d1123b17 100644
> --- a/fs/namei.c
> +++ b/fs/namei.c
> @@ -4499,6 +4499,11 @@ static struct dentry *lookup_open(struct nameidata *nd, struct file *file,
> }
> }
>
> + if (unlikely(create_error) && !dentry->d_inode) {
> + error = create_error;
> + goto out_dput;
> + }
> +
> /* Negative dentry, just create the file */
> if (!dentry->d_inode && (open_flag & O_CREAT)) {
> /* but break the directory lease first! */
> @@ -4518,10 +4523,7 @@ static struct dentry *lookup_open(struct nameidata *nd, struct file *file,
> if (error)
> goto out_dput;
> }
> - if (unlikely(create_error) && !dentry->d_inode) {
> - error = create_error;
> - goto out_dput;
> - }
> +
> return dentry;
>
> out_dput: