Re: [RFC PATCH 48/68] vfs: Convert cramfs to use the new mount API
From: Nicolas Pitre
Date: Mon Apr 01 2019 - 11:25:29 EST
On Wed, 27 Mar 2019, David Howells wrote:
> Convert the cramfs filesystem to the new internal mount API as the old
> one will be obsoleted and removed. This allows greater flexibility in
> communication of mount parameters between userspace, the VFS and the
> filesystem.
>
> See Documentation/filesystems/mount_api.txt for more information.
>
> Signed-off-by: David Howells <dhowells@xxxxxxxxxx>
> cc: Nicolas Pitre <nico@xxxxxxxxxx>
> cc: linux-mtd@xxxxxxxxxxxxxxxxxxx
> cc: linux-block@xxxxxxxxxxxxxxx
Tested-by: Nicolas Pitre <nico@xxxxxxxxxxx>
Acked-by: Nicolas Pitre <nico@xxxxxxxxxxx>
> ---
>
> fs/cramfs/inode.c | 69 ++++++++++++++++++++++++++++++-----------------------
> 1 file changed, 39 insertions(+), 30 deletions(-)
>
> diff --git a/fs/cramfs/inode.c b/fs/cramfs/inode.c
> index 9352487bd0fc..2ee89a353d64 100644
> --- a/fs/cramfs/inode.c
> +++ b/fs/cramfs/inode.c
> @@ -24,6 +24,7 @@
> #include <linux/blkdev.h>
> #include <linux/mtd/mtd.h>
> #include <linux/mtd/super.h>
> +#include <linux/fs_context.h>
> #include <linux/slab.h>
> #include <linux/vfs.h>
> #include <linux/mutex.h>
> @@ -506,18 +507,19 @@ static void cramfs_kill_sb(struct super_block *sb)
> kfree(sbi);
> }
>
> -static int cramfs_remount(struct super_block *sb, int *flags, char *data)
> +static int cramfs_reconfigure(struct fs_context *fc)
> {
> - sync_filesystem(sb);
> - *flags |= SB_RDONLY;
> + sync_filesystem(fc->root->d_sb);
> + fc->sb_flags |= SB_RDONLY;
> return 0;
> }
>
> -static int cramfs_read_super(struct super_block *sb,
> - struct cramfs_super *super, int silent)
> +static int cramfs_read_super(struct super_block *sb, struct fs_context *fc,
> + struct cramfs_super *super)
> {
> struct cramfs_sb_info *sbi = CRAMFS_SB(sb);
> unsigned long root_offset;
> + bool silent = fc->sb_flags & SB_SILENT;
>
> /* We don't know the real size yet */
> sbi->size = PAGE_SIZE;
> @@ -532,7 +534,7 @@ static int cramfs_read_super(struct super_block *sb,
> /* check for wrong endianness */
> if (super->magic == CRAMFS_MAGIC_WEND) {
> if (!silent)
> - pr_err("wrong endianness\n");
> + errorf(fc, "cramfs: wrong endianness");
> return -EINVAL;
> }
>
> @@ -544,22 +546,22 @@ static int cramfs_read_super(struct super_block *sb,
> mutex_unlock(&read_mutex);
> if (super->magic != CRAMFS_MAGIC) {
> if (super->magic == CRAMFS_MAGIC_WEND && !silent)
> - pr_err("wrong endianness\n");
> + errorf(fc, "cramfs: wrong endianness");
> else if (!silent)
> - pr_err("wrong magic\n");
> + errorf(fc, "cramfs: wrong magic");
> return -EINVAL;
> }
> }
>
> /* get feature flags first */
> if (super->flags & ~CRAMFS_SUPPORTED_FLAGS) {
> - pr_err("unsupported filesystem features\n");
> + errorf(fc, "cramfs: unsupported filesystem features");
> return -EINVAL;
> }
>
> /* Check that the root inode is in a sane state */
> if (!S_ISDIR(super->root.mode)) {
> - pr_err("root is not a directory\n");
> + errorf(fc, "cramfs: root is not a directory");
> return -EINVAL;
> }
> /* correct strange, hard-coded permissions of mkcramfs */
> @@ -578,12 +580,12 @@ static int cramfs_read_super(struct super_block *sb,
> sbi->magic = super->magic;
> sbi->flags = super->flags;
> if (root_offset == 0)
> - pr_info("empty filesystem");
> + infof(fc, "cramfs: empty filesystem");
> else if (!(super->flags & CRAMFS_FLAG_SHIFTED_ROOT_OFFSET) &&
> ((root_offset != sizeof(struct cramfs_super)) &&
> (root_offset != 512 + sizeof(struct cramfs_super))))
> {
> - pr_err("bad root offset %lu\n", root_offset);
> + errorf(fc, "cramfs: bad root offset %lu", root_offset);
> return -EINVAL;
> }
>
> @@ -607,8 +609,7 @@ static int cramfs_finalize_super(struct super_block *sb,
> return 0;
> }
>
> -static int cramfs_blkdev_fill_super(struct super_block *sb, void *data,
> - int silent)
> +static int cramfs_blkdev_fill_super(struct super_block *sb, struct fs_context *fc)
> {
> struct cramfs_sb_info *sbi;
> struct cramfs_super super;
> @@ -623,14 +624,13 @@ static int cramfs_blkdev_fill_super(struct super_block *sb, void *data,
> for (i = 0; i < READ_BUFFERS; i++)
> buffer_blocknr[i] = -1;
>
> - err = cramfs_read_super(sb, &super, silent);
> + err = cramfs_read_super(sb, fc, &super);
> if (err)
> return err;
> return cramfs_finalize_super(sb, &super.root);
> }
>
> -static int cramfs_mtd_fill_super(struct super_block *sb, void *data,
> - int silent)
> +static int cramfs_mtd_fill_super(struct super_block *sb, struct fs_context *fc)
> {
> struct cramfs_sb_info *sbi;
> struct cramfs_super super;
> @@ -652,7 +652,7 @@ static int cramfs_mtd_fill_super(struct super_block *sb, void *data,
>
> pr_info("checking physical address %pap for linear cramfs image\n",
> &sbi->linear_phys_addr);
> - err = cramfs_read_super(sb, &super, silent);
> + err = cramfs_read_super(sb, fc, &super);
> if (err)
> return err;
>
> @@ -947,32 +947,41 @@ static const struct inode_operations cramfs_dir_inode_operations = {
> };
>
> static const struct super_operations cramfs_ops = {
> - .remount_fs = cramfs_remount,
> .statfs = cramfs_statfs,
> };
>
> -static struct dentry *cramfs_mount(struct file_system_type *fs_type, int flags,
> - const char *dev_name, void *data)
> +static int cramfs_get_tree(struct fs_context *fc)
> {
> - struct dentry *ret = ERR_PTR(-ENOPROTOOPT);
> + int ret = -ENOPROTOOPT;
>
> if (IS_ENABLED(CONFIG_CRAMFS_MTD)) {
> - ret = mount_mtd(fs_type, flags, dev_name, data,
> - cramfs_mtd_fill_super);
> - if (!IS_ERR(ret))
> + ret = vfs_get_mtd_super(fc, cramfs_mtd_fill_super);
> + if (ret < 0)
> return ret;
> }
> - if (IS_ENABLED(CONFIG_CRAMFS_BLOCKDEV)) {
> - ret = mount_bdev(fs_type, flags, dev_name, data,
> - cramfs_blkdev_fill_super);
> - }
> + if (IS_ENABLED(CONFIG_CRAMFS_BLOCKDEV))
> + ret = vfs_get_block_super(fc, cramfs_blkdev_fill_super);
> return ret;
> }
>
> +static const struct fs_context_operations cramfs_context_ops = {
> + .get_tree = cramfs_get_tree,
> + .reconfigure = cramfs_reconfigure,
> +};
> +
> +/*
> + * Set up the filesystem mount context.
> + */
> +static int cramfs_init_fs_context(struct fs_context *fc)
> +{
> + fc->ops = &cramfs_context_ops;
> + return 0;
> +}
> +
> static struct file_system_type cramfs_fs_type = {
> .owner = THIS_MODULE,
> .name = "cramfs",
> - .mount = cramfs_mount,
> + .init_fs_context = cramfs_init_fs_context,
> .kill_sb = cramfs_kill_sb,
> .fs_flags = FS_REQUIRES_DEV,
> };
>
>