vfs: move getname() from callers to do_mount()
authorSeunghun Lee <waydi1@gmail.com>
Sun, 14 Sep 2014 13:15:10 +0000 (22:15 +0900)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 9 Oct 2014 06:39:16 +0000 (02:39 -0400)
It would make more sense to pass char __user * instead of
char * in callers of do_mount() and do getname() inside do_mount().

Suggested-by: Al Viro <viro@ZenIV.linux.org.uk>
Signed-off-by: Seunghun Lee <waydi1@gmail.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
arch/alpha/kernel/osf_sys.c
fs/compat.c
fs/namespace.c
include/linux/fs.h

index 1402fcc..f9c732e 100644 (file)
@@ -446,7 +446,8 @@ struct procfs_args {
  * unhappy with OSF UFS. [CHECKME]
  */
 static int
-osf_ufs_mount(const char *dirname, struct ufs_args __user *args, int flags)
+osf_ufs_mount(const char __user *dirname,
+             struct ufs_args __user *args, int flags)
 {
        int retval;
        struct cdfs_args tmp;
@@ -466,7 +467,8 @@ osf_ufs_mount(const char *dirname, struct ufs_args __user *args, int flags)
 }
 
 static int
-osf_cdfs_mount(const char *dirname, struct cdfs_args __user *args, int flags)
+osf_cdfs_mount(const char __user *dirname,
+              struct cdfs_args __user *args, int flags)
 {
        int retval;
        struct cdfs_args tmp;
@@ -486,7 +488,8 @@ osf_cdfs_mount(const char *dirname, struct cdfs_args __user *args, int flags)
 }
 
 static int
-osf_procfs_mount(const char *dirname, struct procfs_args __user *args, int flags)
+osf_procfs_mount(const char __user *dirname,
+                struct procfs_args __user *args, int flags)
 {
        struct procfs_args tmp;
 
@@ -500,28 +503,22 @@ SYSCALL_DEFINE4(osf_mount, unsigned long, typenr, const char __user *, path,
                int, flag, void __user *, data)
 {
        int retval;
-       struct filename *name;
 
-       name = getname(path);
-       retval = PTR_ERR(name);
-       if (IS_ERR(name))
-               goto out;
        switch (typenr) {
        case 1:
-               retval = osf_ufs_mount(name->name, data, flag);
+               retval = osf_ufs_mount(path, data, flag);
                break;
        case 6:
-               retval = osf_cdfs_mount(name->name, data, flag);
+               retval = osf_cdfs_mount(path, data, flag);
                break;
        case 9:
-               retval = osf_procfs_mount(name->name, data, flag);
+               retval = osf_procfs_mount(path, data, flag);
                break;
        default:
                retval = -EINVAL;
                printk("osf_mount(%ld, %x)\n", typenr, flag);
        }
-       putname(name);
- out:
+
        return retval;
 }
 
index 6205c24..b13df99 100644 (file)
@@ -794,7 +794,6 @@ COMPAT_SYSCALL_DEFINE5(mount, const char __user *, dev_name,
        char *kernel_type;
        unsigned long data_page;
        char *kernel_dev;
-       struct filename *dir;
        int retval;
 
        kernel_type = copy_mount_string(type);
@@ -802,19 +801,14 @@ COMPAT_SYSCALL_DEFINE5(mount, const char __user *, dev_name,
        if (IS_ERR(kernel_type))
                goto out;
 
-       dir = getname(dir_name);
-       retval = PTR_ERR(dir);
-       if (IS_ERR(dir))
-               goto out1;
-
        kernel_dev = copy_mount_string(dev_name);
        retval = PTR_ERR(kernel_dev);
        if (IS_ERR(kernel_dev))
-               goto out2;
+               goto out1;
 
        retval = copy_mount_options(data, &data_page);
        if (retval < 0)
-               goto out3;
+               goto out2;
 
        retval = -EINVAL;
 
@@ -823,19 +817,17 @@ COMPAT_SYSCALL_DEFINE5(mount, const char __user *, dev_name,
                        do_ncp_super_data_conv((void *)data_page);
                } else if (!strcmp(kernel_type, NFS4_NAME)) {
                        if (do_nfs4_super_data_conv((void *) data_page))
-                               goto out4;
+                               goto out3;
                }
        }
 
-       retval = do_mount(kernel_dev, dir->name, kernel_type,
+       retval = do_mount(kernel_dev, dir_name, kernel_type,
                        flags, (void*)data_page);
 
- out4:
-       free_page(data_page);
  out3:
-       kfree(kernel_dev);
+       free_page(data_page);
  out2:
-       putname(dir);
+       kfree(kernel_dev);
  out1:
        kfree(kernel_type);
  out:
index abd3abb..348562f 100644 (file)
@@ -2533,7 +2533,7 @@ char *copy_mount_string(const void __user *data)
  * Therefore, if this magic number is present, it carries no information
  * and must be discarded.
  */
-long do_mount(const char *dev_name, const char *dir_name,
+long do_mount(const char *dev_name, const char __user *dir_name,
                const char *type_page, unsigned long flags, void *data_page)
 {
        struct path path;
@@ -2545,15 +2545,11 @@ long do_mount(const char *dev_name, const char *dir_name,
                flags &= ~MS_MGC_MSK;
 
        /* Basic sanity checks */
-
-       if (!dir_name || !*dir_name || !memchr(dir_name, 0, PAGE_SIZE))
-               return -EINVAL;
-
        if (data_page)
                ((char *)data_page)[PAGE_SIZE - 1] = 0;
 
        /* ... and get the mountpoint */
-       retval = kern_path(dir_name, LOOKUP_FOLLOW, &path);
+       retval = user_path(dir_name, &path);
        if (retval)
                return retval;
 
@@ -2778,7 +2774,6 @@ SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name,
 {
        int ret;
        char *kernel_type;
-       struct filename *kernel_dir;
        char *kernel_dev;
        unsigned long data_page;
 
@@ -2787,12 +2782,6 @@ SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name,
        if (IS_ERR(kernel_type))
                goto out_type;
 
-       kernel_dir = getname(dir_name);
-       if (IS_ERR(kernel_dir)) {
-               ret = PTR_ERR(kernel_dir);
-               goto out_dir;
-       }
-
        kernel_dev = copy_mount_string(dev_name);
        ret = PTR_ERR(kernel_dev);
        if (IS_ERR(kernel_dev))
@@ -2802,15 +2791,13 @@ SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name,
        if (ret < 0)
                goto out_data;
 
-       ret = do_mount(kernel_dev, kernel_dir->name, kernel_type, flags,
+       ret = do_mount(kernel_dev, dir_name, kernel_type, flags,
                (void *) data_page);
 
        free_page(data_page);
 out_data:
        kfree(kernel_dev);
 out_dev:
-       putname(kernel_dir);
-out_dir:
        kfree(kernel_type);
 out_type:
        return ret;
index 75bdd51..9214836 100644 (file)
@@ -1855,7 +1855,8 @@ extern struct vfsmount *kern_mount_data(struct file_system_type *, void *data);
 extern void kern_unmount(struct vfsmount *mnt);
 extern int may_umount_tree(struct vfsmount *);
 extern int may_umount(struct vfsmount *);
-extern long do_mount(const char *, const char *, const char *, unsigned long, void *);
+extern long do_mount(const char *, const char __user *,
+                    const char *, unsigned long, void *);
 extern struct vfsmount *collect_mounts(struct path *);
 extern void drop_collected_mounts(struct vfsmount *);
 extern int iterate_mounts(int (*)(struct vfsmount *, void *), void *,