ANDROID: sdcardfs: Use case insensitive hash function
authorDaniel Rosenberg <drosen@google.com>
Fri, 10 Mar 2017 20:39:42 +0000 (12:39 -0800)
committerDaniel Rosenberg <drosen@google.com>
Tue, 30 Jan 2018 03:40:06 +0000 (19:40 -0800)
Case insensitive comparisons don't help us much if
we hash to different buckets...

Signed-off-by: Daniel Rosenberg <drosen@google.com>
bug: 36004503
Change-Id: I91e00dbcd860a709cbd4f7fd7fc6d855779f3285

fs/sdcardfs/packagelist.c

index d933bffacc7afb7f42642a4aaeeadd0c3126e305..2cc076ca85de0e4745d6eb5af333bee100cc5fe1 100644 (file)
@@ -20,6 +20,7 @@
 
 #include "sdcardfs.h"
 #include <linux/hashtable.h>
+#include <linux/ctype.h>
 #include <linux/delay.h>
 #include <linux/radix-tree.h>
 #include <linux/dcache.h>
@@ -44,11 +45,19 @@ static DEFINE_HASHTABLE(ext_to_groupid, 8);
 
 static struct kmem_cache *hashtable_entry_cachep;
 
+static unsigned int full_name_case_hash(const void *salt, const unsigned char *name, unsigned int len)
+{
+       unsigned long hash = init_name_hash(salt);
+       while (len--)
+               hash = partial_name_hash(tolower(*name++), hash);
+       return end_name_hash(hash);
+}
+
 static inline void qstr_init(struct qstr *q, const char *name)
 {
        q->name = name;
        q->len = strlen(q->name);
-       q->hash = full_name_hash(0, q->name, q->len);
+       q->hash = full_name_case_hash(0, q->name, q->len);
 }
 
 static inline int qstr_copy(const struct qstr *src, struct qstr *dest)