From 868967cfaf0721488b18e06bb73180dc3b8e5c41 Mon Sep 17 00:00:00 2001 From: okuji Date: Sun, 6 Jan 2008 22:57:50 +0000 Subject: [PATCH] 2008-01-06 Yoshinori K. Okuji * fs/reiserfs.c (grub_reiserfs_get_key_v2_type): Handle endianness correctly. (grub_reiserfs_get_key_offset): Likewise. (grub_reiserfs_set_key_offset): Likewise. (grub_reiserfs_set_key_type): Likewise. (grub_reiserfs_iterate_dir): Return 1 if found, otheriwise 0. (GRUB_REISERFS_KEYV2_BITFIELD): Undefined. Probably it would be better to remove the bitfield version completely. --- ChangeLog | 12 ++++++++++++ fs/reiserfs.c | 26 ++++++++++++-------------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/ChangeLog b/ChangeLog index 930d1e606..b8e6434e1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,17 @@ 2008-01-06 Yoshinori K. Okuji + * fs/reiserfs.c (grub_reiserfs_get_key_v2_type): Handle endianness + correctly. + (grub_reiserfs_get_key_offset): Likewise. + (grub_reiserfs_set_key_offset): Likewise. + (grub_reiserfs_set_key_type): Likewise. + (grub_reiserfs_iterate_dir): Return 1 if found, otheriwise 0. + + (GRUB_REISERFS_KEYV2_BITFIELD): Undefined. Probably it would be + better to remove the bitfield version completely. + +2008-01-06 Yoshinori K. Okuji + * fs/reiserfs.c (grub_reiserfs_iterate_dir): ENTRY_ITEM must be allocated from the heap, due to the fshelp implementation. (grub_reiserfs_dir): Free NODE, due to the same reason. diff --git a/fs/reiserfs.c b/fs/reiserfs.c index 9f777e0b1..b5b32bedc 100644 --- a/fs/reiserfs.c +++ b/fs/reiserfs.c @@ -20,16 +20,13 @@ /* TODO: implement journal handling (ram replay) - implement symlinks support - support items bigger than roughly (blocksize / 4) * blocksize - !! that goes for directories aswell, size in such case is metadata size. test tail packing & direct files validate partition label position */ #warning "TODO : journal, tail packing (?)" -#define GRUB_REISERFS_KEYV2_BITFIELD 1 #if 0 +# define GRUB_REISERFS_KEYV2_BITFIELD 1 # define GRUB_REISERFS_DEBUG # define GRUB_REISERFS_JOURNALING # define GRUB_HEXDUMP @@ -263,7 +260,7 @@ grub_reiserfs_get_key_v2_type (const struct grub_reiserfs_key *key) #ifdef GRUB_REISERFS_KEYV2_BITFIELD switch (key->u.v2.type) #else - switch (key->u.v2.offset_type & 0xF) + switch (grub_le_to_cpu64 (key->u.v2.offset_type) >> 60) #endif { case 0: @@ -372,9 +369,7 @@ grub_reiserfs_get_key_offset (const struct grub_reiserfs_key *key) #ifdef GRUB_REISERFS_KEYV2_BITFIELD return key->u.v2.offset; #else - grub_uint64_t temp = grub_le_to_cpu64 (key->u.v2.offset_type & ~0xF); - return (((temp & 0xF000000000000000LLU) >> 4) \ - | (temp & 0x00FFFFFFFFFFFFFFLLU)); + return grub_le_to_cpu64 (key->u.v2.offset_type) & (~0ULL >> 4); #endif } } @@ -391,9 +386,8 @@ grub_reiserfs_set_key_offset (struct grub_reiserfs_key *key, key->u.v2.offset = value; #else key->u.v2.offset_type \ - = ((key->u.v2.offset_type & 0xF) \ - | grub_cpu_to_le64 (((value & 0x0F00000000000000LLU) << 4) \ - | (value & 0x00FFFFFFFFFFFFFFLLU)); + = ((key->u.v2.offset_type & grub_cpu_to_le64 (15ULL << 60)) + | grub_cpu_to_le64 (value & (~0ULL >> 4))); #endif } @@ -443,7 +437,9 @@ grub_reiserfs_set_key_type (struct grub_reiserfs_key *key, #ifdef GRUB_REISERFS_KEYV2_BITFIELD key->u.v2.type = type; #else - key->u.v2.offset_type = (key->u.v2.offset_type & ~0xF) | (type & 0xF); + key->u.v2.offset_type + = ((key->u.v2.offset_type & grub_cpu_to_le64 (~0ULL >> 4)) + | grub_cpu_to_le64 ((grub_uint64_t) type << 60)); #endif } assert (grub_reiserfs_get_key_type (key) == grub_type); @@ -752,6 +748,7 @@ grub_reiserfs_iterate_dir (grub_fshelp_node_t item, struct grub_reiserfs_block_header *block_header = 0; grub_uint16_t block_size, block_position; grub_uint32_t block_number; + int ret = 0; if (item->type != GRUB_REISERFS_DIRECTORY) { @@ -975,6 +972,7 @@ grub_reiserfs_iterate_dir (grub_fshelp_node_t item, { grub_dprintf ("reiserfs", "Found : %s, type=%d\n", entry_name, entry_type); + ret = 1; goto found; } @@ -999,11 +997,11 @@ grub_reiserfs_iterate_dir (grub_fshelp_node_t item, found: assert (grub_errno == GRUB_ERR_NONE); grub_free (block_header); - return grub_errno; + return ret; fail: assert (grub_errno != GRUB_ERR_NONE); grub_free (block_header); - return grub_errno; + return 0; } /****************************************************************************/