[PATCH] reiserfs endianness: comp_short_keys() cleanup
comp_short_keys() massaged into sane form, which kills the last place where pointer to in_core_key (or any object containing such) would be cast to or from something else. At that point we are free to change layout of in_core_key - nothing depends on it anymore. So we drop the mess with union in there and simply use (unconditional) __u64 k_offset and __u8 k_type instead; places using in_core_key switched to those. That gives _far_ better code than current mess - on all platforms. Signed-off-by: Al Viro <viro@parcelfarce.linux.theplanet.co.uk> Cc: <reiserfs-dev@namesys.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
@@ -87,23 +87,20 @@ inline void copy_item_head(struct item_head * p_v_to,
|
||||
inline int comp_short_keys (const struct reiserfs_key * le_key,
|
||||
const struct cpu_key * cpu_key)
|
||||
{
|
||||
__le32 * p_s_le_u32;
|
||||
__u32 * p_s_cpu_u32;
|
||||
int n_key_length = REISERFS_SHORT_KEY_LEN;
|
||||
|
||||
p_s_le_u32 = (__le32 *)le_key;
|
||||
p_s_cpu_u32 = (__u32 *)&cpu_key->on_disk_key;
|
||||
for( ; n_key_length--; ++p_s_le_u32, ++p_s_cpu_u32 ) {
|
||||
if ( le32_to_cpu (*p_s_le_u32) < *p_s_cpu_u32 )
|
||||
__u32 n;
|
||||
n = le32_to_cpu(le_key->k_dir_id);
|
||||
if (n < cpu_key->on_disk_key.k_dir_id)
|
||||
return -1;
|
||||
if ( le32_to_cpu (*p_s_le_u32) > *p_s_cpu_u32 )
|
||||
if (n > cpu_key->on_disk_key.k_dir_id)
|
||||
return 1;
|
||||
n = le32_to_cpu(le_key->k_objectid);
|
||||
if (n < cpu_key->on_disk_key.k_objectid)
|
||||
return -1;
|
||||
if (n > cpu_key->on_disk_key.k_objectid)
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* k1 is pointer to on-disk structure which is stored in little-endian
|
||||
form. k2 is pointer to cpu variable.
|
||||
Compare keys using all 4 key fields.
|
||||
@@ -153,18 +150,15 @@ inline int comp_short_le_keys (const struct reiserfs_key * key1, const struct re
|
||||
|
||||
inline void le_key2cpu_key (struct cpu_key * to, const struct reiserfs_key * from)
|
||||
{
|
||||
int version;
|
||||
to->on_disk_key.k_dir_id = le32_to_cpu (from->k_dir_id);
|
||||
to->on_disk_key.k_objectid = le32_to_cpu (from->k_objectid);
|
||||
|
||||
// find out version of the key
|
||||
to->version = le_key_version (from);
|
||||
if (to->version == KEY_FORMAT_3_5) {
|
||||
to->on_disk_key.u.k_offset_v1.k_offset = le32_to_cpu (from->u.k_offset_v1.k_offset);
|
||||
to->on_disk_key.u.k_offset_v1.k_uniqueness = le32_to_cpu (from->u.k_offset_v1.k_uniqueness);
|
||||
} else {
|
||||
to->on_disk_key.u.k_offset_v2.k_offset = offset_v2_k_offset(&from->u.k_offset_v2);
|
||||
to->on_disk_key.u.k_offset_v2.k_type = offset_v2_k_type(&from->u.k_offset_v2);
|
||||
}
|
||||
version = le_key_version (from);
|
||||
to->version = version;
|
||||
to->on_disk_key.k_offset = le_key_k_offset(version, from);
|
||||
to->on_disk_key.k_type = le_key_k_type(version, from);
|
||||
}
|
||||
|
||||
|
||||
@@ -235,8 +229,8 @@ const struct reiserfs_key MAX_KEY = {
|
||||
{{__constant_cpu_to_le32(0xffffffff),
|
||||
__constant_cpu_to_le32(0xffffffff)},}
|
||||
};
|
||||
const struct in_core_key MAX_IN_CORE_KEY = {0xffffffff, 0xffffffff, {{0xffffffff, 0xffffffff},}};
|
||||
|
||||
const struct in_core_key MAX_IN_CORE_KEY = {~0U, ~0U, ~0ULL>>4, 15};
|
||||
|
||||
/* Get delimiting key of the buffer by looking for it in the buffers in the path, starting from the bottom
|
||||
of the path, and going upwards. We must check the path's validity at each step. If the key is not in
|
||||
|
Reference in New Issue
Block a user