Re: [PATCH v3 07/14] vfs: move ->create check in lookup_open() to before try_break_deleg()

From: NeilBrown

Date: Mon Jul 06 2026 - 01:40:04 EST


On Sun, 05 Jul 2026, Jori Koolstra wrote:
> The i_op->create check in lookup_open() takes place after the
> try_break_deleg() call. This does not match the order when doing a
> regular file create via mknod(2). There the call order is:
>
> filename_mknodat()
> vfs_create()
> i_op->create check
> try_break_deleg()
>
> Move the i_op->create check to before try_break_deleg() in
> lookup_open().
>
> Signed-off-by: Jori Koolstra <jkoolstra@xxxxxxxxx>

Reviwed-by: NeilBrown <neil@xxxxxxxxxx>

Thanks,
NeilBrown

> ---
> fs/namei.c | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/fs/namei.c b/fs/namei.c
> index daf31845e3bb..6601460d2772 100644
> --- a/fs/namei.c
> +++ b/fs/namei.c
> @@ -4548,15 +4548,15 @@ static struct dentry *lookup_open(struct nameidata *nd, struct file *file,
> goto out_dput;
> }
>
> - error = try_break_deleg(dir_inode, LEASE_BREAK_DIR_CREATE, delegated_inode);
> - if (error)
> - goto out_dput;
> -
> if (!dir_inode->i_op->create) {
> error = -EACCES;
> goto out_dput;
> }
>
> + error = try_break_deleg(dir_inode, LEASE_BREAK_DIR_CREATE, delegated_inode);
> + if (error)
> + goto out_dput;
> +
> error = dir_inode->i_op->create(idmap, dir_inode, dentry,
> mode, open_flag & O_EXCL);
> if (error)
> --
> 2.55.0
>
>