]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - fs/cramfs/inode.c
Merge tag 'drm-next-2019-09-27' of git://anongit.freedesktop.org/drm/drm
[linux.git] / fs / cramfs / inode.c
index 4d1d8b7761ed0f06622981bbe2dd66e5f37ce079..d12ea28836a549cf6fbd034dff882de17d36537b 100644 (file)
@@ -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;
        }
 
@@ -609,8 +611,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;
@@ -625,14 +626,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;
@@ -654,7 +654,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;
 
@@ -949,32 +949,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 = get_tree_mtd(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 = get_tree_bdev(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,
 };