diff options
author | Fan Yong <yong.fan@whamcloud.com> | 2012-03-18 22:44:40 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2012-03-18 22:44:40 -0400 |
commit | d1f5273e9adb40724a85272f248f210dc4ce919a (patch) | |
tree | 1ddb119dab8247ab7d7774394094c61161013f2a /fs/ext4/hash.c | |
parent | 6a8a13e03861c0ab83ab07d573ca793cff0e5d00 (diff) |
ext4: return 32/64-bit dir name hash according to usage type
Traditionally ext2/3/4 has returned a 32-bit hash value from llseek()
to appease NFSv2, which can only handle a 32-bit cookie for seekdir()
and telldir(). However, this causes problems if there are 32-bit hash
collisions, since the NFSv2 server can get stuck resending the same
entries from the directory repeatedly.
Allow ext4 to return a full 64-bit hash (both major and minor) for
telldir to decrease the chance of hash collisions. This still needs
integration on the NFS side.
Patch-updated-by: Bernd Schubert <bernd.schubert@itwm.fraunhofer.de>
(blame me if something is not correct)
Signed-off-by: Fan Yong <yong.fan@whamcloud.com>
Signed-off-by: Andreas Dilger <adilger@whamcloud.com>
Signed-off-by: Bernd Schubert <bernd.schubert@itwm.fraunhofer.de>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/ext4/hash.c')
-rw-r--r-- | fs/ext4/hash.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/fs/ext4/hash.c b/fs/ext4/hash.c index ac8f168c8ab4..fa8e4911d354 100644 --- a/fs/ext4/hash.c +++ b/fs/ext4/hash.c | |||
@@ -200,8 +200,8 @@ int ext4fs_dirhash(const char *name, int len, struct dx_hash_info *hinfo) | |||
200 | return -1; | 200 | return -1; |
201 | } | 201 | } |
202 | hash = hash & ~1; | 202 | hash = hash & ~1; |
203 | if (hash == (EXT4_HTREE_EOF << 1)) | 203 | if (hash == (EXT4_HTREE_EOF_32BIT << 1)) |
204 | hash = (EXT4_HTREE_EOF-1) << 1; | 204 | hash = (EXT4_HTREE_EOF_32BIT - 1) << 1; |
205 | hinfo->hash = hash; | 205 | hinfo->hash = hash; |
206 | hinfo->minor_hash = minor_hash; | 206 | hinfo->minor_hash = minor_hash; |
207 | return 0; | 207 | return 0; |