ext3: return 32/64-bit dir name hash according to usage type
commitd7dab39b6e16d5eea78ed3c705d2a2d0772b4f06
authorEric Sandeen <sandeen@redhat.com>
Thu, 26 Apr 2012 18:10:39 +0000 (26 13:10 -0500)
committerJan Kara <jack@suse.cz>
Tue, 15 May 2012 21:34:39 +0000 (15 23:34 +0200)
treea2b201b2afd8cd1d278947f7e080ce7457e88814
parenta80b12c3d08dbbf15e6a551e481c32a2df4911f3
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>
fs/ext3/dir.c
fs/ext3/ext3.h
fs/ext3/hash.c