aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/staging/lustre/lustre/llite/statahead.c8
-rw-r--r--fs/adfs/dir.c2
-rw-r--r--fs/affs/namei.c8
-rw-r--r--fs/autofs4/waitq.c2
-rw-r--r--fs/ceph/inode.c4
-rw-r--r--fs/ceph/mds_client.c2
-rw-r--r--fs/cifs/dir.c2
-rw-r--r--fs/dcache.c23
-rw-r--r--fs/efivarfs/super.c4
-rw-r--r--fs/fat/namei_msdos.c2
-rw-r--r--fs/fat/namei_vfat.c4
-rw-r--r--fs/fuse/dev.c2
-rw-r--r--fs/fuse/dir.c3
-rw-r--r--fs/hfs/string.c2
-rw-r--r--fs/hfsplus/unicode.c2
-rw-r--r--fs/hpfs/dentry.c2
-rw-r--r--fs/isofs/inode.c14
-rw-r--r--fs/jffs2/dir.c8
-rw-r--r--fs/jffs2/readinode.c2
-rw-r--r--fs/jffs2/scan.c2
-rw-r--r--fs/jffs2/summary.c2
-rw-r--r--fs/jffs2/write.c4
-rw-r--r--fs/jfs/namei.c2
-rw-r--r--fs/kernfs/dir.c4
-rw-r--r--fs/logfs/dir.c6
-rw-r--r--fs/namei.c42
-rw-r--r--fs/ncpfs/dir.c2
-rw-r--r--fs/nfs/dir.c4
-rw-r--r--fs/ntfs/namei.c2
-rw-r--r--fs/ocfs2/dlm/dlmcommon.h2
-rw-r--r--fs/proc/proc_sysctl.c2
-rw-r--r--fs/sysv/namei.c2
-rw-r--r--include/linux/stringhash.h12
-rw-r--r--include/linux/sunrpc/svcauth.h4
-rw-r--r--lib/test_hash.c4
-rw-r--r--net/core/dev.c2
-rw-r--r--security/smack/smack_access.c4
-rw-r--r--security/tomoyo/memory.c2
-rw-r--r--security/tomoyo/util.c2
39 files changed, 107 insertions, 95 deletions
diff --git a/drivers/staging/lustre/lustre/llite/statahead.c b/drivers/staging/lustre/lustre/llite/statahead.c
index f77524294c27..8e52722266fe 100644
--- a/drivers/staging/lustre/lustre/llite/statahead.c
+++ b/drivers/staging/lustre/lustre/llite/statahead.c
@@ -170,7 +170,8 @@ static inline int is_omitted_entry(struct ll_statahead_info *sai, __u64 index)
170 * Insert it into sai_entries tail when init. 170 * Insert it into sai_entries tail when init.
171 */ 171 */
172static struct ll_sa_entry * 172static struct ll_sa_entry *
173ll_sa_entry_alloc(struct ll_statahead_info *sai, __u64 index, 173ll_sa_entry_alloc(struct dentry *parent,
174 struct ll_statahead_info *sai, __u64 index,
174 const char *name, int len) 175 const char *name, int len)
175{ 176{
176 struct ll_inode_info *lli; 177 struct ll_inode_info *lli;
@@ -217,7 +218,8 @@ ll_sa_entry_alloc(struct ll_statahead_info *sai, __u64 index,
217 dname = (char *)entry + sizeof(struct ll_sa_entry); 218 dname = (char *)entry + sizeof(struct ll_sa_entry);
218 memcpy(dname, name, len); 219 memcpy(dname, name, len);
219 dname[len] = 0; 220 dname[len] = 0;
220 entry->se_qstr.hash = full_name_hash(name, len); 221
222 entry->se_qstr.hash = full_name_hash(parent, name, len);
221 entry->se_qstr.len = len; 223 entry->se_qstr.len = len;
222 entry->se_qstr.name = dname; 224 entry->se_qstr.name = dname;
223 225
@@ -898,7 +900,7 @@ static void ll_statahead_one(struct dentry *parent, const char *entry_name,
898 int rc; 900 int rc;
899 int rc1; 901 int rc1;
900 902
901 entry = ll_sa_entry_alloc(sai, sai->sai_index, entry_name, 903 entry = ll_sa_entry_alloc(parent, sai, sai->sai_index, entry_name,
902 entry_name_len); 904 entry_name_len);
903 if (IS_ERR(entry)) 905 if (IS_ERR(entry))
904 return; 906 return;
diff --git a/fs/adfs/dir.c b/fs/adfs/dir.c
index fd4cf2c48e48..bec25f7017c0 100644
--- a/fs/adfs/dir.c
+++ b/fs/adfs/dir.c
@@ -207,7 +207,7 @@ adfs_hash(const struct dentry *parent, struct qstr *qstr)
207 */ 207 */
208 qstr->len = i = name_len; 208 qstr->len = i = name_len;
209 name = qstr->name; 209 name = qstr->name;
210 hash = init_name_hash(); 210 hash = init_name_hash(parent);
211 while (i--) { 211 while (i--) {
212 char c; 212 char c;
213 213
diff --git a/fs/affs/namei.c b/fs/affs/namei.c
index 00d3002a6780..eb32029bc776 100644
--- a/fs/affs/namei.c
+++ b/fs/affs/namei.c
@@ -61,7 +61,7 @@ affs_get_toupper(struct super_block *sb)
61 * Note: the dentry argument is the parent dentry. 61 * Note: the dentry argument is the parent dentry.
62 */ 62 */
63static inline int 63static inline int
64__affs_hash_dentry(struct qstr *qstr, toupper_t toupper, bool notruncate) 64__affs_hash_dentry(const struct dentry *dentry, struct qstr *qstr, toupper_t toupper, bool notruncate)
65{ 65{
66 const u8 *name = qstr->name; 66 const u8 *name = qstr->name;
67 unsigned long hash; 67 unsigned long hash;
@@ -72,7 +72,7 @@ __affs_hash_dentry(struct qstr *qstr, toupper_t toupper, bool notruncate)
72 if (retval) 72 if (retval)
73 return retval; 73 return retval;
74 74
75 hash = init_name_hash(); 75 hash = init_name_hash(dentry);
76 len = min(qstr->len, AFFSNAMEMAX); 76 len = min(qstr->len, AFFSNAMEMAX);
77 for (; len > 0; name++, len--) 77 for (; len > 0; name++, len--)
78 hash = partial_name_hash(toupper(*name), hash); 78 hash = partial_name_hash(toupper(*name), hash);
@@ -84,7 +84,7 @@ __affs_hash_dentry(struct qstr *qstr, toupper_t toupper, bool notruncate)
84static int 84static int
85affs_hash_dentry(const struct dentry *dentry, struct qstr *qstr) 85affs_hash_dentry(const struct dentry *dentry, struct qstr *qstr)
86{ 86{
87 return __affs_hash_dentry(qstr, affs_toupper, 87 return __affs_hash_dentry(dentry, qstr, affs_toupper,
88 affs_nofilenametruncate(dentry)); 88 affs_nofilenametruncate(dentry));
89 89
90} 90}
@@ -92,7 +92,7 @@ affs_hash_dentry(const struct dentry *dentry, struct qstr *qstr)
92static int 92static int
93affs_intl_hash_dentry(const struct dentry *dentry, struct qstr *qstr) 93affs_intl_hash_dentry(const struct dentry *dentry, struct qstr *qstr)
94{ 94{
95 return __affs_hash_dentry(qstr, affs_intl_toupper, 95 return __affs_hash_dentry(dentry, qstr, affs_intl_toupper,
96 affs_nofilenametruncate(dentry)); 96 affs_nofilenametruncate(dentry));
97 97
98} 98}
diff --git a/fs/autofs4/waitq.c b/fs/autofs4/waitq.c
index 631f1554c87b..708214457d16 100644
--- a/fs/autofs4/waitq.c
+++ b/fs/autofs4/waitq.c
@@ -398,7 +398,7 @@ int autofs4_wait(struct autofs_sb_info *sbi,
398 } 398 }
399 } 399 }
400 qstr.name = name; 400 qstr.name = name;
401 qstr.hash = full_name_hash(name, qstr.len); 401 qstr.hash = full_name_hash(dentry, name, qstr.len);
402 402
403 if (mutex_lock_interruptible(&sbi->wq_mutex)) { 403 if (mutex_lock_interruptible(&sbi->wq_mutex)) {
404 kfree(qstr.name); 404 kfree(qstr.name);
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c
index f059b5997072..99bdef66213a 100644
--- a/fs/ceph/inode.c
+++ b/fs/ceph/inode.c
@@ -1164,7 +1164,7 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req,
1164 1164
1165 dname.name = rinfo->dname; 1165 dname.name = rinfo->dname;
1166 dname.len = rinfo->dname_len; 1166 dname.len = rinfo->dname_len;
1167 dname.hash = full_name_hash(dname.name, dname.len); 1167 dname.hash = full_name_hash(parent, dname.name, dname.len);
1168 vino.ino = le64_to_cpu(rinfo->targeti.in->ino); 1168 vino.ino = le64_to_cpu(rinfo->targeti.in->ino);
1169 vino.snap = le64_to_cpu(rinfo->targeti.in->snapid); 1169 vino.snap = le64_to_cpu(rinfo->targeti.in->snapid);
1170retry_lookup: 1170retry_lookup:
@@ -1508,7 +1508,7 @@ int ceph_readdir_prepopulate(struct ceph_mds_request *req,
1508 1508
1509 dname.name = rde->name; 1509 dname.name = rde->name;
1510 dname.len = rde->name_len; 1510 dname.len = rde->name_len;
1511 dname.hash = full_name_hash(dname.name, dname.len); 1511 dname.hash = full_name_hash(parent, dname.name, dname.len);
1512 1512
1513 vino.ino = le64_to_cpu(rde->inode.in->ino); 1513 vino.ino = le64_to_cpu(rde->inode.in->ino);
1514 vino.snap = le64_to_cpu(rde->inode.in->snapid); 1514 vino.snap = le64_to_cpu(rde->inode.in->snapid);
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
index 2103b823bec0..4e8678a612b6 100644
--- a/fs/ceph/mds_client.c
+++ b/fs/ceph/mds_client.c
@@ -3204,7 +3204,7 @@ static void handle_lease(struct ceph_mds_client *mdsc,
3204 WARN_ON(1); 3204 WARN_ON(1);
3205 goto release; /* hrm... */ 3205 goto release; /* hrm... */
3206 } 3206 }
3207 dname.hash = full_name_hash(dname.name, dname.len); 3207 dname.hash = full_name_hash(parent, dname.name, dname.len);
3208 dentry = d_lookup(parent, &dname); 3208 dentry = d_lookup(parent, &dname);
3209 dput(parent); 3209 dput(parent);
3210 if (!dentry) 3210 if (!dentry)
diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c
index fb0903fffc22..5efd6f1fb8a5 100644
--- a/fs/cifs/dir.c
+++ b/fs/cifs/dir.c
@@ -856,7 +856,7 @@ static int cifs_ci_hash(const struct dentry *dentry, struct qstr *q)
856 wchar_t c; 856 wchar_t c;
857 int i, charlen; 857 int i, charlen;
858 858
859 hash = init_name_hash(); 859 hash = init_name_hash(dentry);
860 for (i = 0; i < q->len; i += charlen) { 860 for (i = 0; i < q->len; i += charlen) {
861 charlen = codepage->char2uni(&q->name[i], q->len - i, &c); 861 charlen = codepage->char2uni(&q->name[i], q->len - i, &c);
862 /* error out if we can't convert the character */ 862 /* error out if we can't convert the character */
diff --git a/fs/dcache.c b/fs/dcache.c
index d6847d7b123d..24bf27d66f6e 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
@@ -104,11 +104,9 @@ static unsigned int d_hash_shift __read_mostly;
104 104
105static struct hlist_bl_head *dentry_hashtable __read_mostly; 105static struct hlist_bl_head *dentry_hashtable __read_mostly;
106 106
107static inline struct hlist_bl_head *d_hash(const struct dentry *parent, 107static inline struct hlist_bl_head *d_hash(unsigned int hash)
108 unsigned int hash)
109{ 108{
110 hash += (unsigned long) parent / L1_CACHE_BYTES; 109 return dentry_hashtable + (hash >> (32 - d_hash_shift));
111 return dentry_hashtable + hash_32(hash, d_hash_shift);
112} 110}
113 111
114#define IN_LOOKUP_SHIFT 10 112#define IN_LOOKUP_SHIFT 10
@@ -488,7 +486,7 @@ void __d_drop(struct dentry *dentry)
488 if (unlikely(IS_ROOT(dentry))) 486 if (unlikely(IS_ROOT(dentry)))
489 b = &dentry->d_sb->s_anon; 487 b = &dentry->d_sb->s_anon;
490 else 488 else
491 b = d_hash(dentry->d_parent, dentry->d_name.hash); 489 b = d_hash(dentry->d_name.hash);
492 490
493 hlist_bl_lock(b); 491 hlist_bl_lock(b);
494 __hlist_bl_del(&dentry->d_hash); 492 __hlist_bl_del(&dentry->d_hash);
@@ -1716,7 +1714,7 @@ struct dentry *d_alloc_name(struct dentry *parent, const char *name)
1716 struct qstr q; 1714 struct qstr q;
1717 1715
1718 q.name = name; 1716 q.name = name;
1719 q.hash_len = hashlen_string(name); 1717 q.hash_len = hashlen_string(parent, name);
1720 return d_alloc(parent, &q); 1718 return d_alloc(parent, &q);
1721} 1719}
1722EXPORT_SYMBOL(d_alloc_name); 1720EXPORT_SYMBOL(d_alloc_name);
@@ -2140,7 +2138,7 @@ struct dentry *__d_lookup_rcu(const struct dentry *parent,
2140{ 2138{
2141 u64 hashlen = name->hash_len; 2139 u64 hashlen = name->hash_len;
2142 const unsigned char *str = name->name; 2140 const unsigned char *str = name->name;
2143 struct hlist_bl_head *b = d_hash(parent, hashlen_hash(hashlen)); 2141 struct hlist_bl_head *b = d_hash(hashlen_hash(hashlen));
2144 struct hlist_bl_node *node; 2142 struct hlist_bl_node *node;
2145 struct dentry *dentry; 2143 struct dentry *dentry;
2146 2144
@@ -2257,7 +2255,7 @@ struct dentry *__d_lookup(const struct dentry *parent, const struct qstr *name)
2257 unsigned int len = name->len; 2255 unsigned int len = name->len;
2258 unsigned int hash = name->hash; 2256 unsigned int hash = name->hash;
2259 const unsigned char *str = name->name; 2257 const unsigned char *str = name->name;
2260 struct hlist_bl_head *b = d_hash(parent, hash); 2258 struct hlist_bl_head *b = d_hash(hash);
2261 struct hlist_bl_node *node; 2259 struct hlist_bl_node *node;
2262 struct dentry *found = NULL; 2260 struct dentry *found = NULL;
2263 struct dentry *dentry; 2261 struct dentry *dentry;
@@ -2337,7 +2335,7 @@ struct dentry *d_hash_and_lookup(struct dentry *dir, struct qstr *name)
2337 * calculate the standard hash first, as the d_op->d_hash() 2335 * calculate the standard hash first, as the d_op->d_hash()
2338 * routine may choose to leave the hash value unchanged. 2336 * routine may choose to leave the hash value unchanged.
2339 */ 2337 */
2340 name->hash = full_name_hash(name->name, name->len); 2338 name->hash = full_name_hash(dir, name->name, name->len);
2341 if (dir->d_flags & DCACHE_OP_HASH) { 2339 if (dir->d_flags & DCACHE_OP_HASH) {
2342 int err = dir->d_op->d_hash(dir, name); 2340 int err = dir->d_op->d_hash(dir, name);
2343 if (unlikely(err < 0)) 2341 if (unlikely(err < 0))
@@ -2410,7 +2408,7 @@ static void __d_rehash(struct dentry * entry, struct hlist_bl_head *b)
2410 2408
2411static void _d_rehash(struct dentry * entry) 2409static void _d_rehash(struct dentry * entry)
2412{ 2410{
2413 __d_rehash(entry, d_hash(entry->d_parent, entry->d_name.hash)); 2411 __d_rehash(entry, d_hash(entry->d_name.hash));
2414} 2412}
2415 2413
2416/** 2414/**
@@ -2874,7 +2872,7 @@ static void __d_move(struct dentry *dentry, struct dentry *target,
2874 * for the same hash queue because of how unlikely it is. 2872 * for the same hash queue because of how unlikely it is.
2875 */ 2873 */
2876 __d_drop(dentry); 2874 __d_drop(dentry);
2877 __d_rehash(dentry, d_hash(target->d_parent, target->d_name.hash)); 2875 __d_rehash(dentry, d_hash(target->d_name.hash));
2878 2876
2879 /* 2877 /*
2880 * Unhash the target (d_delete() is not usable here). If exchanging 2878 * Unhash the target (d_delete() is not usable here). If exchanging
@@ -2882,8 +2880,7 @@ static void __d_move(struct dentry *dentry, struct dentry *target,
2882 */ 2880 */
2883 __d_drop(target); 2881 __d_drop(target);
2884 if (exchange) { 2882 if (exchange) {
2885 __d_rehash(target, 2883 __d_rehash(target, d_hash(dentry->d_name.hash));
2886 d_hash(dentry->d_parent, dentry->d_name.hash));
2887 } 2884 }
2888 2885
2889 /* Switch the names.. */ 2886 /* Switch the names.. */
diff --git a/fs/efivarfs/super.c b/fs/efivarfs/super.c
index 9cb54a38832d..a5e607e8f056 100644
--- a/fs/efivarfs/super.c
+++ b/fs/efivarfs/super.c
@@ -65,7 +65,7 @@ static int efivarfs_d_compare(const struct dentry *parent,
65 65
66static int efivarfs_d_hash(const struct dentry *dentry, struct qstr *qstr) 66static int efivarfs_d_hash(const struct dentry *dentry, struct qstr *qstr)
67{ 67{
68 unsigned long hash = init_name_hash(); 68 unsigned long hash = init_name_hash(dentry);
69 const unsigned char *s = qstr->name; 69 const unsigned char *s = qstr->name;
70 unsigned int len = qstr->len; 70 unsigned int len = qstr->len;
71 71
@@ -98,7 +98,7 @@ static struct dentry *efivarfs_alloc_dentry(struct dentry *parent, char *name)
98 q.name = name; 98 q.name = name;
99 q.len = strlen(name); 99 q.len = strlen(name);
100 100
101 err = efivarfs_d_hash(NULL, &q); 101 err = efivarfs_d_hash(parent, &q);
102 if (err) 102 if (err)
103 return ERR_PTR(err); 103 return ERR_PTR(err);
104 104
diff --git a/fs/fat/namei_msdos.c b/fs/fat/namei_msdos.c
index b7e2b33aa793..1337c0c7527d 100644
--- a/fs/fat/namei_msdos.c
+++ b/fs/fat/namei_msdos.c
@@ -154,7 +154,7 @@ static int msdos_hash(const struct dentry *dentry, struct qstr *qstr)
154 154
155 error = msdos_format_name(qstr->name, qstr->len, msdos_name, options); 155 error = msdos_format_name(qstr->name, qstr->len, msdos_name, options);
156 if (!error) 156 if (!error)
157 qstr->hash = full_name_hash(msdos_name, MSDOS_NAME); 157 qstr->hash = full_name_hash(dentry, msdos_name, MSDOS_NAME);
158 return 0; 158 return 0;
159} 159}
160 160
diff --git a/fs/fat/namei_vfat.c b/fs/fat/namei_vfat.c
index 7092584f424a..6ccdf3f34f90 100644
--- a/fs/fat/namei_vfat.c
+++ b/fs/fat/namei_vfat.c
@@ -107,7 +107,7 @@ static unsigned int vfat_striptail_len(const struct qstr *qstr)
107 */ 107 */
108static int vfat_hash(const struct dentry *dentry, struct qstr *qstr) 108static int vfat_hash(const struct dentry *dentry, struct qstr *qstr)
109{ 109{
110 qstr->hash = full_name_hash(qstr->name, vfat_striptail_len(qstr)); 110 qstr->hash = full_name_hash(dentry, qstr->name, vfat_striptail_len(qstr));
111 return 0; 111 return 0;
112} 112}
113 113
@@ -127,7 +127,7 @@ static int vfat_hashi(const struct dentry *dentry, struct qstr *qstr)
127 name = qstr->name; 127 name = qstr->name;
128 len = vfat_striptail_len(qstr); 128 len = vfat_striptail_len(qstr);
129 129
130 hash = init_name_hash(); 130 hash = init_name_hash(dentry);
131 while (len--) 131 while (len--)
132 hash = partial_name_hash(nls_tolower(t, *name++), hash); 132 hash = partial_name_hash(nls_tolower(t, *name++), hash);
133 qstr->hash = end_name_hash(hash); 133 qstr->hash = end_name_hash(hash);
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
index cbece1221417..203adf3b75db 100644
--- a/fs/fuse/dev.c
+++ b/fs/fuse/dev.c
@@ -1525,7 +1525,6 @@ static int fuse_notify_inval_entry(struct fuse_conn *fc, unsigned int size,
1525 goto err; 1525 goto err;
1526 fuse_copy_finish(cs); 1526 fuse_copy_finish(cs);
1527 buf[outarg.namelen] = 0; 1527 buf[outarg.namelen] = 0;
1528 name.hash = full_name_hash(name.name, name.len);
1529 1528
1530 down_read(&fc->killsb); 1529 down_read(&fc->killsb);
1531 err = -ENOENT; 1530 err = -ENOENT;
@@ -1576,7 +1575,6 @@ static int fuse_notify_delete(struct fuse_conn *fc, unsigned int size,
1576 goto err; 1575 goto err;
1577 fuse_copy_finish(cs); 1576 fuse_copy_finish(cs);
1578 buf[outarg.namelen] = 0; 1577 buf[outarg.namelen] = 0;
1579 name.hash = full_name_hash(name.name, name.len);
1580 1578
1581 down_read(&fc->killsb); 1579 down_read(&fc->killsb);
1582 err = -ENOENT; 1580 err = -ENOENT;
diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c
index cca7b048c07b..5f1627725791 100644
--- a/fs/fuse/dir.c
+++ b/fs/fuse/dir.c
@@ -955,6 +955,7 @@ int fuse_reverse_inval_entry(struct super_block *sb, u64 parent_nodeid,
955 if (!dir) 955 if (!dir)
956 goto unlock; 956 goto unlock;
957 957
958 name->hash = full_name_hash(dir, name->name, name->len);
958 entry = d_lookup(dir, name); 959 entry = d_lookup(dir, name);
959 dput(dir); 960 dput(dir);
960 if (!entry) 961 if (!entry)
@@ -1204,7 +1205,7 @@ static int fuse_direntplus_link(struct file *file,
1204 1205
1205 fc = get_fuse_conn(dir); 1206 fc = get_fuse_conn(dir);
1206 1207
1207 name.hash = full_name_hash(name.name, name.len); 1208 name.hash = full_name_hash(parent, name.name, name.len);
1208 dentry = d_lookup(parent, &name); 1209 dentry = d_lookup(parent, &name);
1209 if (!dentry) { 1210 if (!dentry) {
1210retry: 1211retry:
diff --git a/fs/hfs/string.c b/fs/hfs/string.c
index 85b610c3909f..ec9f164c35a5 100644
--- a/fs/hfs/string.c
+++ b/fs/hfs/string.c
@@ -59,7 +59,7 @@ int hfs_hash_dentry(const struct dentry *dentry, struct qstr *this)
59 if (len > HFS_NAMELEN) 59 if (len > HFS_NAMELEN)
60 len = HFS_NAMELEN; 60 len = HFS_NAMELEN;
61 61
62 hash = init_name_hash(); 62 hash = init_name_hash(dentry);
63 for (; len; len--) 63 for (; len; len--)
64 hash = partial_name_hash(caseorder[*name++], hash); 64 hash = partial_name_hash(caseorder[*name++], hash);
65 this->hash = end_name_hash(hash); 65 this->hash = end_name_hash(hash);
diff --git a/fs/hfsplus/unicode.c b/fs/hfsplus/unicode.c
index e8ef121a4d8b..c13c8a240be3 100644
--- a/fs/hfsplus/unicode.c
+++ b/fs/hfsplus/unicode.c
@@ -346,7 +346,7 @@ int hfsplus_hash_dentry(const struct dentry *dentry, struct qstr *str)
346 346
347 casefold = test_bit(HFSPLUS_SB_CASEFOLD, &HFSPLUS_SB(sb)->flags); 347 casefold = test_bit(HFSPLUS_SB_CASEFOLD, &HFSPLUS_SB(sb)->flags);
348 decompose = !test_bit(HFSPLUS_SB_NODECOMPOSE, &HFSPLUS_SB(sb)->flags); 348 decompose = !test_bit(HFSPLUS_SB_NODECOMPOSE, &HFSPLUS_SB(sb)->flags);
349 hash = init_name_hash(); 349 hash = init_name_hash(dentry);
350 astr = str->name; 350 astr = str->name;
351 len = str->len; 351 len = str->len;
352 while (len > 0) { 352 while (len > 0) {
diff --git a/fs/hpfs/dentry.c b/fs/hpfs/dentry.c
index fa27980f2229..60e6d334d79a 100644
--- a/fs/hpfs/dentry.c
+++ b/fs/hpfs/dentry.c
@@ -26,7 +26,7 @@ static int hpfs_hash_dentry(const struct dentry *dentry, struct qstr *qstr)
26 /*return -ENOENT;*/ 26 /*return -ENOENT;*/
27 x: 27 x:
28 28
29 hash = init_name_hash(); 29 hash = init_name_hash(dentry);
30 for (i = 0; i < l; i++) 30 for (i = 0; i < l; i++)
31 hash = partial_name_hash(hpfs_upcase(hpfs_sb(dentry->d_sb)->sb_cp_table,qstr->name[i]), hash); 31 hash = partial_name_hash(hpfs_upcase(hpfs_sb(dentry->d_sb)->sb_cp_table,qstr->name[i]), hash);
32 qstr->hash = end_name_hash(hash); 32 qstr->hash = end_name_hash(hash);
diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c
index 131dedc920d8..761fade7680f 100644
--- a/fs/isofs/inode.c
+++ b/fs/isofs/inode.c
@@ -174,7 +174,7 @@ struct iso9660_options{
174 * Compute the hash for the isofs name corresponding to the dentry. 174 * Compute the hash for the isofs name corresponding to the dentry.
175 */ 175 */
176static int 176static int
177isofs_hashi_common(struct qstr *qstr, int ms) 177isofs_hashi_common(const struct dentry *dentry, struct qstr *qstr, int ms)
178{ 178{
179 const char *name; 179 const char *name;
180 int len; 180 int len;
@@ -188,7 +188,7 @@ isofs_hashi_common(struct qstr *qstr, int ms)
188 len--; 188 len--;
189 } 189 }
190 190
191 hash = init_name_hash(); 191 hash = init_name_hash(dentry);
192 while (len--) { 192 while (len--) {
193 c = tolower(*name++); 193 c = tolower(*name++);
194 hash = partial_name_hash(c, hash); 194 hash = partial_name_hash(c, hash);
@@ -231,7 +231,7 @@ static int isofs_dentry_cmp_common(
231static int 231static int
232isofs_hashi(const struct dentry *dentry, struct qstr *qstr) 232isofs_hashi(const struct dentry *dentry, struct qstr *qstr)
233{ 233{
234 return isofs_hashi_common(qstr, 0); 234 return isofs_hashi_common(dentry, qstr, 0);
235} 235}
236 236
237static int 237static int
@@ -246,7 +246,7 @@ isofs_dentry_cmpi(const struct dentry *parent, const struct dentry *dentry,
246 * Compute the hash for the isofs name corresponding to the dentry. 246 * Compute the hash for the isofs name corresponding to the dentry.
247 */ 247 */
248static int 248static int
249isofs_hash_common(struct qstr *qstr, int ms) 249isofs_hash_common(const struct dentry *dentry, struct qstr *qstr, int ms)
250{ 250{
251 const char *name; 251 const char *name;
252 int len; 252 int len;
@@ -258,7 +258,7 @@ isofs_hash_common(struct qstr *qstr, int ms)
258 len--; 258 len--;
259 } 259 }
260 260
261 qstr->hash = full_name_hash(name, len); 261 qstr->hash = full_name_hash(dentry, name, len);
262 262
263 return 0; 263 return 0;
264} 264}
@@ -266,13 +266,13 @@ isofs_hash_common(struct qstr *qstr, int ms)
266static int 266static int
267isofs_hash_ms(const struct dentry *dentry, struct qstr *qstr) 267isofs_hash_ms(const struct dentry *dentry, struct qstr *qstr)
268{ 268{
269 return isofs_hash_common(qstr, 1); 269 return isofs_hash_common(dentry, qstr, 1);
270} 270}
271 271
272static int 272static int
273isofs_hashi_ms(const struct dentry *dentry, struct qstr *qstr) 273isofs_hashi_ms(const struct dentry *dentry, struct qstr *qstr)
274{ 274{
275 return isofs_hashi_common(qstr, 1); 275 return isofs_hashi_common(dentry, qstr, 1);
276} 276}
277 277
278static int 278static int
diff --git a/fs/jffs2/dir.c b/fs/jffs2/dir.c
index 84c4bf3631a2..30eb33ff8189 100644
--- a/fs/jffs2/dir.c
+++ b/fs/jffs2/dir.c
@@ -81,6 +81,7 @@ static struct dentry *jffs2_lookup(struct inode *dir_i, struct dentry *target,
81 struct jffs2_full_dirent *fd = NULL, *fd_list; 81 struct jffs2_full_dirent *fd = NULL, *fd_list;
82 uint32_t ino = 0; 82 uint32_t ino = 0;
83 struct inode *inode = NULL; 83 struct inode *inode = NULL;
84 unsigned int nhash;
84 85
85 jffs2_dbg(1, "jffs2_lookup()\n"); 86 jffs2_dbg(1, "jffs2_lookup()\n");
86 87
@@ -89,11 +90,14 @@ static struct dentry *jffs2_lookup(struct inode *dir_i, struct dentry *target,
89 90
90 dir_f = JFFS2_INODE_INFO(dir_i); 91 dir_f = JFFS2_INODE_INFO(dir_i);
91 92
93 /* The 'nhash' on the fd_list is not the same as the dentry hash */
94 nhash = full_name_hash(NULL, target->d_name.name, target->d_name.len);
95
92 mutex_lock(&dir_f->sem); 96 mutex_lock(&dir_f->sem);
93 97
94 /* NB: The 2.2 backport will need to explicitly check for '.' and '..' here */ 98 /* NB: The 2.2 backport will need to explicitly check for '.' and '..' here */
95 for (fd_list = dir_f->dents; fd_list && fd_list->nhash <= target->d_name.hash; fd_list = fd_list->next) { 99 for (fd_list = dir_f->dents; fd_list && fd_list->nhash <= nhash; fd_list = fd_list->next) {
96 if (fd_list->nhash == target->d_name.hash && 100 if (fd_list->nhash == nhash &&
97 (!fd || fd_list->version > fd->version) && 101 (!fd || fd_list->version > fd->version) &&
98 strlen(fd_list->name) == target->d_name.len && 102 strlen(fd_list->name) == target->d_name.len &&
99 !strncmp(fd_list->name, target->d_name.name, target->d_name.len)) { 103 !strncmp(fd_list->name, target->d_name.name, target->d_name.len)) {
diff --git a/fs/jffs2/readinode.c b/fs/jffs2/readinode.c
index bfebbf13698c..06a71dbd4833 100644
--- a/fs/jffs2/readinode.c
+++ b/fs/jffs2/readinode.c
@@ -674,7 +674,7 @@ static inline int read_direntry(struct jffs2_sb_info *c, struct jffs2_raw_node_r
674 } 674 }
675 } 675 }
676 676
677 fd->nhash = full_name_hash(fd->name, rd->nsize); 677 fd->nhash = full_name_hash(NULL, fd->name, rd->nsize);
678 fd->next = NULL; 678 fd->next = NULL;
679 fd->name[rd->nsize] = '\0'; 679 fd->name[rd->nsize] = '\0';
680 680
diff --git a/fs/jffs2/scan.c b/fs/jffs2/scan.c
index 9ad5ba4b299b..90431dd613b8 100644
--- a/fs/jffs2/scan.c
+++ b/fs/jffs2/scan.c
@@ -1100,7 +1100,7 @@ static int jffs2_scan_dirent_node(struct jffs2_sb_info *c, struct jffs2_eraseblo
1100 fd->next = NULL; 1100 fd->next = NULL;
1101 fd->version = je32_to_cpu(rd->version); 1101 fd->version = je32_to_cpu(rd->version);
1102 fd->ino = je32_to_cpu(rd->ino); 1102 fd->ino = je32_to_cpu(rd->ino);
1103 fd->nhash = full_name_hash(fd->name, checkedlen); 1103 fd->nhash = full_name_hash(NULL, fd->name, checkedlen);
1104 fd->type = rd->type; 1104 fd->type = rd->type;
1105 jffs2_add_fd_to_list(c, fd, &ic->scan_dents); 1105 jffs2_add_fd_to_list(c, fd, &ic->scan_dents);
1106 1106
diff --git a/fs/jffs2/summary.c b/fs/jffs2/summary.c
index bc5385471a6e..be7c8a6a5748 100644
--- a/fs/jffs2/summary.c
+++ b/fs/jffs2/summary.c
@@ -476,7 +476,7 @@ static int jffs2_sum_process_sum_data(struct jffs2_sb_info *c, struct jffs2_eras
476 fd->next = NULL; 476 fd->next = NULL;
477 fd->version = je32_to_cpu(spd->version); 477 fd->version = je32_to_cpu(spd->version);
478 fd->ino = je32_to_cpu(spd->ino); 478 fd->ino = je32_to_cpu(spd->ino);
479 fd->nhash = full_name_hash(fd->name, checkedlen); 479 fd->nhash = full_name_hash(NULL, fd->name, checkedlen);
480 fd->type = spd->type; 480 fd->type = spd->type;
481 481
482 jffs2_add_fd_to_list(c, fd, &ic->scan_dents); 482 jffs2_add_fd_to_list(c, fd, &ic->scan_dents);
diff --git a/fs/jffs2/write.c b/fs/jffs2/write.c
index 7fb187ab2682..cda9a361368e 100644
--- a/fs/jffs2/write.c
+++ b/fs/jffs2/write.c
@@ -245,7 +245,7 @@ struct jffs2_full_dirent *jffs2_write_dirent(struct jffs2_sb_info *c, struct jff
245 245
246 fd->version = je32_to_cpu(rd->version); 246 fd->version = je32_to_cpu(rd->version);
247 fd->ino = je32_to_cpu(rd->ino); 247 fd->ino = je32_to_cpu(rd->ino);
248 fd->nhash = full_name_hash(name, namelen); 248 fd->nhash = full_name_hash(NULL, name, namelen);
249 fd->type = rd->type; 249 fd->type = rd->type;
250 memcpy(fd->name, name, namelen); 250 memcpy(fd->name, name, namelen);
251 fd->name[namelen]=0; 251 fd->name[namelen]=0;
@@ -598,7 +598,7 @@ int jffs2_do_unlink(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f,
598 jffs2_add_fd_to_list(c, fd, &dir_f->dents); 598 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
599 mutex_unlock(&dir_f->sem); 599 mutex_unlock(&dir_f->sem);
600 } else { 600 } else {
601 uint32_t nhash = full_name_hash(name, namelen); 601 uint32_t nhash = full_name_hash(NULL, name, namelen);
602 602
603 fd = dir_f->dents; 603 fd = dir_f->dents;
604 /* We don't actually want to reserve any space, but we do 604 /* We don't actually want to reserve any space, but we do
diff --git a/fs/jfs/namei.c b/fs/jfs/namei.c
index 539deddecbb0..04baf0dfc40c 100644
--- a/fs/jfs/namei.c
+++ b/fs/jfs/namei.c
@@ -1564,7 +1564,7 @@ static int jfs_ci_hash(const struct dentry *dir, struct qstr *this)
1564 unsigned long hash; 1564 unsigned long hash;
1565 int i; 1565 int i;
1566 1566
1567 hash = init_name_hash(); 1567 hash = init_name_hash(dir);
1568 for (i=0; i < this->len; i++) 1568 for (i=0; i < this->len; i++)
1569 hash = partial_name_hash(tolower(this->name[i]), hash); 1569 hash = partial_name_hash(tolower(this->name[i]), hash);
1570 this->hash = end_name_hash(hash); 1570 this->hash = end_name_hash(hash);
diff --git a/fs/kernfs/dir.c b/fs/kernfs/dir.c
index 8a652404eef6..e57174d43683 100644
--- a/fs/kernfs/dir.c
+++ b/fs/kernfs/dir.c
@@ -336,11 +336,11 @@ struct kernfs_node *kernfs_get_parent(struct kernfs_node *kn)
336 */ 336 */
337static unsigned int kernfs_name_hash(const char *name, const void *ns) 337static unsigned int kernfs_name_hash(const char *name, const void *ns)
338{ 338{
339 unsigned long hash = init_name_hash(); 339 unsigned long hash = init_name_hash(ns);
340 unsigned int len = strlen(name); 340 unsigned int len = strlen(name);
341 while (len--) 341 while (len--)
342 hash = partial_name_hash(*name++, hash); 342 hash = partial_name_hash(*name++, hash);
343 hash = (end_name_hash(hash) ^ hash_ptr((void *)ns, 31)); 343 hash = end_name_hash(hash);
344 hash &= 0x7fffffffU; 344 hash &= 0x7fffffffU;
345 /* Reserve hash numbers 0, 1 and INT_MAX for magic directory entries */ 345 /* Reserve hash numbers 0, 1 and INT_MAX for magic directory entries */
346 if (hash < 2) 346 if (hash < 2)
diff --git a/fs/logfs/dir.c b/fs/logfs/dir.c
index 2d5336bd4efd..bcd754d216bd 100644
--- a/fs/logfs/dir.c
+++ b/fs/logfs/dir.c
@@ -95,7 +95,7 @@ static int beyond_eof(struct inode *inode, loff_t bix)
95 * of each character and pick a prime nearby, preferably a bit-sparse 95 * of each character and pick a prime nearby, preferably a bit-sparse
96 * one. 96 * one.
97 */ 97 */
98static u32 hash_32(const char *s, int len, u32 seed) 98static u32 logfs_hash_32(const char *s, int len, u32 seed)
99{ 99{
100 u32 hash = seed; 100 u32 hash = seed;
101 int i; 101 int i;
@@ -159,7 +159,7 @@ static struct page *logfs_get_dd_page(struct inode *dir, struct dentry *dentry)
159 struct qstr *name = &dentry->d_name; 159 struct qstr *name = &dentry->d_name;
160 struct page *page; 160 struct page *page;
161 struct logfs_disk_dentry *dd; 161 struct logfs_disk_dentry *dd;
162 u32 hash = hash_32(name->name, name->len, 0); 162 u32 hash = logfs_hash_32(name->name, name->len, 0);
163 pgoff_t index; 163 pgoff_t index;
164 int round; 164 int round;
165 165
@@ -370,7 +370,7 @@ static int logfs_write_dir(struct inode *dir, struct dentry *dentry,
370{ 370{
371 struct page *page; 371 struct page *page;
372 struct logfs_disk_dentry *dd; 372 struct logfs_disk_dentry *dd;
373 u32 hash = hash_32(dentry->d_name.name, dentry->d_name.len, 0); 373 u32 hash = logfs_hash_32(dentry->d_name.name, dentry->d_name.len, 0);
374 pgoff_t index; 374 pgoff_t index;
375 int round, err; 375 int round, err;
376 376
diff --git a/fs/namei.c b/fs/namei.c
index 70580ab1445c..7cb9be3e200a 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -1890,9 +1890,9 @@ static inline unsigned int fold_hash(unsigned long x, unsigned long y)
1890 * payload bytes, to match the way that hash_name() iterates until it 1890 * payload bytes, to match the way that hash_name() iterates until it
1891 * finds the delimiter after the name. 1891 * finds the delimiter after the name.
1892 */ 1892 */
1893unsigned int full_name_hash(const char *name, unsigned int len) 1893unsigned int full_name_hash(const void *salt, const char *name, unsigned int len)
1894{ 1894{
1895 unsigned long a, x = 0, y = 0; 1895 unsigned long a, x = 0, y = (unsigned long)salt;
1896 1896
1897 for (;;) { 1897 for (;;) {
1898 if (!len) 1898 if (!len)
@@ -1911,15 +1911,19 @@ done:
1911EXPORT_SYMBOL(full_name_hash); 1911EXPORT_SYMBOL(full_name_hash);
1912 1912
1913/* Return the "hash_len" (hash and length) of a null-terminated string */ 1913/* Return the "hash_len" (hash and length) of a null-terminated string */
1914u64 hashlen_string(const char *name) 1914u64 hashlen_string(const void *salt, const char *name)
1915{ 1915{
1916 unsigned long a = 0, x = 0, y = 0, adata, mask, len; 1916 unsigned long a = 0, x = 0, y = (unsigned long)salt;
1917 unsigned long adata, mask, len;
1917 const struct word_at_a_time constants = WORD_AT_A_TIME_CONSTANTS; 1918 const struct word_at_a_time constants = WORD_AT_A_TIME_CONSTANTS;
1918 1919
1919 len = -sizeof(unsigned long); 1920 len = 0;
1921 goto inside;
1922
1920 do { 1923 do {
1921 HASH_MIX(x, y, a); 1924 HASH_MIX(x, y, a);
1922 len += sizeof(unsigned long); 1925 len += sizeof(unsigned long);
1926inside:
1923 a = load_unaligned_zeropad(name+len); 1927 a = load_unaligned_zeropad(name+len);
1924 } while (!has_zero(a, &adata, &constants)); 1928 } while (!has_zero(a, &adata, &constants));
1925 1929
@@ -1935,15 +1939,19 @@ EXPORT_SYMBOL(hashlen_string);
1935 * Calculate the length and hash of the path component, and 1939 * Calculate the length and hash of the path component, and
1936 * return the "hash_len" as the result. 1940 * return the "hash_len" as the result.
1937 */ 1941 */
1938static inline u64 hash_name(const char *name) 1942static inline u64 hash_name(const void *salt, const char *name)
1939{ 1943{
1940 unsigned long a = 0, b, x = 0, y = 0, adata, bdata, mask, len; 1944 unsigned long a = 0, b, x = 0, y = (unsigned long)salt;
1945 unsigned long adata, bdata, mask, len;
1941 const struct word_at_a_time constants = WORD_AT_A_TIME_CONSTANTS; 1946 const struct word_at_a_time constants = WORD_AT_A_TIME_CONSTANTS;
1942 1947
1943 len = -sizeof(unsigned long); 1948 len = 0;
1949 goto inside;
1950
1944 do { 1951 do {
1945 HASH_MIX(x, y, a); 1952 HASH_MIX(x, y, a);
1946 len += sizeof(unsigned long); 1953 len += sizeof(unsigned long);
1954inside:
1947 a = load_unaligned_zeropad(name+len); 1955 a = load_unaligned_zeropad(name+len);
1948 b = a ^ REPEAT_BYTE('/'); 1956 b = a ^ REPEAT_BYTE('/');
1949 } while (!(has_zero(a, &adata, &constants) | has_zero(b, &bdata, &constants))); 1957 } while (!(has_zero(a, &adata, &constants) | has_zero(b, &bdata, &constants)));
@@ -1959,9 +1967,9 @@ static inline u64 hash_name(const char *name)
1959#else /* !CONFIG_DCACHE_WORD_ACCESS: Slow, byte-at-a-time version */ 1967#else /* !CONFIG_DCACHE_WORD_ACCESS: Slow, byte-at-a-time version */
1960 1968
1961/* Return the hash of a string of known length */ 1969/* Return the hash of a string of known length */
1962unsigned int full_name_hash(const char *name, unsigned int len) 1970unsigned int full_name_hash(const void *salt, const char *name, unsigned int len)
1963{ 1971{
1964 unsigned long hash = init_name_hash(); 1972 unsigned long hash = init_name_hash(salt);
1965 while (len--) 1973 while (len--)
1966 hash = partial_name_hash((unsigned char)*name++, hash); 1974 hash = partial_name_hash((unsigned char)*name++, hash);
1967 return end_name_hash(hash); 1975 return end_name_hash(hash);
@@ -1969,9 +1977,9 @@ unsigned int full_name_hash(const char *name, unsigned int len)
1969EXPORT_SYMBOL(full_name_hash); 1977EXPORT_SYMBOL(full_name_hash);
1970 1978
1971/* Return the "hash_len" (hash and length) of a null-terminated string */ 1979/* Return the "hash_len" (hash and length) of a null-terminated string */
1972u64 hashlen_string(const char *name) 1980u64 hashlen_string(const void *salt, const char *name)
1973{ 1981{
1974 unsigned long hash = init_name_hash(); 1982 unsigned long hash = init_name_hash(salt);
1975 unsigned long len = 0, c; 1983 unsigned long len = 0, c;
1976 1984
1977 c = (unsigned char)*name; 1985 c = (unsigned char)*name;
@@ -1988,9 +1996,9 @@ EXPORT_SYMBOL(hashlen_string);
1988 * We know there's a real path component here of at least 1996 * We know there's a real path component here of at least
1989 * one character. 1997 * one character.
1990 */ 1998 */
1991static inline u64 hash_name(const char *name) 1999static inline u64 hash_name(const void *salt, const char *name)
1992{ 2000{
1993 unsigned long hash = init_name_hash(); 2001 unsigned long hash = init_name_hash(salt);
1994 unsigned long len = 0, c; 2002 unsigned long len = 0, c;
1995 2003
1996 c = (unsigned char)*name; 2004 c = (unsigned char)*name;
@@ -2030,7 +2038,7 @@ static int link_path_walk(const char *name, struct nameidata *nd)
2030 if (err) 2038 if (err)
2031 return err; 2039 return err;
2032 2040
2033 hash_len = hash_name(name); 2041 hash_len = hash_name(nd->path.dentry, name);
2034 2042
2035 type = LAST_NORM; 2043 type = LAST_NORM;
2036 if (name[0] == '.') switch (hashlen_len(hash_len)) { 2044 if (name[0] == '.') switch (hashlen_len(hash_len)) {
@@ -2436,7 +2444,7 @@ struct dentry *lookup_one_len(const char *name, struct dentry *base, int len)
2436 2444
2437 this.name = name; 2445 this.name = name;
2438 this.len = len; 2446 this.len = len;
2439 this.hash = full_name_hash(name, len); 2447 this.hash = full_name_hash(base, name, len);
2440 if (!len) 2448 if (!len)
2441 return ERR_PTR(-EACCES); 2449 return ERR_PTR(-EACCES);
2442 2450
@@ -2489,7 +2497,7 @@ struct dentry *lookup_one_len_unlocked(const char *name,
2489 2497
2490 this.name = name; 2498 this.name = name;
2491 this.len = len; 2499 this.len = len;
2492 this.hash = full_name_hash(name, len); 2500 this.hash = full_name_hash(base, name, len);
2493 if (!len) 2501 if (!len)
2494 return ERR_PTR(-EACCES); 2502 return ERR_PTR(-EACCES);
2495 2503
diff --git a/fs/ncpfs/dir.c b/fs/ncpfs/dir.c
index bfdad003ee56..9add7ab747a5 100644
--- a/fs/ncpfs/dir.c
+++ b/fs/ncpfs/dir.c
@@ -139,7 +139,7 @@ ncp_hash_dentry(const struct dentry *dentry, struct qstr *this)
139 int i; 139 int i;
140 140
141 t = NCP_IO_TABLE(sb); 141 t = NCP_IO_TABLE(sb);
142 hash = init_name_hash(); 142 hash = init_name_hash(dentry);
143 for (i=0; i<this->len ; i++) 143 for (i=0; i<this->len ; i++)
144 hash = partial_name_hash(ncp_tolower(t, this->name[i]), 144 hash = partial_name_hash(ncp_tolower(t, this->name[i]),
145 hash); 145 hash);
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
index 19d93d0cd400..411375f3c585 100644
--- a/fs/nfs/dir.c
+++ b/fs/nfs/dir.c
@@ -232,7 +232,7 @@ int nfs_readdir_make_qstr(struct qstr *string, const char *name, unsigned int le
232 * in a page cache page which kmemleak does not scan. 232 * in a page cache page which kmemleak does not scan.
233 */ 233 */
234 kmemleak_not_leak(string->name); 234 kmemleak_not_leak(string->name);
235 string->hash = full_name_hash(name, len); 235 string->hash = full_name_hash(NULL, name, len);
236 return 0; 236 return 0;
237} 237}
238 238
@@ -502,7 +502,7 @@ void nfs_prime_dcache(struct dentry *parent, struct nfs_entry *entry)
502 if (filename.len == 2 && filename.name[1] == '.') 502 if (filename.len == 2 && filename.name[1] == '.')
503 return; 503 return;
504 } 504 }
505 filename.hash = full_name_hash(filename.name, filename.len); 505 filename.hash = full_name_hash(parent, filename.name, filename.len);
506 506
507 dentry = d_lookup(parent, &filename); 507 dentry = d_lookup(parent, &filename);
508again: 508again:
diff --git a/fs/ntfs/namei.c b/fs/ntfs/namei.c
index 443abecf01b7..358258364616 100644
--- a/fs/ntfs/namei.c
+++ b/fs/ntfs/namei.c
@@ -253,7 +253,7 @@ handle_name:
253 err = (signed)nls_name.len; 253 err = (signed)nls_name.len;
254 goto err_out; 254 goto err_out;
255 } 255 }
256 nls_name.hash = full_name_hash(nls_name.name, nls_name.len); 256 nls_name.hash = full_name_hash(dent, nls_name.name, nls_name.len);
257 257
258 dent = d_add_ci(dent, dent_inode, &nls_name); 258 dent = d_add_ci(dent, dent_inode, &nls_name);
259 kfree(nls_name.name); 259 kfree(nls_name.name);
diff --git a/fs/ocfs2/dlm/dlmcommon.h b/fs/ocfs2/dlm/dlmcommon.h
index 004f2cbe8f71..8107d0d0c3f6 100644
--- a/fs/ocfs2/dlm/dlmcommon.h
+++ b/fs/ocfs2/dlm/dlmcommon.h
@@ -47,7 +47,7 @@
47#define DLM_HASH_BUCKETS (DLM_HASH_PAGES * DLM_BUCKETS_PER_PAGE) 47#define DLM_HASH_BUCKETS (DLM_HASH_PAGES * DLM_BUCKETS_PER_PAGE)
48 48
49/* Intended to make it easier for us to switch out hash functions */ 49/* Intended to make it easier for us to switch out hash functions */
50#define dlm_lockid_hash(_n, _l) full_name_hash(_n, _l) 50#define dlm_lockid_hash(_n, _l) full_name_hash(NULL, _n, _l)
51 51
52enum dlm_mle_type { 52enum dlm_mle_type {
53 DLM_MLE_BLOCK = 0, 53 DLM_MLE_BLOCK = 0,
diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c
index 5e57c3e46e1d..b59db94d2ff4 100644
--- a/fs/proc/proc_sysctl.c
+++ b/fs/proc/proc_sysctl.c
@@ -623,7 +623,7 @@ static bool proc_sys_fill_cache(struct file *file,
623 623
624 qname.name = table->procname; 624 qname.name = table->procname;
625 qname.len = strlen(table->procname); 625 qname.len = strlen(table->procname);
626 qname.hash = full_name_hash(qname.name, qname.len); 626 qname.hash = full_name_hash(dir, qname.name, qname.len);
627 627
628 child = d_lookup(dir, &qname); 628 child = d_lookup(dir, &qname);
629 if (!child) { 629 if (!child) {
diff --git a/fs/sysv/namei.c b/fs/sysv/namei.c
index 90b60c03b588..a42de45ce40d 100644
--- a/fs/sysv/namei.c
+++ b/fs/sysv/namei.c
@@ -33,7 +33,7 @@ static int sysv_hash(const struct dentry *dentry, struct qstr *qstr)
33 function. */ 33 function. */
34 if (qstr->len > SYSV_NAMELEN) { 34 if (qstr->len > SYSV_NAMELEN) {
35 qstr->len = SYSV_NAMELEN; 35 qstr->len = SYSV_NAMELEN;
36 qstr->hash = full_name_hash(qstr->name, qstr->len); 36 qstr->hash = full_name_hash(dentry, qstr->name, qstr->len);
37 } 37 }
38 return 0; 38 return 0;
39} 39}
diff --git a/include/linux/stringhash.h b/include/linux/stringhash.h
index 451771d9b9c0..7c2d95170d01 100644
--- a/include/linux/stringhash.h
+++ b/include/linux/stringhash.h
@@ -3,6 +3,7 @@
3 3
4#include <linux/compiler.h> /* For __pure */ 4#include <linux/compiler.h> /* For __pure */
5#include <linux/types.h> /* For u32, u64 */ 5#include <linux/types.h> /* For u32, u64 */
6#include <linux/hash.h>
6 7
7/* 8/*
8 * Routines for hashing strings of bytes to a 32-bit hash value. 9 * Routines for hashing strings of bytes to a 32-bit hash value.
@@ -34,7 +35,7 @@
34 */ 35 */
35 36
36/* Hash courtesy of the R5 hash in reiserfs modulo sign bits */ 37/* Hash courtesy of the R5 hash in reiserfs modulo sign bits */
37#define init_name_hash() 0 38#define init_name_hash(salt) (unsigned long)(salt)
38 39
39/* partial hash update function. Assume roughly 4 bits per character */ 40/* partial hash update function. Assume roughly 4 bits per character */
40static inline unsigned long 41static inline unsigned long
@@ -45,11 +46,12 @@ partial_name_hash(unsigned long c, unsigned long prevhash)
45 46
46/* 47/*
47 * Finally: cut down the number of bits to a int value (and try to avoid 48 * Finally: cut down the number of bits to a int value (and try to avoid
48 * losing bits) 49 * losing bits). This also has the property (wanted by the dcache)
50 * that the msbits make a good hash table index.
49 */ 51 */
50static inline unsigned long end_name_hash(unsigned long hash) 52static inline unsigned long end_name_hash(unsigned long hash)
51{ 53{
52 return (unsigned int)hash; 54 return __hash_32((unsigned int)hash);
53} 55}
54 56
55/* 57/*
@@ -60,7 +62,7 @@ static inline unsigned long end_name_hash(unsigned long hash)
60 * 62 *
61 * If not set, this falls back to a wrapper around the preceding. 63 * If not set, this falls back to a wrapper around the preceding.
62 */ 64 */
63extern unsigned int __pure full_name_hash(const char *, unsigned int); 65extern unsigned int __pure full_name_hash(const void *salt, const char *, unsigned int);
64 66
65/* 67/*
66 * A hash_len is a u64 with the hash of a string in the low 68 * A hash_len is a u64 with the hash of a string in the low
@@ -71,6 +73,6 @@ extern unsigned int __pure full_name_hash(const char *, unsigned int);
71#define hashlen_create(hash, len) ((u64)(len)<<32 | (u32)(hash)) 73#define hashlen_create(hash, len) ((u64)(len)<<32 | (u32)(hash))
72 74
73/* Return the "hash_len" (hash and length) of a null-terminated string */ 75/* Return the "hash_len" (hash and length) of a null-terminated string */
74extern u64 __pure hashlen_string(const char *name); 76extern u64 __pure hashlen_string(const void *salt, const char *name);
75 77
76#endif /* __LINUX_STRINGHASH_H */ 78#endif /* __LINUX_STRINGHASH_H */
diff --git a/include/linux/sunrpc/svcauth.h b/include/linux/sunrpc/svcauth.h
index 91d5a5d6f52b..d03932055328 100644
--- a/include/linux/sunrpc/svcauth.h
+++ b/include/linux/sunrpc/svcauth.h
@@ -172,12 +172,12 @@ extern void unix_gid_cache_destroy(struct net *net);
172 */ 172 */
173static inline unsigned long hash_str(char const *name, int bits) 173static inline unsigned long hash_str(char const *name, int bits)
174{ 174{
175 return hashlen_hash(hashlen_string(name)) >> (32 - bits); 175 return hashlen_hash(hashlen_string(NULL, name)) >> (32 - bits);
176} 176}
177 177
178static inline unsigned long hash_mem(char const *buf, int length, int bits) 178static inline unsigned long hash_mem(char const *buf, int length, int bits)
179{ 179{
180 return full_name_hash(buf, length) >> (32 - bits); 180 return full_name_hash(NULL, buf, length) >> (32 - bits);
181} 181}
182 182
183#endif /* __KERNEL__ */ 183#endif /* __KERNEL__ */
diff --git a/lib/test_hash.c b/lib/test_hash.c
index c9549c8b4909..66c5fc8351e8 100644
--- a/lib/test_hash.c
+++ b/lib/test_hash.c
@@ -155,8 +155,8 @@ test_hash_init(void)
155 buf[j] = '\0'; 155 buf[j] = '\0';
156 156
157 for (i = 0; i <= j; i++) { 157 for (i = 0; i <= j; i++) {
158 u64 hashlen = hashlen_string(buf+i); 158 u64 hashlen = hashlen_string(buf+i, buf+i);
159 u32 h0 = full_name_hash(buf+i, j-i); 159 u32 h0 = full_name_hash(buf+i, buf+i, j-i);
160 160
161 /* Check that hashlen_string gets the length right */ 161 /* Check that hashlen_string gets the length right */
162 if (hashlen_len(hashlen) != j-i) { 162 if (hashlen_len(hashlen) != j-i) {
diff --git a/net/core/dev.c b/net/core/dev.c
index 2a9c39f8824e..4ce07dc25573 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -198,7 +198,7 @@ static inline void dev_base_seq_inc(struct net *net)
198 198
199static inline struct hlist_head *dev_name_hash(struct net *net, const char *name) 199static inline struct hlist_head *dev_name_hash(struct net *net, const char *name)
200{ 200{
201 unsigned int hash = full_name_hash(name, strnlen(name, IFNAMSIZ)); 201 unsigned int hash = full_name_hash(net, name, strnlen(name, IFNAMSIZ));
202 202
203 return &net->dev_name_head[hash_32(hash, NETDEV_HASHBITS)]; 203 return &net->dev_name_head[hash_32(hash, NETDEV_HASHBITS)];
204} 204}
diff --git a/security/smack/smack_access.c b/security/smack/smack_access.c
index a283f9e796c1..23e5808a0970 100644
--- a/security/smack/smack_access.c
+++ b/security/smack/smack_access.c
@@ -413,7 +413,7 @@ void smk_insert_entry(struct smack_known *skp)
413 unsigned int hash; 413 unsigned int hash;
414 struct hlist_head *head; 414 struct hlist_head *head;
415 415
416 hash = full_name_hash(skp->smk_known, strlen(skp->smk_known)); 416 hash = full_name_hash(NULL, skp->smk_known, strlen(skp->smk_known));
417 head = &smack_known_hash[hash & (SMACK_HASH_SLOTS - 1)]; 417 head = &smack_known_hash[hash & (SMACK_HASH_SLOTS - 1)];
418 418
419 hlist_add_head_rcu(&skp->smk_hashed, head); 419 hlist_add_head_rcu(&skp->smk_hashed, head);
@@ -433,7 +433,7 @@ struct smack_known *smk_find_entry(const char *string)
433 struct hlist_head *head; 433 struct hlist_head *head;
434 struct smack_known *skp; 434 struct smack_known *skp;
435 435
436 hash = full_name_hash(string, strlen(string)); 436 hash = full_name_hash(NULL, string, strlen(string));
437 head = &smack_known_hash[hash & (SMACK_HASH_SLOTS - 1)]; 437 head = &smack_known_hash[hash & (SMACK_HASH_SLOTS - 1)];
438 438
439 hlist_for_each_entry_rcu(skp, head, smk_hashed) 439 hlist_for_each_entry_rcu(skp, head, smk_hashed)
diff --git a/security/tomoyo/memory.c b/security/tomoyo/memory.c
index 0e995716cc25..1598b559ac42 100644
--- a/security/tomoyo/memory.c
+++ b/security/tomoyo/memory.c
@@ -154,7 +154,7 @@ const struct tomoyo_path_info *tomoyo_get_name(const char *name)
154 if (!name) 154 if (!name)
155 return NULL; 155 return NULL;
156 len = strlen(name) + 1; 156 len = strlen(name) + 1;
157 hash = full_name_hash((const unsigned char *) name, len - 1); 157 hash = full_name_hash(NULL, (const unsigned char *) name, len - 1);
158 head = &tomoyo_name_list[hash_long(hash, TOMOYO_HASH_BITS)]; 158 head = &tomoyo_name_list[hash_long(hash, TOMOYO_HASH_BITS)];
159 if (mutex_lock_interruptible(&tomoyo_policy_lock)) 159 if (mutex_lock_interruptible(&tomoyo_policy_lock))
160 return NULL; 160 return NULL;
diff --git a/security/tomoyo/util.c b/security/tomoyo/util.c
index b974a6997d7f..5fe3679137ae 100644
--- a/security/tomoyo/util.c
+++ b/security/tomoyo/util.c
@@ -666,7 +666,7 @@ void tomoyo_fill_path_info(struct tomoyo_path_info *ptr)
666 ptr->const_len = tomoyo_const_part_length(name); 666 ptr->const_len = tomoyo_const_part_length(name);
667 ptr->is_dir = len && (name[len - 1] == '/'); 667 ptr->is_dir = len && (name[len - 1] == '/');
668 ptr->is_patterned = (ptr->const_len < len); 668 ptr->is_patterned = (ptr->const_len < len);
669 ptr->hash = full_name_hash(name, len); 669 ptr->hash = full_name_hash(NULL, name, len);
670} 670}
671 671
672/** 672/**