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
 

Reply via email to