Re: [PATCH 1/2] fs: make do_mkdirat() take struct filename
From: Jens Axboe <axboe@kernel.dk>
Date: 2021-01-25 04:39:27
Also in:
linux-fsdevel
On 11/15/20 9:45 PM, Dmitry Kadashev 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().Al, are you OK with this patch? Leaving it quoted, though you should have the original too.
quoted hunk ↗ jump to hunk
Signed-off-by: Dmitry Kadashev <redacted> --- fs/internal.h | 1 + fs/namei.c | 20 ++++++++++++++------ 2 files changed, 15 insertions(+), 6 deletions(-)diff --git a/fs/internal.h b/fs/internal.h index 6fd14ea213c3..23b8b427dbd2 100644 --- a/fs/internal.h +++ b/fs/internal.h@@ -80,6 +80,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.cdiff --git a/fs/namei.c b/fs/namei.c index 03d0e11e4f36..9d26a51f3f54 100644 --- a/fs/namei.c +++ b/fs/namei.c@@ -3654,17 +3654,23 @@ 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); - if (IS_ERR(dentry)) - return PTR_ERR(dentry); + name->refcnt++; /* filename_create() drops our ref */ + dentry = filename_create(dfd, name, &path, lookup_flags); + if (IS_ERR(dentry)) { + error = PTR_ERR(dentry); + goto out; + } if (!IS_POSIXACL(path.dentry->d_inode)) mode &= ~current_umask();@@ -3676,17 +3682,19 @@ static long do_mkdirat(int dfd, const char __user *pathname, umode_t mode) lookup_flags |= LOOKUP_REVAL; goto retry; } +out: + 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)
-- Jens Axboe