diff options
author | Daniel Rosenberg <drosen@google.com> | 2017-03-10 12:39:42 -0800 |
---|---|---|
committer | Amit Pundir <amit.pundir@linaro.org> | 2017-04-10 13:12:16 +0530 |
commit | 989624c14f9b69dfa67007886661b16d8aad05f9 (patch) | |
tree | 33ef09210c20671a9823dfd7f2d4bba6f5b22b1a /fs | |
parent | 52d522b50584201ccc26a22bb588f805a2e6fa58 (diff) |
ANDROID: sdcardfs: Use case insensitive hash function
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
Diffstat (limited to 'fs')
-rw-r--r-- | fs/sdcardfs/packagelist.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/fs/sdcardfs/packagelist.c b/fs/sdcardfs/packagelist.c index 68f8f4571615..e72fe83f7837 100644 --- a/fs/sdcardfs/packagelist.c +++ b/fs/sdcardfs/packagelist.c @@ -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,10 +45,18 @@ static DEFINE_HASHTABLE(ext_to_groupid, 8); static struct kmem_cache *hashtable_entry_cachep; +static unsigned int full_name_case_hash(const unsigned char *name, unsigned int len) +{ + unsigned long hash = init_name_hash(); + while (len--) + hash = partial_name_hash(tolower(*name++), hash); + return end_name_hash(hash); +} + static void inline qstr_init(struct qstr *q, const char *name) { q->name = name; q->len = strlen(q->name); - q->hash = full_name_hash(q->name, q->len); + q->hash = full_name_case_hash(q->name, q->len); } static inline int qstr_copy(const struct qstr *src, struct qstr *dest) { |