diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-05-21 18:22:44 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2013-06-29 04:57:36 -0400 |
commit | da53be12bbb4fabbe2e9f6f908de0cf478b5161d (patch) | |
tree | a0436fb462a7b16c82e58336e17c55b814f7be6b /fs/cifs/dir.c | |
parent | 642b704cd7a29be0b8900971eb525086c1c995b7 (diff) |
Don't pass inode to ->d_hash() and ->d_compare()
Instances either don't look at it at all (the majority of cases) or
only want it to find the superblock (which can be had as dentry->d_sb).
A few cases that want more are actually safe with dentry->d_inode -
the only precaution needed is the check that it hadn't been replaced with
NULL by rmdir() or by overwriting rename(), which case should be simply
treated as cache miss.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/cifs/dir.c')
-rw-r--r-- | fs/cifs/dir.c | 9 |
1 files changed, 3 insertions, 6 deletions
diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c index 5699b5036ed8..5175aebf6737 100644 --- a/fs/cifs/dir.c +++ b/fs/cifs/dir.c | |||
@@ -822,8 +822,7 @@ const struct dentry_operations cifs_dentry_ops = { | |||
822 | /* d_delete: cifs_d_delete, */ /* not needed except for debugging */ | 822 | /* d_delete: cifs_d_delete, */ /* not needed except for debugging */ |
823 | }; | 823 | }; |
824 | 824 | ||
825 | static int cifs_ci_hash(const struct dentry *dentry, const struct inode *inode, | 825 | static int cifs_ci_hash(const struct dentry *dentry, struct qstr *q) |
826 | struct qstr *q) | ||
827 | { | 826 | { |
828 | struct nls_table *codepage = CIFS_SB(dentry->d_sb)->local_nls; | 827 | struct nls_table *codepage = CIFS_SB(dentry->d_sb)->local_nls; |
829 | unsigned long hash; | 828 | unsigned long hash; |
@@ -838,12 +837,10 @@ static int cifs_ci_hash(const struct dentry *dentry, const struct inode *inode, | |||
838 | return 0; | 837 | return 0; |
839 | } | 838 | } |
840 | 839 | ||
841 | static int cifs_ci_compare(const struct dentry *parent, | 840 | static int cifs_ci_compare(const struct dentry *parent, const struct dentry *dentry, |
842 | const struct inode *pinode, | ||
843 | const struct dentry *dentry, const struct inode *inode, | ||
844 | unsigned int len, const char *str, const struct qstr *name) | 841 | unsigned int len, const char *str, const struct qstr *name) |
845 | { | 842 | { |
846 | struct nls_table *codepage = CIFS_SB(pinode->i_sb)->local_nls; | 843 | struct nls_table *codepage = CIFS_SB(parent->d_sb)->local_nls; |
847 | 844 | ||
848 | if ((name->len == len) && | 845 | if ((name->len == len) && |
849 | (nls_strnicmp(codepage, name->name, str, len) == 0)) | 846 | (nls_strnicmp(codepage, name->name, str, len) == 0)) |