diff options
author | Theodore Ts'o <tytso@mit.edu> | 2011-09-16 17:51:03 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2011-09-16 17:51:03 -0400 |
commit | ae96c678e15eda2a5d0eea7e1067b449f6604aff (patch) | |
tree | 5c51935f351ce57f6e34d07eefe9efd1dc5ba2bb /lib/ext2fs | |
parent | 3694bf1cd0116dec2f066203b9373cca8699fc27 (diff) | |
download | e2fsprogs-ae96c678e15eda2a5d0eea7e1067b449f6604aff.tar.gz |
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" <tytso@mit.edu>
Diffstat (limited to 'lib/ext2fs')
-rw-r--r-- | lib/ext2fs/ext2_fs.h | 5 | ||||
-rw-r--r-- | 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 */ |