VFS: Add GPL_EXPORTED function vfs_kern_mount()
do_kern_mount() does not allow the kernel to use private mount interfaces without exposing the same interfaces to userland. The problem is that the filesystem is referenced by name, thus meaning that it and its mount interface must be registered in the global filesystem list. vfs_kern_mount() passes the struct file_system_type as an explicit parameter in order to overcome this limitation. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
Родитель
da6d503aa0
Коммит
bb4a58bf46
22
fs/super.c
22
fs/super.c
|
@ -800,17 +800,13 @@ struct super_block *get_sb_single(struct file_system_type *fs_type,
|
||||||
EXPORT_SYMBOL(get_sb_single);
|
EXPORT_SYMBOL(get_sb_single);
|
||||||
|
|
||||||
struct vfsmount *
|
struct vfsmount *
|
||||||
do_kern_mount(const char *fstype, int flags, const char *name, void *data)
|
vfs_kern_mount(struct file_system_type *type, int flags, const char *name, void *data)
|
||||||
{
|
{
|
||||||
struct file_system_type *type = get_fs_type(fstype);
|
|
||||||
struct super_block *sb = ERR_PTR(-ENOMEM);
|
struct super_block *sb = ERR_PTR(-ENOMEM);
|
||||||
struct vfsmount *mnt;
|
struct vfsmount *mnt;
|
||||||
int error;
|
int error;
|
||||||
char *secdata = NULL;
|
char *secdata = NULL;
|
||||||
|
|
||||||
if (!type)
|
|
||||||
return ERR_PTR(-ENODEV);
|
|
||||||
|
|
||||||
mnt = alloc_vfsmnt(name);
|
mnt = alloc_vfsmnt(name);
|
||||||
if (!mnt)
|
if (!mnt)
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -841,7 +837,6 @@ do_kern_mount(const char *fstype, int flags, const char *name, void *data)
|
||||||
mnt->mnt_parent = mnt;
|
mnt->mnt_parent = mnt;
|
||||||
up_write(&sb->s_umount);
|
up_write(&sb->s_umount);
|
||||||
free_secdata(secdata);
|
free_secdata(secdata);
|
||||||
put_filesystem(type);
|
|
||||||
return mnt;
|
return mnt;
|
||||||
out_sb:
|
out_sb:
|
||||||
up_write(&sb->s_umount);
|
up_write(&sb->s_umount);
|
||||||
|
@ -852,10 +847,23 @@ out_free_secdata:
|
||||||
out_mnt:
|
out_mnt:
|
||||||
free_vfsmnt(mnt);
|
free_vfsmnt(mnt);
|
||||||
out:
|
out:
|
||||||
put_filesystem(type);
|
|
||||||
return (struct vfsmount *)sb;
|
return (struct vfsmount *)sb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL_GPL(vfs_kern_mount);
|
||||||
|
|
||||||
|
struct vfsmount *
|
||||||
|
do_kern_mount(const char *fstype, int flags, const char *name, void *data)
|
||||||
|
{
|
||||||
|
struct file_system_type *type = get_fs_type(fstype);
|
||||||
|
struct vfsmount *mnt;
|
||||||
|
if (!type)
|
||||||
|
return ERR_PTR(-ENODEV);
|
||||||
|
mnt = vfs_kern_mount(type, flags, name, data);
|
||||||
|
put_filesystem(type);
|
||||||
|
return mnt;
|
||||||
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL_GPL(do_kern_mount);
|
EXPORT_SYMBOL_GPL(do_kern_mount);
|
||||||
|
|
||||||
struct vfsmount *kern_mount(struct file_system_type *type)
|
struct vfsmount *kern_mount(struct file_system_type *type)
|
||||||
|
|
|
@ -73,6 +73,11 @@ extern struct vfsmount *alloc_vfsmnt(const char *name);
|
||||||
extern struct vfsmount *do_kern_mount(const char *fstype, int flags,
|
extern struct vfsmount *do_kern_mount(const char *fstype, int flags,
|
||||||
const char *name, void *data);
|
const char *name, void *data);
|
||||||
|
|
||||||
|
struct file_system_type;
|
||||||
|
extern struct vfsmount *vfs_kern_mount(struct file_system_type *type,
|
||||||
|
int flags, const char *name,
|
||||||
|
void *data);
|
||||||
|
|
||||||
struct nameidata;
|
struct nameidata;
|
||||||
|
|
||||||
extern int do_add_mount(struct vfsmount *newmnt, struct nameidata *nd,
|
extern int do_add_mount(struct vfsmount *newmnt, struct nameidata *nd,
|
||||||
|
|
Загрузка…
Ссылка в новой задаче