With case insensitive file systems, like FAT, we should avoid having multiple dentry cache entries for the same file differing only in capitalization. Allow case-insensitive file system to set a casefold flag that barebox will honour when comparing dentries.
That this patch works can be verified using the debug_fs_dump command, which will show a dentry for each differently cased path in a VFAT, but only a single dentry once this patch is applied. Signed-off-by: Ahmad Fatoum <[email protected]> --- fs/fat/fat.c | 1 + fs/fs.c | 3 +++ include/linux/fs.h | 1 + 3 files changed, 5 insertions(+) diff --git a/fs/fat/fat.c b/fs/fat/fat.c index cdca666566d2..93d1e08b8456 100644 --- a/fs/fat/fat.c +++ b/fs/fat/fat.c @@ -352,6 +352,7 @@ static int fat_probe(struct device *dev) goto err_open; priv->cdev = fsdev->cdev; + fsdev->sb.s_casefold = true; priv->fat.userdata = priv; ret = f_mount(&priv->fat); diff --git a/fs/fs.c b/fs/fs.c index cc6f0f7057c3..e997bd5f6a99 100644 --- a/fs/fs.c +++ b/fs/fs.c @@ -1562,6 +1562,9 @@ static bool d_same_name(const struct dentry *dentry, if (dentry->d_name.len != name->len) return false; + if (dentry->d_sb->s_casefold) + return strncasecmp(dentry->d_name.name, name->name, name->len) == 0; + return strncmp(dentry->d_name.name, name->name, name->len) == 0; } diff --git a/include/linux/fs.h b/include/linux/fs.h index e624b2ce7161..d3813ad9c543 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -160,6 +160,7 @@ struct super_block { unsigned long s_blocksize; unsigned char s_blocksize_bits; unsigned char s_dirt; + bool s_casefold; unsigned long long s_maxbytes; /* Max file size */ struct file_system_type *s_type; const struct super_operations *s_op; -- 2.47.3
