Re: [PATCH v1 2/3] VFS: Prepare atomic_open() for dentry_create()

From: NeilBrown

Date: Tue Nov 18 2025 - 20:32:29 EST


On Wed, 19 Nov 2025, Benjamin Coddington wrote:
> The next patch allows dentry_create() to call atomic_open(), but it does
> not have fabricated nameidata. Let atomic_open() take a path instead.

I think this commit message could usefully be longer and more details.

atomic_open() currently takes a nameidata of which it only uses the
path and the flags. Flags are only used to update open_flags. That
update can happen before atomic_open() is called which would mean that
only the path need be passed to atomic_open() rather than the whole
nameidata. This will make it easier for dentry_create() To call
atomic_open().

Thanks,
NeilBrown

>
> Signed-off-by: Benjamin Coddington <bcodding@xxxxxxxxxxxxxxx>
> ---
> fs/namei.c | 14 +++++++-------
> 1 file changed, 7 insertions(+), 7 deletions(-)
>
> diff --git a/fs/namei.c b/fs/namei.c
> index e2bfd2a73cba..9c0aad5bbff7 100644
> --- a/fs/namei.c
> +++ b/fs/namei.c
> @@ -3552,19 +3552,16 @@ static int may_o_create(struct mnt_idmap *idmap,
> *
> * Returns an error code otherwise.
> */
> -static struct dentry *atomic_open(struct nameidata *nd, struct dentry *dentry,
> +static struct dentry *atomic_open(const struct path *path, struct dentry *dentry,
> struct file *file,
> int open_flag, umode_t mode)
> {
> struct dentry *const DENTRY_NOT_SET = (void *) -1UL;
> - struct inode *dir = nd->path.dentry->d_inode;
> + struct inode *dir = path->dentry->d_inode;
> int error;
>
> - if (nd->flags & LOOKUP_DIRECTORY)
> - open_flag |= O_DIRECTORY;
> -
> file->f_path.dentry = DENTRY_NOT_SET;
> - file->f_path.mnt = nd->path.mnt;
> + file->f_path.mnt = path->mnt;
> error = dir->i_op->atomic_open(dir, dentry, file,
> open_to_namei_flags(open_flag), mode);
> d_lookup_done(dentry);
> @@ -3676,7 +3673,10 @@ static struct dentry *lookup_open(struct nameidata *nd, struct file *file,
> if (create_error)
> open_flag &= ~O_CREAT;
> if (dir_inode->i_op->atomic_open) {
> - dentry = atomic_open(nd, dentry, file, open_flag, mode);
> + if (nd->flags & LOOKUP_DIRECTORY)
> + open_flag |= O_DIRECTORY;
> +
> + dentry = atomic_open(&nd->path, dentry, file, open_flag, mode);
> if (unlikely(create_error) && dentry == ERR_PTR(-ENOENT))
> dentry = ERR_PTR(create_error);
> return dentry;
> --
> 2.50.1
>
>