break;
                case Opt_space_cache:
                case Opt_space_cache_version:
+                       /*
+                        * We already set FREE_SPACE_TREE above because we have
+                        * compat_ro(FREE_SPACE_TREE) set, and we aren't going
+                        * to allow v1 to be set for extent tree v2, simply
+                        * ignore this setting if we're extent tree v2.
+                        */
+                       if (btrfs_fs_incompat(info, EXTENT_TREE_V2))
+                               break;
                        if (token == Opt_space_cache ||
                            strcmp(args[0].from, "v1") == 0) {
                                btrfs_clear_opt(info->mount_opt,
                        btrfs_set_opt(info->mount_opt, RESCAN_UUID_TREE);
                        break;
                case Opt_no_space_cache:
+                       /*
+                        * We cannot operate without the free space tree with
+                        * extent tree v2, ignore this option.
+                        */
+                       if (btrfs_fs_incompat(info, EXTENT_TREE_V2))
+                               break;
                        if (btrfs_test_opt(info, SPACE_CACHE)) {
                                btrfs_clear_and_info(info, SPACE_CACHE,
                                             "disabling disk space caching");
        "the 'inode_cache' option is deprecated and has no effect since 5.11");
                        break;
                case Opt_clear_cache:
+                       /*
+                        * We cannot clear the free space tree with extent tree
+                        * v2, ignore this option.
+                        */
+                       if (btrfs_fs_incompat(info, EXTENT_TREE_V2))
+                               break;
                        btrfs_set_and_info(info, CLEAR_CACHE,
                                           "force clearing of disk cache");
                        break;