diff options
author | Theodore Ts'o <tytso@mit.edu> | 2008-10-28 13:21:44 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2008-10-28 13:21:44 -0400 |
commit | f99b25897a86fcfff9140396a97261ae65fed872 (patch) | |
tree | 2191505f190d09ff31896487c73b8187cb475596 /fs/ext4/super.c | |
parent | 5e1f8c9e20a92743eefc9a82c2db835213905e26 (diff) |
ext4: 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>
Diffstat (limited to 'fs/ext4/super.c')
-rw-r--r-- | fs/ext4/super.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 04158ad74dbb..08fc86a358d3 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
@@ -2118,6 +2118,18 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
2118 | for (i = 0; i < 4; i++) | 2118 | for (i = 0; i < 4; i++) |
2119 | sbi->s_hash_seed[i] = le32_to_cpu(es->s_hash_seed[i]); | 2119 | sbi->s_hash_seed[i] = le32_to_cpu(es->s_hash_seed[i]); |
2120 | sbi->s_def_hash_version = es->s_def_hash_version; | 2120 | sbi->s_def_hash_version = es->s_def_hash_version; |
2121 | i = le32_to_cpu(es->s_flags); | ||
2122 | if (i & EXT2_FLAGS_UNSIGNED_HASH) | ||
2123 | sbi->s_hash_unsigned = 3; | ||
2124 | else if ((i & EXT2_FLAGS_SIGNED_HASH) == 0) { | ||
2125 | #ifdef __CHAR_UNSIGNED__ | ||
2126 | es->s_flags |= cpu_to_le32(EXT2_FLAGS_UNSIGNED_HASH); | ||
2127 | sbi->s_hash_unsigned = 3; | ||
2128 | #else | ||
2129 | es->s_flags |= cpu_to_le32(EXT2_FLAGS_SIGNED_HASH); | ||
2130 | #endif | ||
2131 | sb->s_dirt = 1; | ||
2132 | } | ||
2121 | 2133 | ||
2122 | if (sbi->s_blocks_per_group > blocksize * 8) { | 2134 | if (sbi->s_blocks_per_group > blocksize * 8) { |
2123 | printk(KERN_ERR | 2135 | printk(KERN_ERR |