Hi all, We would like to support the usage of casefold layers with overlayfs to be used with container tools. This use case requires a simple setup, where every layer will have the same encoding setting (i.e. Unicode version and flags), using one upper and one lower layer. * Implementation When merge layers, ovl uses a red-black tree to check if a given dentry name from a lower layers already exists in the upper layer. For merging case-insensitive names, we need to store then in tree casefolded. However, when displaying to the user the dentry name, we need to respect the name chosen when the file was created (e.g. Picture.PNG, instead of picture.png). To achieve this, I create a new field for cache entries that stores the casefolded names and a function ovl_strcmp() that uses this name for searching the rb_tree. For composing the layer, ovl uses the original name, keeping it consistency with whatever name the user created. The rest of the patches are mostly for checking if casefold is being consistently used across the layers and dropping the mount restrictions that prevented case-insensitive filesystems to be mounted. Thanks for the feedback! --- Changes in v6: - Change pr_warn_ratelimited() message for ovl_create_real() - Fixed kernel bot warning: "unused variable 'ofs'" - Last version was using `strncmp(... tmp->len)` which was causing xfstests regressions. It should be `strncmp(... len)`. - Use c_len for tree operation: (cmp < 0 || len < tmp->c_len) - Remove needless kfree(cf_name) - Fix mounting layers without casefold enabled in ovl_dentry_weird() v5: https://lore.kernel.org/r/20250814-tonyk-overlayfs-v5-0-c5b80a909cbd@xxxxxxxxxx Changes in v5: - Reordered commits. libfs commits come earlier in the series - First ovl commit just prepare and create ofs->casefold. The proper enablement is done in the last commit - Rework ovl_casefold() consumer/free buffer logic out to the caller - Replace `const char *aux` with `const char *c_name` - Add pr_warn_ratelimited() for ovl_create_real() error - Replace "filesystems" with "layers" in the commit messages - Add "Testing" section to cover letter v4: https://lore.kernel.org/r/20250813-tonyk-overlayfs-v4-0-357ccf2e12ad@xxxxxxxxxx Changes in v4: - Split patch "ovl: Support case-insensitive lookup" and move patch that creates ofs->casefold to the begging of the series - Merge patch "Store casefold name..." and "Create ovl_casefold()..." - Make encoding restrictions apply just when casefold is enabled - Rework set_d_op() with new helper - Set encoding and encoding flags inside of ovl_get_layers() - Rework how inode flags are set and checked v3: https://lore.kernel.org/r/20250808-tonyk-overlayfs-v3-0-30f9be426ba8@xxxxxxxxxx Changes in v3: - Rebased on top of vfs-6.18.misc branch - Added more guards for casefolding things inside of IS_ENABLED(UNICODE) - Refactor the strncmp() patch to do a single kmalloc() per rb_tree operation - Instead of casefolding the cache entry name everytime per strncmp(), casefold it once and reuse it for every strncmp(). - Created ovl_dentry_ci_operations to not override dentry ops set by ovl_dentry_operations - Instead of setting encoding just when there's a upper layer, set it for any first layer (ofs->fs[0].sb), regardless of it being upper or not. - Rewrote the patch that set inode flags - Check if every dentry is consistent with the root dentry regarding casefold v2: https://lore.kernel.org/r/20250805-tonyk-overlayfs-v2-0-0e54281da318@xxxxxxxxxx Changes in v2: - Almost a full rewritten from the v1. v1: https://lore.kernel.org/lkml/20250409-tonyk-overlayfs-v1-0-3991616fe9a3@xxxxxxxxxx/ --- André Almeida (9): fs: Create sb_encoding() helper fs: Create sb_same_encoding() helper ovl: Prepare for mounting case-insensitive enabled layers ovl: Create ovl_casefold() to support casefolded strncmp() ovl: Ensure that all layers have the same encoding ovl: Set case-insensitive dentry operations for ovl sb ovl: Add S_CASEFOLD as part of the inode flag to be copied ovl: Check for casefold consistency when creating new dentries ovl: Support mounting case-insensitive enabled layers fs/overlayfs/copy_up.c | 2 +- fs/overlayfs/dir.c | 7 +++ fs/overlayfs/inode.c | 1 + fs/overlayfs/namei.c | 17 +++---- fs/overlayfs/overlayfs.h | 8 ++-- fs/overlayfs/ovl_entry.h | 1 + fs/overlayfs/params.c | 15 +++++-- fs/overlayfs/params.h | 1 + fs/overlayfs/readdir.c | 113 +++++++++++++++++++++++++++++++++++++++-------- fs/overlayfs/super.c | 51 +++++++++++++++++++++ fs/overlayfs/util.c | 10 +++-- include/linux/fs.h | 27 ++++++++++- 12 files changed, 213 insertions(+), 40 deletions(-) --- base-commit: 3b7f28e441a100531fa9eff20e011a42376ca7d5 change-id: 20250409-tonyk-overlayfs-591f5e4d407a Best regards, -- André Almeida <andrealmeid@xxxxxxxxxx>