@@ -1925,6 +1925,51 @@ xfs_fs_fill_super(
return error;
}
+STATIC int
+xfs_fill_super(
+ struct super_block *sb,
+ struct fs_context *fc)
+{
+ struct xfs_fs_context *ctx = fc->fs_private;
+ struct xfs_mount *mp = sb->s_fs_info;
+ int silent = fc->sb_flags & SB_SILENT;
+ int error = -ENOMEM;
+
+ mp->m_super = sb;
+
+ /*
+ * set up the mount name first so all the errors will refer to the
+ * correct device.
+ */
+ mp->m_fsname = kstrndup(sb->s_id, MAXNAMELEN, GFP_KERNEL);
+ if (!mp->m_fsname)
+ goto out_error;
+ mp->m_fsname_len = strlen(mp->m_fsname) + 1;
+
+ error = xfs_validate_params(mp, ctx, false);
+ if (error)
+ goto out_error;
+
+ error = __xfs_fs_fill_super(mp, silent);
+ if (error)
+ goto out_error;
+
+ return 0;
+
+ out_error:
+ sb->s_fs_info = NULL;
+ xfs_free_fsname(mp);
+ kfree(mp);
+ return error;
+}
+
+STATIC int
+xfs_get_tree(
+ struct fs_context *fc)
+{
+ return get_tree_bdev(fc, xfs_fill_super);
+}
+
STATIC void
xfs_fs_put_super(
struct super_block *sb)
@@ -1995,6 +2040,11 @@ static const struct super_operations xfs_super_operations = {
.free_cached_objects = xfs_fs_free_cached_objects,
};
+static const struct fs_context_operations xfs_context_ops = {
+ .parse_param = xfs_parse_param,
+ .get_tree = xfs_get_tree,
+};
+
static struct file_system_type xfs_fs_type = {
.owner = THIS_MODULE,
.name = "xfs",