From: Hans Reiser This patch fixes a bug which affects big endian archs. Internal items were inserted into tree in cpu byte order. Conversion to little endian is added into internal item create hook. Signed-off-by: Vladimir V. Saveliev --- fs/reiser4/plugin/item/internal.c | 11 +++++++++++ fs/reiser4/tree_mod.c | 7 ++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff -puN fs/reiser4/plugin/item/internal.c~reiser4-fix-built_ptr fs/reiser4/plugin/item/internal.c --- devel/fs/reiser4/plugin/item/internal.c~reiser4-fix-built_ptr 2005-09-28 22:54:46.000000000 -0700 +++ devel-akpm/fs/reiser4/plugin/item/internal.c 2005-09-28 22:54:46.000000000 -0700 @@ -231,12 +231,23 @@ int create_hook_internal(const coord_t * void *arg /* child's left neighbor, if any */ ) { znode *child; + __u64 child_ptr; assert("nikita-1252", item != NULL); assert("nikita-1253", item->node != NULL); assert("nikita-1181", znode_get_level(item->node) > LEAF_LEVEL); assert("nikita-1450", item->unit_pos == 0); + /* + * preparing to item insertion build_child_ptr_data sets pointer to + * data to be inserted to jnode's blocknr which is in cpu byte + * order. Node's create_item simply copied those data. As result we + * have child pointer in cpu's byte order. Convert content of internal + * item to little endian byte order. + */ + child_ptr = get_unaligned((__u64 *)item_body_by_coord(item)); + update_internal(item, &child_ptr); + child = znode_at(item, item->node); if (child != NULL && !IS_ERR(child)) { znode *left; diff -puN fs/reiser4/tree_mod.c~reiser4-fix-built_ptr fs/reiser4/tree_mod.c --- devel/fs/reiser4/tree_mod.c~reiser4-fix-built_ptr 2005-09-28 22:54:46.000000000 -0700 +++ devel-akpm/fs/reiser4/tree_mod.c 2005-09-28 22:54:46.000000000 -0700 @@ -208,7 +208,12 @@ void build_child_ptr_data(znode * child assert("nikita-1116", child != NULL); assert("nikita-1117", data != NULL); - /* this is subtle assignment to meditate upon */ + /* + * NOTE: use address of child's blocknr as address of data to be + * inserted. As result of this data gets into on-disk structure in cpu + * byte order. internal's create_hook converts it to little endian byte + * order. + */ data->data = (char *)znode_get_block(child); /* data -> data is kernel space */ data->user = 0; _