From ae96c678e15eda2a5d0eea7e1067b449f6604aff Mon Sep 17 00:00:00 2001 From: Theodore Ts'o Date: Fri, 16 Sep 2011 17:51:03 -0400 Subject: [PATCH] libext2s: fix swapfs.c so it builds on big endian systems Also cleaned up ext2_fs.h, and improved the byte swapping code so the extra fields in the large inode are properly byte swapped. Addresses-Debian-Bug: #641838 Signed-off-by: "Theodore Ts'o" --- lib/ext2fs/ext2_fs.h | 5 ++--- lib/ext2fs/swapfs.c | 33 +++++++++++++++++++++++++-------- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/lib/ext2fs/ext2_fs.h b/lib/ext2fs/ext2_fs.h index f0f9fed0..0e73ed24 100644 --- a/lib/ext2fs/ext2_fs.h +++ b/lib/ext2fs/ext2_fs.h @@ -382,8 +382,8 @@ struct ext2_inode { __u16 l_i_file_acl_high; __u16 l_i_uid_high; /* these 2 fields */ __u16 l_i_gid_high; /* were reserved2[0] */ - __u16 l_i_checksum_lo; /* crc32c(uuid+inum+inode) */ - __u16 l_i_reserved; /* crc32c(uuid+inum+inode) */ + __u16 l_i_checksum_lo; /* crc32c(uuid+inum+inode) */ + __u16 l_i_reserved; } linux2; struct { __u8 h_i_frag; /* Fragment number */ @@ -462,7 +462,6 @@ struct ext2_inode_large { #define i_gid_low i_gid #define i_uid_high osd2.linux2.l_i_uid_high #define i_gid_high osd2.linux2.l_i_gid_high -#define i_checksum osd2.linux2.l_i_checksum #else #if defined(__GNU__) diff --git a/lib/ext2fs/swapfs.c b/lib/ext2fs/swapfs.c index d1c4a567..b5bedf34 100644 --- a/lib/ext2fs/swapfs.c +++ b/lib/ext2fs/swapfs.c @@ -132,16 +132,16 @@ void ext2fs_swap_group_desc2(ext2_filsys fs, struct ext2_group_desc *gdp) gdp4->bg_used_dirs_count_hi = ext2fs_swab16(gdp4->bg_used_dirs_count_hi); gdp4->bg_itable_unused_hi = ext2fs_swab16(gdp4->bg_itable_unused_hi); - gdp->bg_exclude_bitmap_hi = ext2fs_swab16(gdp->bg_exclude_bitmap_hi); - gdp->bg_block_bitmap_csum_hi = - ext2fs_swab16(gdp->bg_block_bitmap_csum_hi); - gdp->bg_inode_bitmap_csum_hi = - ext2fs_swab16(gdp->bg_inode_bitmap_csum_hi); + gdp4->bg_exclude_bitmap_hi = ext2fs_swab16(gdp4->bg_exclude_bitmap_hi); + gdp4->bg_block_bitmap_csum_hi = + ext2fs_swab16(gdp4->bg_block_bitmap_csum_hi); + gdp4->bg_inode_bitmap_csum_hi = + ext2fs_swab16(gdp4->bg_inode_bitmap_csum_hi); } void ext2fs_swap_group_desc(struct ext2_group_desc *gdp) { - return ext2fs_swap_group_desc2(0, gdp); + ext2fs_swap_group_desc2(0, gdp); } @@ -256,8 +256,8 @@ void ext2fs_swap_inode_full(ext2_filsys fs, struct ext2_inode_large *t, ext2fs_swab16 (f->osd2.linux2.l_i_uid_high); t->osd2.linux2.l_i_gid_high = ext2fs_swab16 (f->osd2.linux2.l_i_gid_high); - t->osd2.linux2.l_i_checksum = - ext2fs_swab32(f->osd2.linux2.checksum); + t->osd2.linux2.l_i_checksum_lo = + ext2fs_swab32(f->osd2.linux2.l_i_checksum_lo); break; case EXT2_OS_HURD: t->osd1.hurd1.h_i_translator = @@ -291,6 +291,23 @@ void ext2fs_swap_inode_full(ext2_filsys fs, struct ext2_inode_large *t, return; } + if (extra_isize >= 2) + t->i_checksum_hi = ext2fs_swab16(f->i_checksum_hi); + if (extra_isize >= 6) + t->i_checksum_hi = ext2fs_swab32(f->i_checksum_hi); + if (extra_isize >= 10) + t->i_ctime_extra = ext2fs_swab32(f->i_ctime_extra); + if (extra_isize >= 14) + t->i_mtime_extra = ext2fs_swab32(f->i_mtime_extra); + if (extra_isize >= 18) + t->i_atime_extra = ext2fs_swab32(f->i_atime_extra); + if (extra_isize >= 22) + t->i_crtime = ext2fs_swab32(f->i_crtime); + if (extra_isize >= 26) + t->i_crtime_extra = ext2fs_swab32(f->i_crtime_extra); + if (extra_isize >= 30) + t->i_version_hi = ext2fs_swab32(f->i_version_hi); + i = sizeof(struct ext2_inode) + extra_isize + sizeof(__u32); if (bufsize < (int) i) return; /* no space for EA magic */ -- 2.11.0