On Thu, Aug 14, 2025 at 7:22 PM André Almeida <andrealmeid@xxxxxxxxxx> wrote: > > Prepare for mounting layers with case-insensitive dentries in order to > supporting such layers in overlayfs, while enforcing uniform casefold > layers. > > Signed-off-by: André Almeida <andrealmeid@xxxxxxxxxx> Reviewed-by: Amir Goldstein <amir73il@xxxxxxxxx> > --- > Changes from v4: > - Move relaxation of dentry_weird to the last patch > - s/filesystems/layerss > - Commit now says "Prepare for" instead of "Support" > --- > fs/overlayfs/ovl_entry.h | 1 + > fs/overlayfs/params.c | 15 ++++++++++++--- > fs/overlayfs/params.h | 1 + > 3 files changed, 14 insertions(+), 3 deletions(-) > > diff --git a/fs/overlayfs/ovl_entry.h b/fs/overlayfs/ovl_entry.h > index 4c1bae935ced274f93a0d23fe10d34455e226ec4..1d4828dbcf7ac4ba9657221e601bbf79d970d225 100644 > --- a/fs/overlayfs/ovl_entry.h > +++ b/fs/overlayfs/ovl_entry.h > @@ -91,6 +91,7 @@ struct ovl_fs { > struct mutex whiteout_lock; > /* r/o snapshot of upperdir sb's only taken on volatile mounts */ > errseq_t errseq; > + bool casefold; > }; > > /* Number of lower layers, not including data-only layers */ > diff --git a/fs/overlayfs/params.c b/fs/overlayfs/params.c > index f4e7fff909ac49e2f8c58a76273426c1158a7472..17d2354ba88d92e1d9653e8cb1382d860a7329c5 100644 > --- a/fs/overlayfs/params.c > +++ b/fs/overlayfs/params.c > @@ -277,16 +277,25 @@ static int ovl_mount_dir_check(struct fs_context *fc, const struct path *path, > enum ovl_opt layer, const char *name, bool upper) > { > struct ovl_fs_context *ctx = fc->fs_private; > + struct ovl_fs *ofs = fc->s_fs_info; > + bool is_casefolded = ovl_dentry_casefolded(path->dentry); > > if (!d_is_dir(path->dentry)) > return invalfc(fc, "%s is not a directory", name); > > /* > * Allow filesystems that are case-folding capable but deny composing > - * ovl stack from case-folded directories. > + * ovl stack from inconsistent case-folded directories. > */ > - if (ovl_dentry_casefolded(path->dentry)) > - return invalfc(fc, "case-insensitive directory on %s not supported", name); > + if (!ctx->casefold_set) { > + ofs->casefold = is_casefolded; > + ctx->casefold_set = true; > + } > + > + if (ofs->casefold != is_casefolded) { > + return invalfc(fc, "case-%ssensitive directory on %s is inconsistent", > + is_casefolded ? "in" : "", name); > + } > > if (ovl_dentry_weird(path->dentry)) > return invalfc(fc, "filesystem on %s not supported", name); > diff --git a/fs/overlayfs/params.h b/fs/overlayfs/params.h > index c96d939820211ddc63e265670a2aff60d95eec49..ffd53cdd84827cce827e8852f2de545f966ce60d 100644 > --- a/fs/overlayfs/params.h > +++ b/fs/overlayfs/params.h > @@ -33,6 +33,7 @@ struct ovl_fs_context { > struct ovl_opt_set set; > struct ovl_fs_context_layer *lower; > char *lowerdir_all; /* user provided lowerdir string */ > + bool casefold_set; > }; > > int ovl_init_fs_context(struct fs_context *fc); > > -- > 2.50.1 >