Module Name: src
Committed By: nonaka
Date: Thu Aug 4 06:58:42 UTC 2016
Modified Files:
src/sys/lib/libsa: ext2fs.c
Log Message:
Sync with sys/ufs/ext2fs/ext2fs_bswap.c.
To generate a diff of this commit:
cvs rdiff -u -r1.22 -r1.23 src/sys/lib/libsa/ext2fs.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/lib/libsa/ext2fs.c
diff -u src/sys/lib/libsa/ext2fs.c:1.22 src/sys/lib/libsa/ext2fs.c:1.23
--- src/sys/lib/libsa/ext2fs.c:1.22 Thu Aug 4 03:16:00 2016
+++ src/sys/lib/libsa/ext2fs.c Thu Aug 4 06:58:41 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: ext2fs.c,v 1.22 2016/08/04 03:16:00 nonaka Exp $ */
+/* $NetBSD: ext2fs.c,v 1.23 2016/08/04 06:58:41 nonaka Exp $ */
/*
* Copyright (c) 1997 Manuel Bouyer.
@@ -939,9 +939,13 @@ void e2fs_cg_bswap(struct ext2_gd *old,
}
}
-void e2fs_i_bswap(struct ext2fs_dinode *old, struct ext2fs_dinode *new)
+void e2fs_i_bswap(struct ext2fs_dinode *old, struct ext2fs_dinode *new,
+ size_t isize)
{
+ /* preserve non-swapped and unused fields */
+ memcpy(new, old, isize);
+ /* swap what needs to be swapped */
new->e2di_mode = bswap16(old->e2di_mode);
new->e2di_uid = bswap16(old->e2di_uid);
new->e2di_gid = bswap16(old->e2di_gid);
@@ -953,12 +957,41 @@ void e2fs_i_bswap(struct ext2fs_dinode *
new->e2di_dtime = bswap32(old->e2di_dtime);
new->e2di_nblock = bswap32(old->e2di_nblock);
new->e2di_flags = bswap32(old->e2di_flags);
+ new->e2di_version = bswap32(old->e2di_version);
new->e2di_gen = bswap32(old->e2di_gen);
new->e2di_facl = bswap32(old->e2di_facl);
new->e2di_dacl = bswap32(old->e2di_dacl);
- new->e2di_obso_faddr = bswap32(old->e2di_obso_faddr);
- memcpy(&new->e2di_blocks[0], &old->e2di_blocks[0],
- (EXT2FS_NDADDR + EXT2FS_NIADDR) * sizeof(uint32_t));
+ new->e2di_nblock_high = bswap16(old->e2di_nblock_high);
+ new->e2di_facl_high = bswap16(old->e2di_facl_high);
+ new->e2di_uid_high = bswap16(old->e2di_uid_high);
+ new->e2di_gid_high = bswap16(old->e2di_gid_high);
+ new->e2di_checksum_low = bswap16(old->e2di_checksum_low);
+
+ /*
+ * Following fields are only supported for inode sizes bigger
+ * than the old ext2 one
+ */
+ if (isize == EXT2_REV0_DINODE_SIZE)
+ return;
+
+ new->e2di_extra_isize = bswap16(old->e2di_extra_isize);
+ new->e2di_checksum_high = bswap16(old->e2di_checksum_high);
+
+ /* Following fields are ext4, might not be actually present */
+ if (EXT2_DINODE_FITS(new, e2di_ctime_extra, isize))
+ new->e2di_ctime_extra = bswap32(old->e2di_ctime_extra);
+ if (EXT2_DINODE_FITS(new, e2di_mtime_extra, isize))
+ new->e2di_mtime_extra = bswap32(old->e2di_mtime_extra);
+ if (EXT2_DINODE_FITS(new, e2di_atime_extra, isize))
+ new->e2di_atime_extra = bswap32(old->e2di_atime_extra);
+ if (EXT2_DINODE_FITS(new, e2di_crtime, isize))
+ new->e2di_crtime = bswap32(old->e2di_crtime);
+ if (EXT2_DINODE_FITS(new, e2di_crtime_extra, isize))
+ new->e2di_crtime_extra = bswap32(old->e2di_crtime_extra);
+ if (EXT2_DINODE_FITS(new, e2di_version_high, isize))
+ new->e2di_version_high = bswap32(old->e2di_version_high);
+ if (EXT2_DINODE_FITS(new, e2di_projid, isize))
+ new->e2di_projid = bswap32(old->e2di_projid);
}
#endif