diff options
| -rw-r--r-- | fs/super.c | 22 | ||||
| -rw-r--r-- | include/linux/mount.h | 5 |
2 files changed, 20 insertions, 7 deletions
diff --git a/fs/super.c b/fs/super.c index a66f66bb8049..848be4fc67a2 100644 --- a/fs/super.c +++ b/fs/super.c | |||
| @@ -800,17 +800,13 @@ struct super_block *get_sb_single(struct file_system_type *fs_type, | |||
| 800 | EXPORT_SYMBOL(get_sb_single); | 800 | EXPORT_SYMBOL(get_sb_single); |
| 801 | 801 | ||
| 802 | struct vfsmount * | 802 | struct vfsmount * |
| 803 | do_kern_mount(const char *fstype, int flags, const char *name, void *data) | 803 | vfs_kern_mount(struct file_system_type *type, int flags, const char *name, void *data) |
| 804 | { | 804 | { |
| 805 | struct file_system_type *type = get_fs_type(fstype); | ||
| 806 | struct super_block *sb = ERR_PTR(-ENOMEM); | 805 | struct super_block *sb = ERR_PTR(-ENOMEM); |
| 807 | struct vfsmount *mnt; | 806 | struct vfsmount *mnt; |
| 808 | int error; | 807 | int error; |
| 809 | char *secdata = NULL; | 808 | char *secdata = NULL; |
| 810 | 809 | ||
| 811 | if (!type) | ||
| 812 | return ERR_PTR(-ENODEV); | ||
| 813 | |||
| 814 | mnt = alloc_vfsmnt(name); | 810 | mnt = alloc_vfsmnt(name); |
| 815 | if (!mnt) | 811 | if (!mnt) |
| 816 | goto out; | 812 | goto out; |
| @@ -841,7 +837,6 @@ do_kern_mount(const char *fstype, int flags, const char *name, void *data) | |||
| 841 | mnt->mnt_parent = mnt; | 837 | mnt->mnt_parent = mnt; |
| 842 | up_write(&sb->s_umount); | 838 | up_write(&sb->s_umount); |
| 843 | free_secdata(secdata); | 839 | free_secdata(secdata); |
| 844 | put_filesystem(type); | ||
| 845 | return mnt; | 840 | return mnt; |
| 846 | out_sb: | 841 | out_sb: |
| 847 | up_write(&sb->s_umount); | 842 | up_write(&sb->s_umount); |
| @@ -852,10 +847,23 @@ out_free_secdata: | |||
| 852 | out_mnt: | 847 | out_mnt: |
| 853 | free_vfsmnt(mnt); | 848 | free_vfsmnt(mnt); |
| 854 | out: | 849 | out: |
| 855 | put_filesystem(type); | ||
| 856 | return (struct vfsmount *)sb; | 850 | return (struct vfsmount *)sb; |
| 857 | } | 851 | } |
| 858 | 852 | ||
| 853 | EXPORT_SYMBOL_GPL(vfs_kern_mount); | ||
| 854 | |||
| 855 | struct vfsmount * | ||
| 856 | do_kern_mount(const char *fstype, int flags, const char *name, void *data) | ||
| 857 | { | ||
| 858 | struct file_system_type *type = get_fs_type(fstype); | ||
| 859 | struct vfsmount *mnt; | ||
| 860 | if (!type) | ||
| 861 | return ERR_PTR(-ENODEV); | ||
| 862 | mnt = vfs_kern_mount(type, flags, name, data); | ||
| 863 | put_filesystem(type); | ||
| 864 | return mnt; | ||
| 865 | } | ||
| 866 | |||
| 859 | EXPORT_SYMBOL_GPL(do_kern_mount); | 867 | EXPORT_SYMBOL_GPL(do_kern_mount); |
| 860 | 868 | ||
| 861 | struct vfsmount *kern_mount(struct file_system_type *type) | 869 | struct vfsmount *kern_mount(struct file_system_type *type) |
diff --git a/include/linux/mount.h b/include/linux/mount.h index b7472ae91fa4..aff68c3660f5 100644 --- a/include/linux/mount.h +++ b/include/linux/mount.h | |||
| @@ -73,6 +73,11 @@ extern struct vfsmount *alloc_vfsmnt(const char *name); | |||
| 73 | extern struct vfsmount *do_kern_mount(const char *fstype, int flags, | 73 | extern struct vfsmount *do_kern_mount(const char *fstype, int flags, |
| 74 | const char *name, void *data); | 74 | const char *name, void *data); |
| 75 | 75 | ||
| 76 | struct file_system_type; | ||
| 77 | extern struct vfsmount *vfs_kern_mount(struct file_system_type *type, | ||
| 78 | int flags, const char *name, | ||
| 79 | void *data); | ||
| 80 | |||
| 76 | struct nameidata; | 81 | struct nameidata; |
| 77 | 82 | ||
| 78 | extern int do_add_mount(struct vfsmount *newmnt, struct nameidata *nd, | 83 | extern int do_add_mount(struct vfsmount *newmnt, struct nameidata *nd, |
