[Ocfs2-tools-devel] [PATCH 30/30] dx_dirs: fix ocfs2_swap_dx_entry_list() for big endian
Mark Fasheh
mfasheh at suse.com
Wed Apr 28 18:26:35 PDT 2010
From: Coly Li <coly.li at suse.de>
As Tao Ma suggested, current ocfs2_swap_dx_entry_list() is
buggy for big endian hardware, because after dl_list->de_count
swapped, it is referenced in the following loop.
This patch fixes this bug with adding an 'int to_cpu' argument, also
modifies other routines who call ocfs2_swap_dx_entry_list().
Signed-off-by: Coly Li <coly.li at suse.de>
Signed-off-by: Mark Fasheh <mfasheh at suse.com>
Signed-off-by: Tao Ma <tao.ma at oracle.com>
---
libocfs2/dirblock.c | 41 ++++++++++++++++++++---------------------
1 files changed, 20 insertions(+), 21 deletions(-)
diff --git a/libocfs2/dirblock.c b/libocfs2/dirblock.c
index c22d843..bd65119 100644
--- a/libocfs2/dirblock.c
+++ b/libocfs2/dirblock.c
@@ -245,29 +245,32 @@ static void ocfs2_swap_dx_entry(struct ocfs2_dx_entry *dx_entry)
dx_entry->dx_dirent_blk = bswap_64(dx_entry->dx_dirent_blk);
}
-static void ocfs2_swap_dx_entry_list(struct ocfs2_dx_entry_list *dl_list)
+static void ocfs2_swap_dx_entry_list_to_cpu(struct ocfs2_dx_entry_list *dl_list)
{
int i;
- dl_list->de_count = bswap_16(dl_list->de_count);
- dl_list->de_num_used = bswap_16(dl_list->de_num_used);
+ if (cpu_is_little_endian)
+ return;
+
+ dl_list->de_count = bswap_16(dl_list->de_count);
+ dl_list->de_num_used = bswap_16(dl_list->de_num_used);
for (i = 0; i < dl_list->de_count; i++)
ocfs2_swap_dx_entry(&dl_list->de_entries[i]);
}
-static void ocfs2_swap_dx_entry_list_to_cpu(struct ocfs2_dx_entry_list *dl_list)
-{
- if (cpu_is_little_endian)
- return;
- ocfs2_swap_dx_entry_list(dl_list);
-}
-
static void ocfs2_swap_dx_entry_list_from_cpu(struct ocfs2_dx_entry_list *dl_list)
{
+ int i;
+
if (cpu_is_little_endian)
return;
- ocfs2_swap_dx_entry_list(dl_list);
+
+ for (i = 0; i < dl_list->de_count; i++)
+ ocfs2_swap_dx_entry(&dl_list->de_entries[i]);
+
+ dl_list->de_count = bswap_16(dl_list->de_count);
+ dl_list->de_num_used = bswap_16(dl_list->de_num_used);
}
static void ocfs2_swap_dx_root_to_cpu(ocfs2_filesys *fs,
@@ -384,26 +387,22 @@ out:
return ret;
}
-static void ocfs2_swap_dx_leaf(struct ocfs2_dx_leaf *dx_leaf)
-{
- dx_leaf->dl_blkno = bswap_64(dx_leaf->dl_blkno);
- dx_leaf->dl_fs_generation = bswap_64(dx_leaf->dl_fs_generation);
-
- ocfs2_swap_dx_entry_list(&dx_leaf->dl_list);
-}
-
static void ocfs2_swap_dx_leaf_to_cpu(struct ocfs2_dx_leaf *dx_leaf)
{
if (cpu_is_little_endian)
return;
- ocfs2_swap_dx_leaf(dx_leaf);
+ dx_leaf->dl_blkno = bswap_64(dx_leaf->dl_blkno);
+ dx_leaf->dl_fs_generation = bswap_64(dx_leaf->dl_fs_generation);
+ ocfs2_swap_dx_entry_list_to_cpu(&dx_leaf->dl_list);
}
static void ocfs2_swap_dx_leaf_from_cpu(struct ocfs2_dx_leaf *dx_leaf)
{
if (cpu_is_little_endian)
return;
- ocfs2_swap_dx_leaf(dx_leaf);
+ dx_leaf->dl_blkno = bswap_64(dx_leaf->dl_blkno);
+ dx_leaf->dl_fs_generation = bswap_64(dx_leaf->dl_fs_generation);
+ ocfs2_swap_dx_entry_list_from_cpu(&dx_leaf->dl_list);
}
errcode_t ocfs2_read_dx_leaf(ocfs2_filesys *fs, uint64_t block,
--
1.6.4.2
More information about the Ocfs2-tools-devel
mailing list