André Almeida <andrealmeid@xxxxxxxxxx> writes: > Hi all, > > We would like to support the usage of casefold filesystems with > overlayfs. This patchset do some of the work needed for that, but I'm > sure there are more places that need to be tweaked so please share your > feedback for this work. I didn't look the patches yet, but this is going to be quite tricky. For a start, consider the semantics when mixing volumes with different case settings for lower/upper/work directories. And that could be any setting, such as whether the directory has +F, the encoding version and the encoding flags (strict mode). Any mismatch will look bonkers and you want to forbid the mount. Consider upperdir is case-sensitive but lowerdir is not. In this case, I suspect the case-exact name would be hidden by the upper, but the inexact-case would still resolve from the lower when it shouldn't, and can't be raised again. If we have the other way around, the upper will hide more than one file from the lower and it is a matter of luck which file we are getting. In addition, if we have a case-insensitive on top of a case-sensitive, there is no way we can do the case-insensitive lookup on the lower without doing a sequential search across the entire directory. Then it is again a matter of luck which file we are getting. The issue can appear even on the same volume, since case-insensitiveness is actually per-directory and can be flipped when a directory is empty. If something like the below is possible, we are in the same situation again: mkdir lower/ci chattr +F lower/ci touch lower/ci/BLA mount -o overlay none upperdir=upper,lowerdir=lower,workdir=work merged rm -r merged/ci/BLA // creates a whiteout in upper // merged looks empty and should be allowed to drop +F chattr -F merged/ci So we'd also need to always forbid clearing the +F attribute and perhaps forbid it from ever being set on the merged directory. We also want to require the encoding version and flags to match. > * Implementation > > The most obvious place that required change was the strncmp() inside of > ovl_cache_entry_find(), that I managed to convert to use d_same_name(), > that will then call the generic_ci_d_compare function if it's set for > the dentry. There are more strncmp() around ovl, but I would rather hear > feedback about this approach first than already implementing this around > the code. I'd suggest marking it as an RFC since it is not a functional implementation yet, IIUC. >> * Testing > sudo mount -t tmpfs -o casefold tmpfs mnt/ > cd mnt/ > mkdir dir > chattr +F dir > cd dir/ > mkdir upper lower > mkdir lower/A lower/b lower/c > mkdir upper/a upper/b upper/d > mkdir merged work > sudo mount -t overlay overlay -olowerdir=lower,upperdir=upper,workdir=work, merged > ls /tmp/mnt/dir/merged/ > a b c d > > And ovl is respecting the equivalent names. `a` points to a merged dir > between `A` and `a`, but giving that upperdir has a lowercase `a`, this > is the name displayed here. Did you try fstests generic/556? It might require some work to make it run over ovl, but it will exercise several cases that are quite hard to spot. -- Gabriel Krisman Bertazi