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, > }; > >