aboutsummaryrefslogtreecommitdiffstats
path: root/fs/reiserfs/stree.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/reiserfs/stree.c')
-rw-r--r--fs/reiserfs/stree.c36
1 files changed, 15 insertions, 21 deletions
diff --git a/fs/reiserfs/stree.c b/fs/reiserfs/stree.c
index 15fa4cbdce3..da23ba75f3d 100644
--- a/fs/reiserfs/stree.c
+++ b/fs/reiserfs/stree.c
@@ -87,23 +87,20 @@ inline void copy_item_head(struct item_head * p_v_to,
87inline int comp_short_keys (const struct reiserfs_key * le_key, 87inline int comp_short_keys (const struct reiserfs_key * le_key,
88 const struct cpu_key * cpu_key) 88 const struct cpu_key * cpu_key)
89{ 89{
90 __le32 * p_s_le_u32; 90 __u32 n;
91 __u32 * p_s_cpu_u32; 91 n = le32_to_cpu(le_key->k_dir_id);
92 int n_key_length = REISERFS_SHORT_KEY_LEN; 92 if (n < cpu_key->on_disk_key.k_dir_id)
93
94 p_s_le_u32 = (__le32 *)le_key;
95 p_s_cpu_u32 = (__u32 *)&cpu_key->on_disk_key;
96 for( ; n_key_length--; ++p_s_le_u32, ++p_s_cpu_u32 ) {
97 if ( le32_to_cpu (*p_s_le_u32) < *p_s_cpu_u32 )
98 return -1; 93 return -1;
99 if ( le32_to_cpu (*p_s_le_u32) > *p_s_cpu_u32 ) 94 if (n > cpu_key->on_disk_key.k_dir_id)
95 return 1;
96 n = le32_to_cpu(le_key->k_objectid);
97 if (n < cpu_key->on_disk_key.k_objectid)
98 return -1;
99 if (n > cpu_key->on_disk_key.k_objectid)
100 return 1; 100 return 1;
101 }
102
103 return 0; 101 return 0;
104} 102}
105 103
106
107/* k1 is pointer to on-disk structure which is stored in little-endian 104/* k1 is pointer to on-disk structure which is stored in little-endian
108 form. k2 is pointer to cpu variable. 105 form. k2 is pointer to cpu variable.
109 Compare keys using all 4 key fields. 106 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
153 150
154inline void le_key2cpu_key (struct cpu_key * to, const struct reiserfs_key * from) 151inline void le_key2cpu_key (struct cpu_key * to, const struct reiserfs_key * from)
155{ 152{
153 int version;
156 to->on_disk_key.k_dir_id = le32_to_cpu (from->k_dir_id); 154 to->on_disk_key.k_dir_id = le32_to_cpu (from->k_dir_id);
157 to->on_disk_key.k_objectid = le32_to_cpu (from->k_objectid); 155 to->on_disk_key.k_objectid = le32_to_cpu (from->k_objectid);
158 156
159 // find out version of the key 157 // find out version of the key
160 to->version = le_key_version (from); 158 version = le_key_version (from);
161 if (to->version == KEY_FORMAT_3_5) { 159 to->version = version;
162 to->on_disk_key.u.k_offset_v1.k_offset = le32_to_cpu (from->u.k_offset_v1.k_offset); 160 to->on_disk_key.k_offset = le_key_k_offset(version, from);
163 to->on_disk_key.u.k_offset_v1.k_uniqueness = le32_to_cpu (from->u.k_offset_v1.k_uniqueness); 161 to->on_disk_key.k_type = le_key_k_type(version, from);
164 } else {
165 to->on_disk_key.u.k_offset_v2.k_offset = offset_v2_k_offset(&from->u.k_offset_v2);
166 to->on_disk_key.u.k_offset_v2.k_type = offset_v2_k_type(&from->u.k_offset_v2);
167 }
168} 162}
169 163
170 164
@@ -235,8 +229,8 @@ const struct reiserfs_key MAX_KEY = {
235 {{__constant_cpu_to_le32(0xffffffff), 229 {{__constant_cpu_to_le32(0xffffffff),
236 __constant_cpu_to_le32(0xffffffff)},} 230 __constant_cpu_to_le32(0xffffffff)},}
237}; 231};
238const struct in_core_key MAX_IN_CORE_KEY = {0xffffffff, 0xffffffff, {{0xffffffff, 0xffffffff},}};
239 232
233const struct in_core_key MAX_IN_CORE_KEY = {~0U, ~0U, ~0ULL>>4, 15};
240 234
241/* Get delimiting key of the buffer by looking for it in the buffers in the path, starting from the bottom 235/* Get delimiting key of the buffer by looking for it in the buffers in the path, starting from the bottom
242 of the path, and going upwards. We must check the path's validity at each step. If the key is not in 236 of the path, and going upwards. We must check the path's validity at each step. If the key is not in