All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dmitry Kadashev <dkadashev@gmail.com>
To: Jens Axboe <axboe@kernel.dk>, Alexander Viro <viro@zeniv.linux.org.uk>
Cc: Pavel Begunkov <asml.silence@gmail.com>,
	linux-fsdevel@vger.kernel.org,
	io-uring <io-uring@vger.kernel.org>
Subject: Re: [PATCH v2 1/2] fs: make do_mkdirat() take struct filename
Date: Fri, 12 Feb 2021 16:42:49 +0700	[thread overview]
Message-ID: <CAOKbgA7fBRpnkjvDRynZcyHxB_L6NYNCprwUtz+HwxqcqiJcLA@mail.gmail.com> (raw)
In-Reply-To: <20210202082353.2152271-2-dkadashev@gmail.com>

On Tue, Feb 2, 2021 at 3:25 PM Dmitry Kadashev <dkadashev@gmail.com> wrote:
>
> Pass in the struct filename pointers instead of the user string, and
> update the three callers to do the same. This is heavily based on
> commit dbea8d345177 ("fs: make do_renameat2() take struct filename").
>
> This behaves like do_unlinkat() and do_renameat2().
>
> Cc: Al Viro <viro@zeniv.linux.org.uk>
> Signed-off-by: Dmitry Kadashev <dkadashev@gmail.com>
> ---
>  fs/internal.h |  1 +
>  fs/namei.c    | 25 +++++++++++++++++++------
>  2 files changed, 20 insertions(+), 6 deletions(-)
>
> diff --git a/fs/internal.h b/fs/internal.h
> index c6c85f6ad598..b10005dfaa48 100644
> --- a/fs/internal.h
> +++ b/fs/internal.h
> @@ -76,6 +76,7 @@ long do_unlinkat(int dfd, struct filename *name);
>  int may_linkat(struct path *link);
>  int do_renameat2(int olddfd, struct filename *oldname, int newdfd,
>                  struct filename *newname, unsigned int flags);
> +long do_mkdirat(int dfd, struct filename *name, umode_t mode);
>
>  /*
>   * namespace.c
> diff --git a/fs/namei.c b/fs/namei.c
> index 4cae88733a5c..3657bdf1aafc 100644
> --- a/fs/namei.c
> +++ b/fs/namei.c
> @@ -3431,7 +3431,7 @@ struct file *do_file_open_root(struct dentry *dentry, struct vfsmount *mnt,
>         return file;
>  }
>
> -static struct dentry *filename_create(int dfd, struct filename *name,
> +static struct dentry *__filename_create(int dfd, struct filename *name,
>                                 struct path *path, unsigned int lookup_flags)
>  {
>         struct dentry *dentry = ERR_PTR(-EEXIST);
> @@ -3487,7 +3487,6 @@ static struct dentry *filename_create(int dfd, struct filename *name,
>                 error = err2;
>                 goto fail;
>         }
> -       putname(name);
>         return dentry;
>  fail:
>         dput(dentry);
> @@ -3502,6 +3501,16 @@ static struct dentry *filename_create(int dfd, struct filename *name,
>         return dentry;
>  }
>
> +static inline struct dentry *filename_create(int dfd, struct filename *name,
> +                               struct path *path, unsigned int lookup_flags)
> +{
> +       struct dentry *res = __filename_create(dfd, name, path, lookup_flags);
> +
> +       if (!IS_ERR(res))
> +               putname(name);
> +       return res;
> +}
> +
>  struct dentry *kern_path_create(int dfd, const char *pathname,
>                                 struct path *path, unsigned int lookup_flags)
>  {
> @@ -3654,15 +3663,18 @@ int vfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
>  }
>  EXPORT_SYMBOL(vfs_mkdir);
>
> -static long do_mkdirat(int dfd, const char __user *pathname, umode_t mode)
> +long do_mkdirat(int dfd, struct filename *name, umode_t mode)
>  {
>         struct dentry *dentry;
>         struct path path;
>         int error;
>         unsigned int lookup_flags = LOOKUP_DIRECTORY;
>
> +       if (IS_ERR(name))
> +               return PTR_ERR(name);
> +
>  retry:
> -       dentry = user_path_create(dfd, pathname, &path, lookup_flags);
> +       dentry = __filename_create(dfd, name, &path, lookup_flags);
>         if (IS_ERR(dentry))
>                 return PTR_ERR(dentry);
>
> @@ -3676,17 +3688,18 @@ static long do_mkdirat(int dfd, const char __user *pathname, umode_t mode)
>                 lookup_flags |= LOOKUP_REVAL;
>                 goto retry;
>         }
> +       putname(name);
>         return error;
>  }
>
>  SYSCALL_DEFINE3(mkdirat, int, dfd, const char __user *, pathname, umode_t, mode)
>  {
> -       return do_mkdirat(dfd, pathname, mode);
> +       return do_mkdirat(dfd, getname(pathname), mode);
>  }
>
>  SYSCALL_DEFINE2(mkdir, const char __user *, pathname, umode_t, mode)
>  {
> -       return do_mkdirat(AT_FDCWD, pathname, mode);
> +       return do_mkdirat(AT_FDCWD, getname(pathname), mode);
>  }
>
>  int vfs_rmdir(struct inode *dir, struct dentry *dentry)
> --
> 2.30.0

Hi Al,

Are you OK with this version?

-- 
Dmitry Kadashev

  reply	other threads:[~2021-02-12  9:43 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-02  8:23 [PATCH v2 0/2] io_uring: add mkdirat support Dmitry Kadashev
2021-02-02  8:23 ` [PATCH v2 1/2] fs: make do_mkdirat() take struct filename Dmitry Kadashev
2021-02-12  9:42   ` Dmitry Kadashev [this message]
2021-02-02  8:23 ` [PATCH v2 2/2] io_uring: add support for IORING_OP_MKDIRAT Dmitry Kadashev
2021-02-18  7:25 ` [PATCH v2 0/2] io_uring: add mkdirat support Dmitry Kadashev
2021-03-29 20:37 ` Jens Axboe
2021-03-30  4:32   ` Dmitry Kadashev

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=CAOKbgA7fBRpnkjvDRynZcyHxB_L6NYNCprwUtz+HwxqcqiJcLA@mail.gmail.com \
    --to=dkadashev@gmail.com \
    --cc=asml.silence@gmail.com \
    --cc=axboe@kernel.dk \
    --cc=io-uring@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --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.