DARRAY(enum bcachefs_metadata_version)
                                incompat_versions_requested;
 
-#ifdef CONFIG_UNICODE
        struct unicode_map      *cf_encoding;
-#endif
 
        struct bch_sb_handle    disk_sb;
 
                : ca->mi.discard;
 }
 
+static inline bool bch2_fs_casefold_enabled(struct bch_fs *c)
+{
+#ifdef CONFIG_UNICODE
+       return !c->opts.casefold_disabled;
+#else
+       return false;
+#endif
+}
+
 #endif /* _BCACHEFS_H */
 
 {
        *out_cf = (struct qstr) QSTR_INIT(NULL, 0);
 
-#ifdef CONFIG_UNICODE
+       if (!bch2_fs_casefold_enabled(trans->c))
+               return -EOPNOTSUPP;
+
        unsigned char *buf = bch2_trans_kmalloc(trans, BCH_NAME_MAX + 1);
        int ret = PTR_ERR_OR_ZERO(buf);
        if (ret)
 
        *out_cf = (struct qstr) QSTR_INIT(buf, ret);
        return 0;
-#else
-       return -EOPNOTSUPP;
-#endif
 }
 
 static unsigned bch2_dirent_name_bytes(struct bkey_s_c_dirent d)
        prt_printf(out, " type %s", bch2_d_type_str(d.v->d_type));
 }
 
-int bch2_dirent_init_name(struct bkey_i_dirent *dirent,
+int bch2_dirent_init_name(struct bch_fs *c,
+                         struct bkey_i_dirent *dirent,
                          const struct bch_hash_info *hash_info,
                          const struct qstr *name,
                          const struct qstr *cf_name)
                       offsetof(struct bch_dirent, d_name) -
                       name->len);
        } else {
-#ifdef CONFIG_UNICODE
+               if (!bch2_fs_casefold_enabled(c))
+                       return -EOPNOTSUPP;
+
                memcpy(&dirent->v.d_cf_name_block.d_names[0], name->name, name->len);
 
                char *cf_out = &dirent->v.d_cf_name_block.d_names[name->len];
                dirent->v.d_cf_name_block.d_cf_name_len = cpu_to_le16(cf_len);
 
                EBUG_ON(bch2_dirent_get_casefold_name(dirent_i_to_s_c(dirent)).len != cf_len);
-#else
-       return -EOPNOTSUPP;
-#endif
        }
 
        unsigned u64s = dirent_val_u64s(name->len, cf_len);
        dirent->v.d_type = type;
        dirent->v.d_unused = 0;
 
-       int ret = bch2_dirent_init_name(dirent, hash_info, name, cf_name);
+       int ret = bch2_dirent_init_name(trans->c, dirent, hash_info, name, cf_name);
        if (ret)
                return ERR_PTR(ret);
 
 
        dst->v.d_type = src.v->d_type;
 }
 
-int bch2_dirent_init_name(struct bkey_i_dirent *,
+int bch2_dirent_init_name(struct bch_fs *,
+                         struct bkey_i_dirent *,
                          const struct bch_hash_info *,
                          const struct qstr *,
                          const struct qstr *);
 
        if (IS_ERR(inode))
                inode = NULL;
 
-#ifdef CONFIG_UNICODE
        if (!inode && IS_CASEFOLDED(vdir)) {
                /*
                 * Do not cache a negative dentry in casefolded directories
                 */
                return NULL;
        }
-#endif
 
        return d_splice_alias(&inode->v, dentry);
 }
        sb->s_shrink->seeks = 0;
 
 #ifdef CONFIG_UNICODE
-       sb->s_encoding = c->cf_encoding;
-#endif
+       if (bch2_fs_casefold_enabled(c))
+               sb->s_encoding = c->cf_encoding;
        generic_set_sb_d_ops(sb);
+#endif
 
        vinode = bch2_vfs_inode_get(c, BCACHEFS_ROOT_SUBVOL_INUM);
        ret = PTR_ERR_OR_ZERO(vinode);
 
                *hash_info = bch2_hash_info_init(c, &i->inode);
        dir->first_this_inode = false;
 
-#ifdef CONFIG_UNICODE
        hash_info->cf_encoding = bch2_inode_casefold(c, &i->inode) ? c->cf_encoding : NULL;
-#endif
 
        ret = bch2_str_hash_check_key(trans, s, &bch2_dirent_hash_desc, hash_info,
                                      iter, k, need_second_pass);
 
 {
        struct bch_fs *c = trans->c;
 
-#ifdef CONFIG_UNICODE
+#ifndef CONFIG_UNICODE
+       bch_err(c, "Cannot use casefolding on a kernel without CONFIG_UNICODE");
+       return -EOPNOTSUPP;
+#endif
+
+       if (c->opts.casefold_disabled)
+               return -EOPNOTSUPP;
+
        int ret = 0;
        /* Not supported on individual files. */
        if (!S_ISDIR(bi->bi_mode))
        bi->bi_fields_set |= BIT(Inode_opt_casefold);
 
        return bch2_maybe_propagate_has_case_insensitive(trans, inum, bi);
-#else
-       bch_err(c, "Cannot use casefolding on a kernel without CONFIG_UNICODE");
-       return -EOPNOTSUPP;
-#endif
 }
 
 static noinline int __bch2_inode_rm_snapshot(struct btree_trans *trans, u64 inum, u32 snapshot)
 
          OPT_BOOL(),                                                   \
          BCH_SB_CASEFOLD,              false,                          \
          NULL,         "Dirent lookups are casefolded")                \
