On Thu, 23 Nov 2023 at 07:57, Gabriel Krisman Bertazi <gabriel@xxxxxxxxxx> wrote: > > The problem I found with that approach, which I originally tried, was > preventing concurrent lookups from racing with the invalidation and > creating more 'case-sensitive' negative dentries. Did I miss a way to > synchronize with concurrent lookups of the children of the dentry? We > can trivially ensure the dentry doesn't have positive children by > holding the parent lock, but that doesn't protect from concurrent > lookups creating negative dentries, as far as I understand. I'd just set the "casefolded" bit, then do a RCU grace period wait, and then invalidate all old negative dentries. Sure, there's technically a window there where somebody could hit an existing negative dentry that matches a casefolded name after casefolded has been set (but before the invalidation) and the lookup would result in a "does not exist" lookup that way. But that seems no different from the lookup having been done before the casefolded bit got set, so I don't think that's an _actual_ difference. If you do a lookup concurrently with the directory being set casefolded, you get one or the other. And no, I haven't thought about this a ton, but it seems the obvious thing to do. Temporary stale negative dentries while the casefolded bit is in the process of being set seems a harmless thing, exactly because they would seem to be the same thing as if the lookup was done before... And yes, that "wait for RCU grace period" is a somewhat slow operation, but how often do the casefolded bits get changed? This is not a huge deal. I don't hate your approach, I just found it surprising. Linus