};
 #endif
 
-static const struct fs_parameter_spec btrfs_fs_parameters[] __maybe_unused = {
+static const struct fs_parameter_spec btrfs_fs_parameters[] = {
        fsparam_flag_no("acl", Opt_acl),
        fsparam_flag_no("autodefrag", Opt_defrag),
        fsparam_flag_no("barrier", Opt_barrier),
        return false;
 }
 
-static bool check_options(struct btrfs_fs_info *info, unsigned long *mount_opt,
-                         unsigned long flags)
+bool btrfs_check_options(struct btrfs_fs_info *info, unsigned long *mount_opt,
+                        unsigned long flags)
 {
        bool ret = true;
 
  */
 void btrfs_set_free_space_cache_settings(struct btrfs_fs_info *fs_info)
 {
-       if (btrfs_fs_compat_ro(fs_info, FREE_SPACE_TREE))
-               btrfs_set_opt(fs_info->mount_opt, FREE_SPACE_TREE);
-       else if (btrfs_free_space_cache_v1_active(fs_info)) {
-               if (btrfs_is_zoned(fs_info)) {
-                       btrfs_info(fs_info,
-                       "zoned: clearing existing space cache");
-                       btrfs_set_super_cache_generation(fs_info->super_copy, 0);
-               } else {
-                       btrfs_set_opt(fs_info->mount_opt, SPACE_CACHE);
-               }
-       }
-
        if (fs_info->sectorsize < PAGE_SIZE) {
                btrfs_clear_opt(fs_info->mount_opt, SPACE_CACHE);
                if (!btrfs_test_opt(fs_info, FREE_SPACE_TREE)) {
                        btrfs_set_opt(fs_info->mount_opt, FREE_SPACE_TREE);
                }
        }
+
+       /*
+        * At this point our mount options are populated, so we only mess with
+        * these settings if we don't have any settings already.
+        */
+       if (btrfs_test_opt(fs_info, FREE_SPACE_TREE))
+               return;
+
+       if (btrfs_is_zoned(fs_info) &&
+           btrfs_free_space_cache_v1_active(fs_info)) {
+               btrfs_info(fs_info, "zoned: clearing existing space cache");
+               btrfs_set_super_cache_generation(fs_info->super_copy, 0);
+               return;
+       }
+
+       if (btrfs_test_opt(fs_info, SPACE_CACHE))
+               return;
+
+       if (btrfs_test_opt(fs_info, NOSPACECACHE))
+               return;
+
+       /*
+        * At this point we don't have explicit options set by the user, set
+        * them ourselves based on the state of the file system.
+        */
+       if (btrfs_fs_compat_ro(fs_info, FREE_SPACE_TREE))
+               btrfs_set_opt(fs_info->mount_opt, FREE_SPACE_TREE);
+       else if (btrfs_free_space_cache_v1_active(fs_info))
+               btrfs_set_opt(fs_info->mount_opt, SPACE_CACHE);
 }
 
 static int parse_rescue_options(struct btrfs_fs_info *info, const char *options)
                }
        }
 out:
-       if (!ret && !check_options(info, &info->mount_opt, new_flags))
+       if (!ret && !btrfs_check_options(info, &info->mount_opt, new_flags))
                ret = -EINVAL;
        return ret;
 }
 #endif
        sb->s_xattr = btrfs_xattr_handlers;
        sb->s_time_gran = 1;
-#ifdef CONFIG_BTRFS_FS_POSIX_ACL
-       sb->s_flags |= SB_POSIXACL;
-#endif
-       sb->s_flags |= SB_I_VERSION;
        sb->s_iflags |= SB_I_CGROUPWB;
 
        err = super_setup_bdi(sb);
  * Note: This is based on mount_bdev from fs/super.c with a few additions
  *       for multiple device setup.  Make sure to keep it in sync.
  */
-static struct dentry *btrfs_mount_root(struct file_system_type *fs_type,
+static __maybe_unused struct dentry *btrfs_mount_root(struct file_system_type *fs_type,
                int flags, const char *device_name, void *data)
 {
        struct block_device *bdev = NULL;
  *   3. Call mount_subvol() to get the dentry of subvolume. Since there is
  *      "btrfs subvolume set-default", mount_subvol() is called always.
  */
-static struct dentry *btrfs_mount(struct file_system_type *fs_type, int flags,
+static __maybe_unused struct dentry *btrfs_mount(struct file_system_type *fs_type, int flags,
                const char *device_name, void *data)
 {
        struct vfsmount *mnt_root;
        set_bit(BTRFS_FS_STATE_REMOUNTING, &fs_info->fs_state);
 
        if (!mount_reconfigure &&
-           !check_options(fs_info, &ctx->mount_opt, fc->sb_flags))
+           !btrfs_check_options(fs_info, &ctx->mount_opt, fc->sb_flags))
                return -EINVAL;
 
        ret = btrfs_check_features(fs_info, !(fc->sb_flags & SB_RDONLY));
        .free           = btrfs_free_fs_context,
 };
 
-static int __maybe_unused btrfs_init_fs_context(struct fs_context *fc)
+static int btrfs_init_fs_context(struct fs_context *fc)
 {
        struct btrfs_fs_context *ctx;
 
                ctx->commit_interval = BTRFS_DEFAULT_COMMIT_INTERVAL;
        }
 
+#ifdef CONFIG_BTRFS_FS_POSIX_ACL
+       fc->sb_flags |= SB_POSIXACL;
+#endif
+       fc->sb_flags |= SB_I_VERSION;
+
        return 0;
 }
 
 static struct file_system_type btrfs_fs_type = {
-       .owner          = THIS_MODULE,
-       .name           = "btrfs",
-       .mount          = btrfs_mount,
-       .kill_sb        = btrfs_kill_super,
-       .fs_flags       = FS_REQUIRES_DEV | FS_BINARY_MOUNTDATA,
-};
-
-static struct file_system_type btrfs_root_fs_type = {
-       .owner          = THIS_MODULE,
-       .name           = "btrfs",
-       .mount          = btrfs_mount_root,
-       .kill_sb        = btrfs_kill_super,
-       .fs_flags       = FS_REQUIRES_DEV | FS_BINARY_MOUNTDATA | FS_ALLOW_IDMAP,
-};
+       .owner                  = THIS_MODULE,
+       .name                   = "btrfs",
+       .init_fs_context        = btrfs_init_fs_context,
+       .parameters             = btrfs_fs_parameters,
+       .kill_sb                = btrfs_kill_super,
+       .fs_flags               = FS_REQUIRES_DEV | FS_BINARY_MOUNTDATA | FS_ALLOW_IDMAP,
+ };
 
 MODULE_ALIAS_FS("btrfs");
 
        .destroy_inode  = btrfs_destroy_inode,
        .free_inode     = btrfs_free_inode,
        .statfs         = btrfs_statfs,
-       .remount_fs     = btrfs_remount,
        .freeze_fs      = btrfs_freeze,
        .unfreeze_fs    = btrfs_unfreeze,
 };