+       x(casefold_disabled,                    u8,                     \
+         OPT_FS|OPT_MOUNT,                                             \
+         OPT_BOOL(),                                                   \
+         BCH2_NO_SB_OPT,               false,                          \
+         NULL,         "Disable casefolding filesystem wide")          \
        x(inodes_32bit,                 u8,                             \
          OPT_FS|OPT_INODE|OPT_FORMAT|OPT_MOUNT|OPT_RUNTIME,            \
          OPT_BOOL(),                                                   \
 
                                   struct bkey_s_c_dirent old,
                                   bool *updated_before_k_pos)
 {
+       struct bch_fs *c = trans->c;
        struct qstr old_name = bch2_dirent_get_name(old);
        struct bkey_i_dirent *new = bch2_trans_kmalloc(trans, BKEY_U64s_MAX * sizeof(u64));
        int ret = PTR_ERR_OR_ZERO(new);
                                        sprintf(renamed_buf, "%.*s.fsck_renamed-%u",
                                                old_name.len, old_name.name, i));
 
-               ret = bch2_dirent_init_name(new, hash_info, &renamed_name, NULL);
+               ret = bch2_dirent_init_name(c, new, hash_info, &renamed_name, NULL);
                if (ret)
                        return ret;
 
        }
 
        ret = ret ?: bch2_fsck_update_backpointers(trans, s, desc, hash_info, &new->k_i);
-       bch_err_fn(trans->c, ret);
+       bch_err_fn(c, ret);
        return ret;
 }
 
 
        struct bch_hash_info info = {
                .inum_snapshot  = bi->bi_snapshot,
                .type           = INODE_STR_HASH(bi),
-#ifdef CONFIG_UNICODE
                .cf_encoding    = bch2_inode_casefold(c, bi) ? c->cf_encoding : NULL,
-#endif
                .siphash_key    = { .k0 = bi->bi_hash_seed }
        };
 
 
        }
 
 #ifdef CONFIG_UNICODE
-       /* Default encoding until we can potentially have more as an option. */
-       c->cf_encoding = utf8_load(BCH_FS_DEFAULT_UTF8_ENCODING);
-       if (IS_ERR(c->cf_encoding)) {
-               printk(KERN_ERR "Cannot load UTF-8 encoding for filesystem. Version: %u.%u.%u",
-                       unicode_major(BCH_FS_DEFAULT_UTF8_ENCODING),
-                       unicode_minor(BCH_FS_DEFAULT_UTF8_ENCODING),
-                       unicode_rev(BCH_FS_DEFAULT_UTF8_ENCODING));
-               ret = -EINVAL;
-               goto err;
+       if (bch2_fs_casefold_enabled(c)) {
+               /* Default encoding until we can potentially have more as an option. */
+               c->cf_encoding = utf8_load(BCH_FS_DEFAULT_UTF8_ENCODING);
+               if (IS_ERR(c->cf_encoding)) {
+                       printk(KERN_ERR "Cannot load UTF-8 encoding for filesystem. Version: %u.%u.%u",
+                              unicode_major(BCH_FS_DEFAULT_UTF8_ENCODING),
+                              unicode_minor(BCH_FS_DEFAULT_UTF8_ENCODING),
+                              unicode_rev(BCH_FS_DEFAULT_UTF8_ENCODING));
+                       ret = -EINVAL;
+                       goto err;
+               }
        }
 #else
        if (c->sb.features & BIT_ULL(BCH_FEATURE_casefolding)) {
 
        print_mount_opts(c);
 
-#ifdef CONFIG_UNICODE
-       bch_info(c, "Using encoding defined by superblock: utf8-%u.%u.%u",
-                unicode_major(BCH_FS_DEFAULT_UTF8_ENCODING),
-                unicode_minor(BCH_FS_DEFAULT_UTF8_ENCODING),
-                unicode_rev(BCH_FS_DEFAULT_UTF8_ENCODING));
-#endif
+       if (c->cf_encoding)
+               bch_info(c, "Using encoding defined by superblock: utf8-%u.%u.%u",
+                        unicode_major(BCH_FS_DEFAULT_UTF8_ENCODING),
+                        unicode_minor(BCH_FS_DEFAULT_UTF8_ENCODING),
+                        unicode_rev(BCH_FS_DEFAULT_UTF8_ENCODING));
 
        if (!bch2_fs_may_start(c))
                return bch_err_throw(c, insufficient_devices_to_start);