Re: [PATCH 5/5] fs: remove do_mounts
From: Guenter Roeck
Date: Sun Oct 11 2020 - 10:17:53 EST
On Thu, Sep 17, 2020 at 10:22:36AM +0200, Christoph Hellwig wrote:
> There are only two callers left, one of which is is in the alpha-specific
> OSF/1 compat code. Just open code it in both.
>
> Signed-off-by: Christoph Hellwig <hch@xxxxxx>
> ---
> arch/alpha/kernel/osf_sys.c | 7 ++++++-
> fs/namespace.c | 25 ++++++++-----------------
> include/linux/fs.h | 2 --
> 3 files changed, 14 insertions(+), 20 deletions(-)
>
> diff --git a/arch/alpha/kernel/osf_sys.c b/arch/alpha/kernel/osf_sys.c
> index 5fd155b13503b5..8acd5101097576 100644
> --- a/arch/alpha/kernel/osf_sys.c
> +++ b/arch/alpha/kernel/osf_sys.c
> @@ -434,6 +434,7 @@ SYSCALL_DEFINE4(osf_mount, unsigned long, typenr, const char __user *, path,
^^^^
> struct osf_mount_args tmp;
> struct filename *devname;
> const char *fstype;
> + struct path path;
^^^^^^^^^^^^^^^^
Someone didn't bother test building this patch.
arch/alpha/kernel/osf_sys.c: In function '__do_sys_osf_mount':
arch/alpha/kernel/osf_sys.c:437:14: error: 'path' redeclared as different kind of symbol
Guenter
> int retval;
>
> if (copy_from_user(&tmp, args, sizeof(tmp)))
> @@ -467,7 +468,11 @@ SYSCALL_DEFINE4(osf_mount, unsigned long, typenr, const char __user *, path,
>
> if (IS_ERR(devname))
> return PTR_ERR(devname);
> - retval = do_mount(devname.name, dirname, fstype, flags, NULL);
> + retval = user_path_at(AT_FDCWD, dirname, LOOKUP_FOLLOW, &path);
> + if (!retval) {
> + ret = path_mount(devname.name, &path, fstype, flags, NULL);
> + path_put(&path);
> + }
> putname(devname);
> return retval;
> }
> diff --git a/fs/namespace.c b/fs/namespace.c
> index 12b431b61462b9..2ff373ebeaf27f 100644
> --- a/fs/namespace.c
> +++ b/fs/namespace.c
> @@ -3193,20 +3193,6 @@ int path_mount(const char *dev_name, struct path *path,
> data_page);
> }
>
> -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;
> - int ret;
> -
> - ret = user_path_at(AT_FDCWD, dir_name, LOOKUP_FOLLOW, &path);
> - if (ret)
> - return ret;
> - ret = path_mount(dev_name, &path, type_page, flags, data_page);
> - path_put(&path);
> - return ret;
> -}
> -
> static struct ucounts *inc_mnt_namespaces(struct user_namespace *ns)
> {
> return inc_ucount(ns, current_euid(), UCOUNT_MNT_NAMESPACES);
> @@ -3390,10 +3376,11 @@ EXPORT_SYMBOL(mount_subtree);
> SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name,
> char __user *, type, unsigned long, flags, void __user *, data)
> {
> - int ret;
> + struct path path;
> char *kernel_type;
> char *kernel_dev;
> void *options;
> + int ret;
>
> kernel_type = copy_mount_string(type);
> ret = PTR_ERR(kernel_type);
> @@ -3410,8 +3397,12 @@ SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name,
> if (IS_ERR(options))
> goto out_data;
>
> - ret = do_mount(kernel_dev, dir_name, kernel_type, flags, options);
> -
> + ret = user_path_at(AT_FDCWD, dir_name, LOOKUP_FOLLOW, &path);
> + if (ret)
> + goto out_options;
> + ret = path_mount(kernel_dev, &path, kernel_type, flags, options);
> + path_put(&path);
> +out_options:
> kfree(options);
> out_data:
> kfree(kernel_dev);
> diff --git a/include/linux/fs.h b/include/linux/fs.h
> index 7519ae003a082c..bd9878bdd4bfe9 100644
> --- a/include/linux/fs.h
> +++ b/include/linux/fs.h
> @@ -2292,8 +2292,6 @@ extern struct vfsmount *kern_mount(struct file_system_type *);
> 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 __user *,
> - const char *, unsigned long, void *);
> extern struct vfsmount *collect_mounts(const struct path *);
> extern void drop_collected_mounts(struct vfsmount *);
> extern int iterate_mounts(int (*)(struct vfsmount *, void *), void *,