ext3: Add support for non-native signed/unsigned htree hash algorithms
The original ext3 hash algorithms assumed that variables of type char were signed, as God and K&R intended. Unfortunately, this assumption is not true on some architectures. Userspace support for marking filesystems with non-native signed/unsigned chars was added two years ago, but the kernel-side support was never added (until now). Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> Cc: akpm@linux-foundation.org Cc: linux-kernel@vger.kernel.org
This commit is contained in:
@@ -368,6 +368,8 @@ dx_probe(struct qstr *entry, struct inode *dir,
|
||||
goto fail;
|
||||
}
|
||||
hinfo->hash_version = root->info.hash_version;
|
||||
if (hinfo->hash_version <= DX_HASH_TEA)
|
||||
hinfo->hash_version += EXT3_SB(dir->i_sb)->s_hash_unsigned;
|
||||
hinfo->seed = EXT3_SB(dir->i_sb)->s_hash_seed;
|
||||
if (entry)
|
||||
ext3fs_dirhash(entry->name, entry->len, hinfo);
|
||||
@@ -636,6 +638,9 @@ int ext3_htree_fill_tree(struct file *dir_file, __u32 start_hash,
|
||||
dir = dir_file->f_path.dentry->d_inode;
|
||||
if (!(EXT3_I(dir)->i_flags & EXT3_INDEX_FL)) {
|
||||
hinfo.hash_version = EXT3_SB(dir->i_sb)->s_def_hash_version;
|
||||
if (hinfo.hash_version <= DX_HASH_TEA)
|
||||
hinfo.hash_version +=
|
||||
EXT3_SB(dir->i_sb)->s_hash_unsigned;
|
||||
hinfo.seed = EXT3_SB(dir->i_sb)->s_hash_seed;
|
||||
count = htree_dirblock_to_tree(dir_file, dir, 0, &hinfo,
|
||||
start_hash, start_minor_hash);
|
||||
@@ -1398,6 +1403,8 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry,
|
||||
|
||||
/* Initialize as for dx_probe */
|
||||
hinfo.hash_version = root->info.hash_version;
|
||||
if (hinfo.hash_version <= DX_HASH_TEA)
|
||||
hinfo.hash_version += EXT3_SB(dir->i_sb)->s_hash_unsigned;
|
||||
hinfo.seed = EXT3_SB(dir->i_sb)->s_hash_seed;
|
||||
ext3fs_dirhash(name, namelen, &hinfo);
|
||||
frame = frames;
|
||||
|
Reference in New Issue
Block a user