diff options
Diffstat (limited to 'fs/super.c')
| -rw-r--r-- | fs/super.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/fs/super.c b/fs/super.c index b9c9869165db..00a2c9662b55 100644 --- a/fs/super.c +++ b/fs/super.c | |||
| @@ -918,6 +918,7 @@ struct vfsmount * | |||
| 918 | vfs_kern_mount(struct file_system_type *type, int flags, const char *name, void *data) | 918 | vfs_kern_mount(struct file_system_type *type, int flags, const char *name, void *data) |
| 919 | { | 919 | { |
| 920 | struct vfsmount *mnt; | 920 | struct vfsmount *mnt; |
| 921 | struct dentry *root; | ||
| 921 | char *secdata = NULL; | 922 | char *secdata = NULL; |
| 922 | int error; | 923 | int error; |
| 923 | 924 | ||
| @@ -942,9 +943,19 @@ vfs_kern_mount(struct file_system_type *type, int flags, const char *name, void | |||
| 942 | goto out_free_secdata; | 943 | goto out_free_secdata; |
| 943 | } | 944 | } |
| 944 | 945 | ||
| 945 | error = type->get_sb(type, flags, name, data, mnt); | 946 | if (type->mount) { |
| 946 | if (error < 0) | 947 | root = type->mount(type, flags, name, data); |
| 947 | goto out_free_secdata; | 948 | if (IS_ERR(root)) { |
| 949 | error = PTR_ERR(root); | ||
| 950 | goto out_free_secdata; | ||
| 951 | } | ||
| 952 | mnt->mnt_root = root; | ||
| 953 | mnt->mnt_sb = root->d_sb; | ||
| 954 | } else { | ||
| 955 | error = type->get_sb(type, flags, name, data, mnt); | ||
| 956 | if (error < 0) | ||
| 957 | goto out_free_secdata; | ||
| 958 | } | ||
| 948 | BUG_ON(!mnt->mnt_sb); | 959 | BUG_ON(!mnt->mnt_sb); |
| 949 | WARN_ON(!mnt->mnt_sb->s_bdi); | 960 | WARN_ON(!mnt->mnt_sb->s_bdi); |
| 950 | mnt->mnt_sb->s_flags |= MS_BORN; | 961 | mnt->mnt_sb->s_flags |= MS_BORN; |
