aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorNick Piggin <npiggin@kernel.dk>2011-01-07 01:49:28 -0500
committerNick Piggin <npiggin@kernel.dk>2011-01-07 01:50:20 -0500
commitb1e6a015a580ad145689ad1d6b4aa0e03e6c868b (patch)
tree57a10ef164e4d2f798d9b832dbeaf973aca2ab83 /fs
parent621e155a3591962420eacdd39f6f0aa29ceb221e (diff)
fs: change d_hash for rcu-walk
Change d_hash so it may be called from lock-free RCU lookups. See similar patch for d_compare for details. For in-tree filesystems, this is just a mechanical change. Signed-off-by: Nick Piggin <npiggin@kernel.dk>
Diffstat (limited to 'fs')
-rw-r--r--fs/adfs/dir.c3
-rw-r--r--fs/affs/namei.c20
-rw-r--r--fs/cifs/dir.c5
-rw-r--r--fs/cifs/readdir.c2
-rw-r--r--fs/dcache.c2
-rw-r--r--fs/ecryptfs/inode.c4
-rw-r--r--fs/fat/namei_msdos.c3
-rw-r--r--fs/fat/namei_vfat.c8
-rw-r--r--fs/gfs2/dentry.c3
-rw-r--r--fs/hfs/hfs_fs.h3
-rw-r--r--fs/hfs/string.c3
-rw-r--r--fs/hfsplus/hfsplus_fs.h3
-rw-r--r--fs/hfsplus/unicode.c3
-rw-r--r--fs/hpfs/dentry.c3
-rw-r--r--fs/isofs/inode.c28
-rw-r--r--fs/jfs/namei.c3
-rw-r--r--fs/namei.c5
-rw-r--r--fs/ncpfs/dir.c10
-rw-r--r--fs/sysv/namei.c3
19 files changed, 71 insertions, 43 deletions
diff --git a/fs/adfs/dir.c b/fs/adfs/dir.c
index c8ed66162bd..a11e5e10271 100644
--- a/fs/adfs/dir.c
+++ b/fs/adfs/dir.c
@@ -201,7 +201,8 @@ const struct file_operations adfs_dir_operations = {
201}; 201};
202 202
203static int 203static int
204adfs_hash(struct dentry *parent, struct qstr *qstr) 204adfs_hash(const struct dentry *parent, const struct inode *inode,
205 struct qstr *qstr)
205{ 206{
206 const unsigned int name_len = ADFS_SB(parent->d_sb)->s_namelen; 207 const unsigned int name_len = ADFS_SB(parent->d_sb)->s_namelen;
207 const unsigned char *name; 208 const unsigned char *name;
diff --git a/fs/affs/namei.c b/fs/affs/namei.c
index 547d5deb0d4..5aca08c2110 100644
--- a/fs/affs/namei.c
+++ b/fs/affs/namei.c
@@ -13,13 +13,15 @@
13typedef int (*toupper_t)(int); 13typedef int (*toupper_t)(int);
14 14
15static int affs_toupper(int ch); 15static int affs_toupper(int ch);
16static int affs_hash_dentry(struct dentry *, struct qstr *); 16static int affs_hash_dentry(const struct dentry *,
17 const struct inode *, struct qstr *);
17static int affs_compare_dentry(const struct dentry *parent, 18static int affs_compare_dentry(const struct dentry *parent,
18 const struct inode *pinode, 19 const struct inode *pinode,
19 const struct dentry *dentry, const struct inode *inode, 20 const struct dentry *dentry, const struct inode *inode,
20 unsigned int len, const char *str, const struct qstr *name); 21 unsigned int len, const char *str, const struct qstr *name);
21static int affs_intl_toupper(int ch); 22static int affs_intl_toupper(int ch);
22static int affs_intl_hash_dentry(struct dentry *, struct qstr *); 23static int affs_intl_hash_dentry(const struct dentry *,
24 const struct inode *, struct qstr *);
23static int affs_intl_compare_dentry(const struct dentry *parent, 25static int affs_intl_compare_dentry(const struct dentry *parent,
24 const struct inode *pinode, 26 const struct inode *pinode,
25 const struct dentry *dentry, const struct inode *inode, 27 const struct dentry *dentry, const struct inode *inode,
@@ -64,13 +66,13 @@ affs_get_toupper(struct super_block *sb)
64 * Note: the dentry argument is the parent dentry. 66 * Note: the dentry argument is the parent dentry.
65 */ 67 */
66static inline int 68static inline int
67__affs_hash_dentry(struct dentry *dentry, struct qstr *qstr, toupper_t toupper) 69__affs_hash_dentry(struct qstr *qstr, toupper_t toupper)
68{ 70{
69 const u8 *name = qstr->name; 71 const u8 *name = qstr->name;
70 unsigned long hash; 72 unsigned long hash;
71 int i; 73 int i;
72 74
73 i = affs_check_name(qstr->name,qstr->len); 75 i = affs_check_name(qstr->name, qstr->len);
74 if (i) 76 if (i)
75 return i; 77 return i;
76 78
@@ -84,14 +86,16 @@ __affs_hash_dentry(struct dentry *dentry, struct qstr *qstr, toupper_t toupper)
84} 86}
85 87
86static int 88static int
87affs_hash_dentry(struct dentry *dentry, struct qstr *qstr) 89affs_hash_dentry(const struct dentry *dentry, const struct inode *inode,
90 struct qstr *qstr)
88{ 91{
89 return __affs_hash_dentry(dentry, qstr, affs_toupper); 92 return __affs_hash_dentry(qstr, affs_toupper);
90} 93}
91static int 94static int
92affs_intl_hash_dentry(struct dentry *dentry, struct qstr *qstr) 95affs_intl_hash_dentry(const struct dentry *dentry, const struct inode *inode,
96 struct qstr *qstr)
93{ 97{
94 return __affs_hash_dentry(dentry, qstr, affs_intl_toupper); 98 return __affs_hash_dentry(qstr, affs_intl_toupper);
95} 99}
96 100
97static inline int __affs_compare_dentry(unsigned int len, 101static inline int __affs_compare_dentry(unsigned int len,
diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c
index c60133f0d8e..88bfe686ac0 100644
--- a/fs/cifs/dir.c
+++ b/fs/cifs/dir.c
@@ -700,9 +700,10 @@ const struct dentry_operations cifs_dentry_ops = {
700/* d_delete: cifs_d_delete, */ /* not needed except for debugging */ 700/* d_delete: cifs_d_delete, */ /* not needed except for debugging */
701}; 701};
702 702
703static int cifs_ci_hash(struct dentry *dentry, struct qstr *q) 703static int cifs_ci_hash(const struct dentry *dentry, const struct inode *inode,
704 struct qstr *q)
704{ 705{
705 struct nls_table *codepage = CIFS_SB(dentry->d_inode->i_sb)->local_nls; 706 struct nls_table *codepage = CIFS_SB(dentry->d_sb)->local_nls;
706 unsigned long hash; 707 unsigned long hash;
707 int i; 708 int i;
708 709
diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c
index a73eb9f4bda..ee463aeca0b 100644
--- a/fs/cifs/readdir.c
+++ b/fs/cifs/readdir.c
@@ -79,7 +79,7 @@ cifs_readdir_lookup(struct dentry *parent, struct qstr *name,
79 cFYI(1, "For %s", name->name); 79 cFYI(1, "For %s", name->name);
80 80
81 if (parent->d_op && parent->d_op->d_hash) 81 if (parent->d_op && parent->d_op->d_hash)
82 parent->d_op->d_hash(parent, name); 82 parent->d_op->d_hash(parent, parent->d_inode, name);
83 else 83 else
84 name->hash = full_name_hash(name->name, name->len); 84 name->hash = full_name_hash(name->name, name->len);
85 85
diff --git a/fs/dcache.c b/fs/dcache.c
index 7075555fbb0..6f59f375ed9 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
@@ -1478,7 +1478,7 @@ struct dentry *d_hash_and_lookup(struct dentry *dir, struct qstr *name)
1478 */ 1478 */
1479 name->hash = full_name_hash(name->name, name->len); 1479 name->hash = full_name_hash(name->name, name->len);
1480 if (dir->d_op && dir->d_op->d_hash) { 1480 if (dir->d_op && dir->d_op->d_hash) {
1481 if (dir->d_op->d_hash(dir, name) < 0) 1481 if (dir->d_op->d_hash(dir, dir->d_inode, name) < 0)
1482 goto out; 1482 goto out;
1483 } 1483 }
1484 dentry = d_lookup(dir, name); 1484 dentry = d_lookup(dir, name);
diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c
index 9d1a22d6276..a1ed7a7cb17 100644
--- a/fs/ecryptfs/inode.c
+++ b/fs/ecryptfs/inode.c
@@ -454,7 +454,7 @@ static struct dentry *ecryptfs_lookup(struct inode *ecryptfs_dir_inode,
454 lower_name.hash = ecryptfs_dentry->d_name.hash; 454 lower_name.hash = ecryptfs_dentry->d_name.hash;
455 if (lower_dir_dentry->d_op && lower_dir_dentry->d_op->d_hash) { 455 if (lower_dir_dentry->d_op && lower_dir_dentry->d_op->d_hash) {
456 rc = lower_dir_dentry->d_op->d_hash(lower_dir_dentry, 456 rc = lower_dir_dentry->d_op->d_hash(lower_dir_dentry,
457 &lower_name); 457 lower_dir_dentry->d_inode, &lower_name);
458 if (rc < 0) 458 if (rc < 0)
459 goto out_d_drop; 459 goto out_d_drop;
460 } 460 }
@@ -489,7 +489,7 @@ static struct dentry *ecryptfs_lookup(struct inode *ecryptfs_dir_inode,
489 lower_name.hash = full_name_hash(lower_name.name, lower_name.len); 489 lower_name.hash = full_name_hash(lower_name.name, lower_name.len);
490 if (lower_dir_dentry->d_op && lower_dir_dentry->d_op->d_hash) { 490 if (lower_dir_dentry->d_op && lower_dir_dentry->d_op->d_hash) {
491 rc = lower_dir_dentry->d_op->d_hash(lower_dir_dentry, 491 rc = lower_dir_dentry->d_op->d_hash(lower_dir_dentry,
492 &lower_name); 492 lower_dir_dentry->d_inode, &lower_name);
493 if (rc < 0) 493 if (rc < 0)
494 goto out_d_drop; 494 goto out_d_drop;
495 } 495 }
diff --git a/fs/fat/namei_msdos.c b/fs/fat/namei_msdos.c
index 99d3c7ac973..3b3e072d898 100644
--- a/fs/fat/namei_msdos.c
+++ b/fs/fat/namei_msdos.c
@@ -148,7 +148,8 @@ static int msdos_find(struct inode *dir, const unsigned char *name, int len,
148 * that the existing dentry can be used. The msdos fs routines will 148 * that the existing dentry can be used. The msdos fs routines will
149 * return ENOENT or EINVAL as appropriate. 149 * return ENOENT or EINVAL as appropriate.
150 */ 150 */
151static int msdos_hash(struct dentry *dentry, struct qstr *qstr) 151static int msdos_hash(const struct dentry *dentry, const struct inode *inode,
152 struct qstr *qstr)
152{ 153{
153 struct fat_mount_options *options = &MSDOS_SB(dentry->d_sb)->options; 154 struct fat_mount_options *options = &MSDOS_SB(dentry->d_sb)->options;
154 unsigned char msdos_name[MSDOS_NAME]; 155 unsigned char msdos_name[MSDOS_NAME];
diff --git a/fs/fat/namei_vfat.c b/fs/fat/namei_vfat.c
index 95e00ab84c3..4fc06278db4 100644
--- a/fs/fat/namei_vfat.c
+++ b/fs/fat/namei_vfat.c
@@ -103,7 +103,8 @@ static unsigned int vfat_striptail_len(const struct qstr *qstr)
103 * that the existing dentry can be used. The vfat fs routines will 103 * that the existing dentry can be used. The vfat fs routines will
104 * return ENOENT or EINVAL as appropriate. 104 * return ENOENT or EINVAL as appropriate.
105 */ 105 */
106static int vfat_hash(struct dentry *dentry, struct qstr *qstr) 106static int vfat_hash(const struct dentry *dentry, const struct inode *inode,
107 struct qstr *qstr)
107{ 108{
108 qstr->hash = full_name_hash(qstr->name, vfat_striptail_len(qstr)); 109 qstr->hash = full_name_hash(qstr->name, vfat_striptail_len(qstr));
109 return 0; 110 return 0;
@@ -115,9 +116,10 @@ static int vfat_hash(struct dentry *dentry, struct qstr *qstr)
115 * that the existing dentry can be used. The vfat fs routines will 116 * that the existing dentry can be used. The vfat fs routines will
116 * return ENOENT or EINVAL as appropriate. 117 * return ENOENT or EINVAL as appropriate.
117 */ 118 */
118static int vfat_hashi(struct dentry *dentry, struct qstr *qstr) 119static int vfat_hashi(const struct dentry *dentry, const struct inode *inode,
120 struct qstr *qstr)
119{ 121{
120 struct nls_table *t = MSDOS_SB(dentry->d_inode->i_sb)->nls_io; 122 struct nls_table *t = MSDOS_SB(dentry->d_sb)->nls_io;
121 const unsigned char *name; 123 const unsigned char *name;
122 unsigned int len; 124 unsigned int len;
123 unsigned long hash; 125 unsigned long hash;
diff --git a/fs/gfs2/dentry.c b/fs/gfs2/dentry.c
index e80fea2f65f..50497f65763 100644
--- a/fs/gfs2/dentry.c
+++ b/fs/gfs2/dentry.c
@@ -100,7 +100,8 @@ fail:
100 return 0; 100 return 0;
101} 101}
102 102
103static int gfs2_dhash(struct dentry *dentry, struct qstr *str) 103static int gfs2_dhash(const struct dentry *dentry, const struct inode *inode,
104 struct qstr *str)
104{ 105{
105 str->hash = gfs2_disk_hash(str->name, str->len); 106 str->hash = gfs2_disk_hash(str->name, str->len);
106 return 0; 107 return 0;
diff --git a/fs/hfs/hfs_fs.h b/fs/hfs/hfs_fs.h
index 8cd876f0e96..ad97c2d5828 100644
--- a/fs/hfs/hfs_fs.h
+++ b/fs/hfs/hfs_fs.h
@@ -213,7 +213,8 @@ extern int hfs_part_find(struct super_block *, sector_t *, sector_t *);
213/* string.c */ 213/* string.c */
214extern const struct dentry_operations hfs_dentry_operations; 214extern const struct dentry_operations hfs_dentry_operations;
215 215
216extern int hfs_hash_dentry(struct dentry *, struct qstr *); 216extern int hfs_hash_dentry(const struct dentry *, const struct inode *,
217 struct qstr *);
217extern int hfs_strcmp(const unsigned char *, unsigned int, 218extern int hfs_strcmp(const unsigned char *, unsigned int,
218 const unsigned char *, unsigned int); 219 const unsigned char *, unsigned int);
219extern int hfs_compare_dentry(const struct dentry *parent, 220extern int hfs_compare_dentry(const struct dentry *parent,
diff --git a/fs/hfs/string.c b/fs/hfs/string.c
index aaf90d0d694..495a976a3cc 100644
--- a/fs/hfs/string.c
+++ b/fs/hfs/string.c
@@ -51,7 +51,8 @@ static unsigned char caseorder[256] = {
51/* 51/*
52 * Hash a string to an integer in a case-independent way 52 * Hash a string to an integer in a case-independent way
53 */ 53 */
54int hfs_hash_dentry(struct dentry *dentry, struct qstr *this) 54int hfs_hash_dentry(const struct dentry *dentry, const struct inode *inode,
55 struct qstr *this)
55{ 56{
56 const unsigned char *name = this->name; 57 const unsigned char *name = this->name;
57 unsigned int hash, len = this->len; 58 unsigned int hash, len = this->len;
diff --git a/fs/hfsplus/hfsplus_fs.h b/fs/hfsplus/hfsplus_fs.h
index 7aa96eefe48..a5308f491e3 100644
--- a/fs/hfsplus/hfsplus_fs.h
+++ b/fs/hfsplus/hfsplus_fs.h
@@ -379,7 +379,8 @@ int hfsplus_strcasecmp(const struct hfsplus_unistr *, const struct hfsplus_unist
379int hfsplus_strcmp(const struct hfsplus_unistr *, const struct hfsplus_unistr *); 379int hfsplus_strcmp(const struct hfsplus_unistr *, const struct hfsplus_unistr *);
380int hfsplus_uni2asc(struct super_block *, const struct hfsplus_unistr *, char *, int *); 380int hfsplus_uni2asc(struct super_block *, const struct hfsplus_unistr *, char *, int *);
381int hfsplus_asc2uni(struct super_block *, struct hfsplus_unistr *, const char *, int); 381int hfsplus_asc2uni(struct super_block *, struct hfsplus_unistr *, const char *, int);
382int hfsplus_hash_dentry(struct dentry *dentry, struct qstr *str); 382int hfsplus_hash_dentry(const struct dentry *dentry, const struct inode *inode,
383 struct qstr *str);
383int hfsplus_compare_dentry(const struct dentry *parent, 384int hfsplus_compare_dentry(const struct dentry *parent,
384 const struct inode *pinode, 385 const struct inode *pinode,
385 const struct dentry *dentry, const struct inode *inode, 386 const struct dentry *dentry, const struct inode *inode,
diff --git a/fs/hfsplus/unicode.c b/fs/hfsplus/unicode.c
index b178c997efa..d800aa0f2c8 100644
--- a/fs/hfsplus/unicode.c
+++ b/fs/hfsplus/unicode.c
@@ -320,7 +320,8 @@ int hfsplus_asc2uni(struct super_block *sb, struct hfsplus_unistr *ustr,
320 * Composed unicode characters are decomposed and case-folding is performed 320 * Composed unicode characters are decomposed and case-folding is performed
321 * if the appropriate bits are (un)set on the superblock. 321 * if the appropriate bits are (un)set on the superblock.
322 */ 322 */
323int hfsplus_hash_dentry(struct dentry *dentry, struct qstr *str) 323int hfsplus_hash_dentry(const struct dentry *dentry, const struct inode *inode,
324 struct qstr *str)
324{ 325{
325 struct super_block *sb = dentry->d_sb; 326 struct super_block *sb = dentry->d_sb;
326 const char *astr; 327 const char *astr;
diff --git a/fs/hpfs/dentry.c b/fs/hpfs/dentry.c
index dd9b1e74a73..35526df1fd3 100644
--- a/fs/hpfs/dentry.c
+++ b/fs/hpfs/dentry.c
@@ -12,7 +12,8 @@
12 * Note: the dentry argument is the parent dentry. 12 * Note: the dentry argument is the parent dentry.
13 */ 13 */
14 14
15static int hpfs_hash_dentry(struct dentry *dentry, struct qstr *qstr) 15static int hpfs_hash_dentry(const struct dentry *dentry, const struct inode *inode,
16 struct qstr *qstr)
16{ 17{
17 unsigned long hash; 18 unsigned long hash;
18 int i; 19 int i;
diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c
index 7b0fbc61af8..d204ee4235f 100644
--- a/fs/isofs/inode.c
+++ b/fs/isofs/inode.c
@@ -26,8 +26,10 @@
26 26
27#define BEQUIET 27#define BEQUIET
28 28
29static int isofs_hashi(struct dentry *parent, struct qstr *qstr); 29static int isofs_hashi(const struct dentry *parent, const struct inode *inode,
30static int isofs_hash(struct dentry *parent, struct qstr *qstr); 30 struct qstr *qstr);
31static int isofs_hash(const struct dentry *parent, const struct inode *inode,
32 struct qstr *qstr);
31static int isofs_dentry_cmpi(const struct dentry *parent, 33static int isofs_dentry_cmpi(const struct dentry *parent,
32 const struct inode *pinode, 34 const struct inode *pinode,
33 const struct dentry *dentry, const struct inode *inode, 35 const struct dentry *dentry, const struct inode *inode,
@@ -38,8 +40,10 @@ static int isofs_dentry_cmp(const struct dentry *parent,
38 unsigned int len, const char *str, const struct qstr *name); 40 unsigned int len, const char *str, const struct qstr *name);
39 41
40#ifdef CONFIG_JOLIET 42#ifdef CONFIG_JOLIET
41static int isofs_hashi_ms(struct dentry *parent, struct qstr *qstr); 43static int isofs_hashi_ms(const struct dentry *parent, const struct inode *inode,
42static int isofs_hash_ms(struct dentry *parent, struct qstr *qstr); 44 struct qstr *qstr);
45static int isofs_hash_ms(const struct dentry *parent, const struct inode *inode,
46 struct qstr *qstr);
43static int isofs_dentry_cmpi_ms(const struct dentry *parent, 47static int isofs_dentry_cmpi_ms(const struct dentry *parent,
44 const struct inode *pinode, 48 const struct inode *pinode,
45 const struct dentry *dentry, const struct inode *inode, 49 const struct dentry *dentry, const struct inode *inode,
@@ -172,7 +176,7 @@ struct iso9660_options{
172 * Compute the hash for the isofs name corresponding to the dentry. 176 * Compute the hash for the isofs name corresponding to the dentry.
173 */ 177 */
174static int 178static int
175isofs_hash_common(struct dentry *dentry, struct qstr *qstr, int ms) 179isofs_hash_common(const struct dentry *dentry, struct qstr *qstr, int ms)
176{ 180{
177 const char *name; 181 const char *name;
178 int len; 182 int len;
@@ -193,7 +197,7 @@ isofs_hash_common(struct dentry *dentry, struct qstr *qstr, int ms)
193 * Compute the hash for the isofs name corresponding to the dentry. 197 * Compute the hash for the isofs name corresponding to the dentry.
194 */ 198 */
195static int 199static int
196isofs_hashi_common(struct dentry *dentry, struct qstr *qstr, int ms) 200isofs_hashi_common(const struct dentry *dentry, struct qstr *qstr, int ms)
197{ 201{
198 const char *name; 202 const char *name;
199 int len; 203 int len;
@@ -248,13 +252,15 @@ static int isofs_dentry_cmp_common(
248} 252}
249 253
250static int 254static int
251isofs_hash(struct dentry *dentry, struct qstr *qstr) 255isofs_hash(const struct dentry *dentry, const struct inode *inode,
256 struct qstr *qstr)
252{ 257{
253 return isofs_hash_common(dentry, qstr, 0); 258 return isofs_hash_common(dentry, qstr, 0);
254} 259}
255 260
256static int 261static int
257isofs_hashi(struct dentry *dentry, struct qstr *qstr) 262isofs_hashi(const struct dentry *dentry, const struct inode *inode,
263 struct qstr *qstr)
258{ 264{
259 return isofs_hashi_common(dentry, qstr, 0); 265 return isofs_hashi_common(dentry, qstr, 0);
260} 266}
@@ -277,13 +283,15 @@ isofs_dentry_cmpi(const struct dentry *parent, const struct inode *pinode,
277 283
278#ifdef CONFIG_JOLIET 284#ifdef CONFIG_JOLIET
279static int 285static int
280isofs_hash_ms(struct dentry *dentry, struct qstr *qstr) 286isofs_hash_ms(const struct dentry *dentry, const struct inode *inode,
287 struct qstr *qstr)
281{ 288{
282 return isofs_hash_common(dentry, qstr, 1); 289 return isofs_hash_common(dentry, qstr, 1);
283} 290}
284 291
285static int 292static int
286isofs_hashi_ms(struct dentry *dentry, struct qstr *qstr) 293isofs_hashi_ms(const struct dentry *dentry, const struct inode *inode,
294 struct qstr *qstr)
287{ 295{
288 return isofs_hashi_common(dentry, qstr, 1); 296 return isofs_hashi_common(dentry, qstr, 1);
289} 297}
diff --git a/fs/jfs/namei.c b/fs/jfs/namei.c
index 92129016cd7..57f90dad891 100644
--- a/fs/jfs/namei.c
+++ b/fs/jfs/namei.c
@@ -1574,7 +1574,8 @@ const struct file_operations jfs_dir_operations = {
1574 .llseek = generic_file_llseek, 1574 .llseek = generic_file_llseek,
1575}; 1575};
1576 1576
1577static int jfs_ci_hash(struct dentry *dir, struct qstr *this) 1577static int jfs_ci_hash(const struct dentry *dir, const struct inode *inode,
1578 struct qstr *this)
1578{ 1579{
1579 unsigned long hash; 1580 unsigned long hash;
1580 int i; 1581 int i;
diff --git a/fs/namei.c b/fs/namei.c
index 4ff7ca53053..f3b5ca40465 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -731,7 +731,8 @@ static int do_lookup(struct nameidata *nd, struct qstr *name,
731 * to use its own hash.. 731 * to use its own hash..
732 */ 732 */
733 if (nd->path.dentry->d_op && nd->path.dentry->d_op->d_hash) { 733 if (nd->path.dentry->d_op && nd->path.dentry->d_op->d_hash) {
734 int err = nd->path.dentry->d_op->d_hash(nd->path.dentry, name); 734 int err = nd->path.dentry->d_op->d_hash(nd->path.dentry,
735 nd->path.dentry->d_inode, name);
735 if (err < 0) 736 if (err < 0)
736 return err; 737 return err;
737 } 738 }
@@ -1134,7 +1135,7 @@ static struct dentry *__lookup_hash(struct qstr *name,
1134 * to use its own hash.. 1135 * to use its own hash..
1135 */ 1136 */
1136 if (base->d_op && base->d_op->d_hash) { 1137 if (base->d_op && base->d_op->d_hash) {
1137 err = base->d_op->d_hash(base, name); 1138 err = base->d_op->d_hash(base, inode, name);
1138 dentry = ERR_PTR(err); 1139 dentry = ERR_PTR(err);
1139 if (err < 0) 1140 if (err < 0)
1140 goto out; 1141 goto out;
diff --git a/fs/ncpfs/dir.c b/fs/ncpfs/dir.c
index 3bcc68aed41..bbbf7922f42 100644
--- a/fs/ncpfs/dir.c
+++ b/fs/ncpfs/dir.c
@@ -74,7 +74,8 @@ const struct inode_operations ncp_dir_inode_operations =
74 * Dentry operations routines 74 * Dentry operations routines
75 */ 75 */
76static int ncp_lookup_validate(struct dentry *, struct nameidata *); 76static int ncp_lookup_validate(struct dentry *, struct nameidata *);
77static int ncp_hash_dentry(struct dentry *, struct qstr *); 77static int ncp_hash_dentry(const struct dentry *, const struct inode *,
78 struct qstr *);
78static int ncp_compare_dentry(const struct dentry *, const struct inode *, 79static int ncp_compare_dentry(const struct dentry *, const struct inode *,
79 const struct dentry *, const struct inode *, 80 const struct dentry *, const struct inode *,
80 unsigned int, const char *, const struct qstr *); 81 unsigned int, const char *, const struct qstr *);
@@ -129,9 +130,10 @@ static inline int ncp_case_sensitive(const struct inode *i)
129 * is case-sensitive. 130 * is case-sensitive.
130 */ 131 */
131static int 132static int
132ncp_hash_dentry(struct dentry *dentry, struct qstr *this) 133ncp_hash_dentry(const struct dentry *dentry, const struct inode *inode,
134 struct qstr *this)
133{ 135{
134 if (!ncp_case_sensitive(dentry->d_inode)) { 136 if (!ncp_case_sensitive(inode)) {
135 struct super_block *sb = dentry->d_sb; 137 struct super_block *sb = dentry->d_sb;
136 struct nls_table *t; 138 struct nls_table *t;
137 unsigned long hash; 139 unsigned long hash;
@@ -597,7 +599,7 @@ ncp_fill_cache(struct file *filp, void *dirent, filldir_t filldir,
597 qname.hash = full_name_hash(qname.name, qname.len); 599 qname.hash = full_name_hash(qname.name, qname.len);
598 600
599 if (dentry->d_op && dentry->d_op->d_hash) 601 if (dentry->d_op && dentry->d_op->d_hash)
600 if (dentry->d_op->d_hash(dentry, &qname) != 0) 602 if (dentry->d_op->d_hash(dentry, dentry->d_inode, &qname) != 0)
601 goto end_advance; 603 goto end_advance;
602 604
603 newdent = d_lookup(dentry, &qname); 605 newdent = d_lookup(dentry, &qname);
diff --git a/fs/sysv/namei.c b/fs/sysv/namei.c
index 11e7f7d11cd..7507aeb4c90 100644
--- a/fs/sysv/namei.c
+++ b/fs/sysv/namei.c
@@ -27,7 +27,8 @@ static int add_nondir(struct dentry *dentry, struct inode *inode)
27 return err; 27 return err;
28} 28}
29 29
30static int sysv_hash(struct dentry *dentry, struct qstr *qstr) 30static int sysv_hash(const struct dentry *dentry, const struct inode *inode,
31 struct qstr *qstr)
31{ 32{
32 /* Truncate the name in place, avoids having to define a compare 33 /* Truncate the name in place, avoids having to define a compare
33 function. */ 34 function. */