diff options
| -rw-r--r-- | fs/super.c | 17 | ||||
| -rw-r--r-- | include/linux/fs.h | 2 | 
2 files changed, 16 insertions, 3 deletions
diff --git a/fs/super.c b/fs/super.c index b9c9869165d..00a2c9662b5 100644 --- a/fs/super.c +++ b/fs/super.c @@ -918,6 +918,7 @@ struct vfsmount *  vfs_kern_mount(struct file_system_type *type, int flags, const char *name, void *data)  {  	struct vfsmount *mnt; +	struct dentry *root;  	char *secdata = NULL;  	int error; @@ -942,9 +943,19 @@ vfs_kern_mount(struct file_system_type *type, int flags, const char *name, void  			goto out_free_secdata;  	} -	error = type->get_sb(type, flags, name, data, mnt); -	if (error < 0) -		goto out_free_secdata; +	if (type->mount) { +		root = type->mount(type, flags, name, data); +		if (IS_ERR(root)) { +			error = PTR_ERR(root); +			goto out_free_secdata; +		} +		mnt->mnt_root = root; +		mnt->mnt_sb = root->d_sb; +	} else { +		error = type->get_sb(type, flags, name, data, mnt); +		if (error < 0) +			goto out_free_secdata; +	}  	BUG_ON(!mnt->mnt_sb);  	WARN_ON(!mnt->mnt_sb->s_bdi);  	mnt->mnt_sb->s_flags |= MS_BORN; diff --git a/include/linux/fs.h b/include/linux/fs.h index 1c73b50e81f..c6b47431169 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1772,6 +1772,8 @@ struct file_system_type {  	int fs_flags;  	int (*get_sb) (struct file_system_type *, int,  		       const char *, void *, struct vfsmount *); +	struct dentry *(*mount) (struct file_system_type *, int, +		       const char *, void *);  	void (*kill_sb) (struct super_block *);  	struct module *owner;  	struct file_system_type * next;  |