diff options
| -rw-r--r-- | fs/reiserfs/inode.c | 4 | ||||
| -rw-r--r-- | fs/reiserfs/stree.c | 36 | ||||
| -rw-r--r-- | fs/reiserfs/super.c | 4 | ||||
| -rw-r--r-- | include/linux/reiserfs_fs.h | 49 |
4 files changed, 27 insertions, 66 deletions
diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c index 5fdb9f97b99e..2711dff1b7b4 100644 --- a/fs/reiserfs/inode.c +++ b/fs/reiserfs/inode.c | |||
| @@ -1341,8 +1341,8 @@ void reiserfs_read_locked_inode (struct inode * inode, struct reiserfs_iget_args | |||
| 1341 | key.version = KEY_FORMAT_3_5; | 1341 | key.version = KEY_FORMAT_3_5; |
| 1342 | key.on_disk_key.k_dir_id = dirino; | 1342 | key.on_disk_key.k_dir_id = dirino; |
| 1343 | key.on_disk_key.k_objectid = inode->i_ino; | 1343 | key.on_disk_key.k_objectid = inode->i_ino; |
| 1344 | key.on_disk_key.u.k_offset_v1.k_offset = SD_OFFSET; | 1344 | key.on_disk_key.k_offset = 0; |
| 1345 | key.on_disk_key.u.k_offset_v1.k_uniqueness = SD_UNIQUENESS; | 1345 | key.on_disk_key.k_type = 0; |
| 1346 | 1346 | ||
| 1347 | /* look for the object's stat data */ | 1347 | /* look for the object's stat data */ |
| 1348 | retval = search_item (inode->i_sb, &key, &path_to_sd); | 1348 | retval = search_item (inode->i_sb, &key, &path_to_sd); |
diff --git a/fs/reiserfs/stree.c b/fs/reiserfs/stree.c index 15fa4cbdce3e..da23ba75f3d5 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, | |||
| 87 | inline int comp_short_keys (const struct reiserfs_key * le_key, | 87 | inline 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 | ||
| 154 | inline void le_key2cpu_key (struct cpu_key * to, const struct reiserfs_key * from) | 151 | inline 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 | }; |
| 238 | const struct in_core_key MAX_IN_CORE_KEY = {0xffffffff, 0xffffffff, {{0xffffffff, 0xffffffff},}}; | ||
| 239 | 232 | ||
| 233 | const 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 |
diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c index 2283f18aa1dc..31e75125f48b 100644 --- a/fs/reiserfs/super.c +++ b/fs/reiserfs/super.c | |||
| @@ -218,8 +218,8 @@ static int finish_unfinished (struct super_block * s) | |||
| 218 | item = B_I_PITEM (bh, ih); | 218 | item = B_I_PITEM (bh, ih); |
| 219 | obj_key.on_disk_key.k_dir_id = le32_to_cpu (*(__le32 *)item); | 219 | obj_key.on_disk_key.k_dir_id = le32_to_cpu (*(__le32 *)item); |
| 220 | obj_key.on_disk_key.k_objectid = le32_to_cpu (ih->ih_key.k_objectid); | 220 | obj_key.on_disk_key.k_objectid = le32_to_cpu (ih->ih_key.k_objectid); |
| 221 | obj_key.on_disk_key.u.k_offset_v1.k_offset = 0; | 221 | obj_key.on_disk_key.k_offset = 0; |
| 222 | obj_key.on_disk_key.u.k_offset_v1.k_uniqueness = 0; | 222 | obj_key.on_disk_key.k_type = 0; |
| 223 | 223 | ||
| 224 | pathrelse (&path); | 224 | pathrelse (&path); |
| 225 | 225 | ||
diff --git a/include/linux/reiserfs_fs.h b/include/linux/reiserfs_fs.h index 2f7a34d636dd..d445b682ce00 100644 --- a/include/linux/reiserfs_fs.h +++ b/include/linux/reiserfs_fs.h | |||
| @@ -433,23 +433,6 @@ static inline void set_offset_v2_k_offset( struct offset_v2 *v2, loff_t offset ) | |||
| 433 | # define set_offset_v2_k_offset(v2,val) (offset_v2_k_offset(v2) = (val)) | 433 | # define set_offset_v2_k_offset(v2,val) (offset_v2_k_offset(v2) = (val)) |
| 434 | #endif | 434 | #endif |
| 435 | 435 | ||
| 436 | struct in_core_offset_v1 { | ||
| 437 | __u32 k_offset; | ||
| 438 | __u32 k_uniqueness; | ||
| 439 | } __attribute__ ((__packed__)); | ||
| 440 | |||
| 441 | struct in_core_offset_v2 { | ||
| 442 | #ifdef __LITTLE_ENDIAN | ||
| 443 | /* little endian version */ | ||
| 444 | __u64 k_offset:60; | ||
| 445 | __u64 k_type: 4; | ||
| 446 | #else | ||
| 447 | /* big endian version */ | ||
| 448 | __u64 k_type: 4; | ||
| 449 | __u64 k_offset:60; | ||
| 450 | #endif | ||
| 451 | } __attribute__ ((__packed__)); | ||
| 452 | |||
| 453 | /* Key of an item determines its location in the S+tree, and | 436 | /* Key of an item determines its location in the S+tree, and |
| 454 | is composed of 4 components */ | 437 | is composed of 4 components */ |
| 455 | struct reiserfs_key { | 438 | struct reiserfs_key { |
| @@ -466,11 +449,9 @@ struct in_core_key { | |||
| 466 | __u32 k_dir_id; /* packing locality: by default parent | 449 | __u32 k_dir_id; /* packing locality: by default parent |
| 467 | directory object id */ | 450 | directory object id */ |
| 468 | __u32 k_objectid; /* object identifier */ | 451 | __u32 k_objectid; /* object identifier */ |
| 469 | union { | 452 | __u64 k_offset; |
| 470 | struct in_core_offset_v1 k_offset_v1; | 453 | __u8 k_type; |
| 471 | struct in_core_offset_v2 k_offset_v2; | 454 | }; |
| 472 | } __attribute__ ((__packed__)) u; | ||
| 473 | } __attribute__ ((__packed__)); | ||
| 474 | 455 | ||
| 475 | struct cpu_key { | 456 | struct cpu_key { |
| 476 | struct in_core_key on_disk_key; | 457 | struct in_core_key on_disk_key; |
| @@ -696,43 +677,29 @@ static inline void set_le_ih_k_type (struct item_head * ih, int type) | |||
| 696 | // | 677 | // |
| 697 | static inline loff_t cpu_key_k_offset (const struct cpu_key * key) | 678 | static inline loff_t cpu_key_k_offset (const struct cpu_key * key) |
| 698 | { | 679 | { |
| 699 | return (key->version == KEY_FORMAT_3_5) ? | 680 | return key->on_disk_key.k_offset; |
| 700 | key->on_disk_key.u.k_offset_v1.k_offset : | ||
| 701 | key->on_disk_key.u.k_offset_v2.k_offset; | ||
| 702 | } | 681 | } |
| 703 | 682 | ||
| 704 | static inline loff_t cpu_key_k_type (const struct cpu_key * key) | 683 | static inline loff_t cpu_key_k_type (const struct cpu_key * key) |
| 705 | { | 684 | { |
| 706 | return (key->version == KEY_FORMAT_3_5) ? | 685 | return key->on_disk_key.k_type; |
| 707 | uniqueness2type (key->on_disk_key.u.k_offset_v1.k_uniqueness) : | ||
| 708 | key->on_disk_key.u.k_offset_v2.k_type; | ||
| 709 | } | 686 | } |
| 710 | 687 | ||
| 711 | static inline void set_cpu_key_k_offset (struct cpu_key * key, loff_t offset) | 688 | static inline void set_cpu_key_k_offset (struct cpu_key * key, loff_t offset) |
| 712 | { | 689 | { |
| 713 | (key->version == KEY_FORMAT_3_5) ? | 690 | key->on_disk_key.k_offset = offset; |
| 714 | (key->on_disk_key.u.k_offset_v1.k_offset = offset) : | ||
| 715 | (key->on_disk_key.u.k_offset_v2.k_offset = offset); | ||
| 716 | } | 691 | } |
| 717 | 692 | ||
| 718 | |||
| 719 | static inline void set_cpu_key_k_type (struct cpu_key * key, int type) | 693 | static inline void set_cpu_key_k_type (struct cpu_key * key, int type) |
| 720 | { | 694 | { |
| 721 | (key->version == KEY_FORMAT_3_5) ? | 695 | key->on_disk_key.k_type = type; |
| 722 | (key->on_disk_key.u.k_offset_v1.k_uniqueness = type2uniqueness (type)): | ||
| 723 | (key->on_disk_key.u.k_offset_v2.k_type = type); | ||
| 724 | } | 696 | } |
| 725 | 697 | ||
| 726 | |||
| 727 | static inline void cpu_key_k_offset_dec (struct cpu_key * key) | 698 | static inline void cpu_key_k_offset_dec (struct cpu_key * key) |
| 728 | { | 699 | { |
| 729 | if (key->version == KEY_FORMAT_3_5) | 700 | key->on_disk_key.k_offset --; |
| 730 | key->on_disk_key.u.k_offset_v1.k_offset --; | ||
| 731 | else | ||
| 732 | key->on_disk_key.u.k_offset_v2.k_offset --; | ||
| 733 | } | 701 | } |
| 734 | 702 | ||
| 735 | |||
| 736 | #define is_direntry_cpu_key(key) (cpu_key_k_type (key) == TYPE_DIRENTRY) | 703 | #define is_direntry_cpu_key(key) (cpu_key_k_type (key) == TYPE_DIRENTRY) |
| 737 | #define is_direct_cpu_key(key) (cpu_key_k_type (key) == TYPE_DIRECT) | 704 | #define is_direct_cpu_key(key) (cpu_key_k_type (key) == TYPE_DIRECT) |
| 738 | #define is_indirect_cpu_key(key) (cpu_key_k_type (key) == TYPE_INDIRECT) | 705 | #define is_indirect_cpu_key(key) (cpu_key_k_type (key) == TYPE_INDIRECT) |
