fs: push the getname from do_rmdir into the callers
authorChristoph Hellwig <hch@lst.de>
Tue, 21 Jul 2020 08:48:15 +0000 (10:48 +0200)
committerChristoph Hellwig <hch@lst.de>
Fri, 31 Jul 2020 06:17:50 +0000 (08:17 +0200)
This mirrors do_unlinkat and will make life a little easier for
the init code to reuse the whole function with a kernel filename.

Signed-off-by: Christoph Hellwig <hch@lst.de>
fs/internal.h
fs/namei.c
include/linux/syscalls.h

index 9b863a7..e903d5a 100644 (file)
@@ -65,7 +65,7 @@ extern int vfs_path_lookup(struct dentry *, struct vfsmount *,
 long do_mknodat(int dfd, const char __user *filename, umode_t mode,
                unsigned int dev);
 long do_mkdirat(int dfd, const char __user *pathname, umode_t mode);
-long do_rmdir(int dfd, const char __user *pathname);
+long do_rmdir(int dfd, struct filename *name);
 long do_unlinkat(int dfd, struct filename *name);
 long do_symlinkat(const char __user *oldname, int newdfd,
                  const char __user *newname);
index 72d4219..d75a603 100644 (file)
@@ -3720,17 +3720,16 @@ out:
 }
 EXPORT_SYMBOL(vfs_rmdir);
 
-long do_rmdir(int dfd, const char __user *pathname)
+long do_rmdir(int dfd, struct filename *name)
 {
        int error = 0;
-       struct filename *name;
        struct dentry *dentry;
        struct path path;
        struct qstr last;
        int type;
        unsigned int lookup_flags = 0;
 retry:
-       name = filename_parentat(dfd, getname(pathname), lookup_flags,
+       name = filename_parentat(dfd, name, lookup_flags,
                                &path, &last, &type);
        if (IS_ERR(name))
                return PTR_ERR(name);
@@ -3781,7 +3780,7 @@ exit1:
 
 SYSCALL_DEFINE1(rmdir, const char __user *, pathname)
 {
-       return do_rmdir(AT_FDCWD, pathname);
+       return do_rmdir(AT_FDCWD, getname(pathname));
 }
 
 /**
@@ -3926,8 +3925,7 @@ SYSCALL_DEFINE3(unlinkat, int, dfd, const char __user *, pathname, int, flag)
                return -EINVAL;
 
        if (flag & AT_REMOVEDIR)
-               return do_rmdir(dfd, pathname);
-
+               return do_rmdir(dfd, getname(pathname));
        return do_unlinkat(dfd, getname(pathname));
 }
 
index 5b0f1fc..e438161 100644 (file)
@@ -1281,11 +1281,11 @@ static inline long ksys_unlink(const char __user *pathname)
        return do_unlinkat(AT_FDCWD, getname(pathname));
 }
 
-extern long do_rmdir(int dfd, const char __user *pathname);
+long do_rmdir(int dfd, struct filename *name);
 
 static inline long ksys_rmdir(const char __user *pathname)
 {
-       return do_rmdir(AT_FDCWD, pathname);
+       return do_rmdir(AT_FDCWD, getname(pathname));
 }
 
 extern long do_mkdirat(int dfd, const char __user *pathname, umode_t mode);