diff options
author | Eric Sandeen <sandeen@redhat.com> | 2012-04-26 14:10:39 -0400 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2012-05-15 17:34:39 -0400 |
commit | d7dab39b6e16d5eea78ed3c705d2a2d0772b4f06 (patch) | |
tree | a2b201b2afd8cd1d278947f7e080ce7457e88814 /fs/ext3/hash.c | |
parent | a80b12c3d08dbbf15e6a551e481c32a2df4911f3 (diff) |
ext3: return 32/64-bit dir name hash according to usage type
This is based on commit d1f5273e9adb40724a85272f248f210dc4ce919a
ext4: return 32/64-bit dir name hash according to usage type
by Fan Yong <yong.fan@whamcloud.com>
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 ext3 to return a full 64-bit hash (both major and minor) for
telldir to decrease the chance of hash collisions.
This patch does implement a new ext3_dir_llseek op, because with 64-bit
hashes, nfs will attempt to seek to a hash "offset" which is much
larger than ext3's s_maxbytes. So for dx dirs, we call
generic_file_llseek_size() with the appropriate max hash value as the
maximum seekable size. Otherwise we just pass through to
generic_file_llseek().
Patch-updated-by: Bernd Schubert <bernd.schubert@itwm.fraunhofer.de>
Patch-updated-by: Eric Sandeen <sandeen@redhat.com>
(blame us if something is not correct)
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs/ext3/hash.c')
-rw-r--r-- | fs/ext3/hash.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/fs/ext3/hash.c b/fs/ext3/hash.c index d10231ddcf8a..ede315cdf126 100644 --- a/fs/ext3/hash.c +++ b/fs/ext3/hash.c | |||
@@ -198,8 +198,8 @@ int ext3fs_dirhash(const char *name, int len, struct dx_hash_info *hinfo) | |||
198 | return -1; | 198 | return -1; |
199 | } | 199 | } |
200 | hash = hash & ~1; | 200 | hash = hash & ~1; |
201 | if (hash == (EXT3_HTREE_EOF << 1)) | 201 | if (hash == (EXT3_HTREE_EOF_32BIT << 1)) |
202 | hash = (EXT3_HTREE_EOF-1) << 1; | 202 | hash = (EXT3_HTREE_EOF_32BIT - 1) << 1; |
203 | hinfo->hash = hash; | 203 | hinfo->hash = hash; |
204 | hinfo->minor_hash = minor_hash; | 204 | hinfo->minor_hash = minor_hash; |
205 | return 0; | 205 | return 0; |