Module Name:    src
Committed By:   martin
Date:           Mon Sep  5 10:44:36 UTC 2016

Modified Files:
        src/sbin/newfs_ext2fs: mke2fs.c

Log Message:
Add a bit of swapping for values in CG descriptors (used to be done
wholesale in e2fs_cgsave, but now common code keeps them in FS byte
order). Seems to fix newfs_ext2fs on big endian hosts.


To generate a diff of this commit:
cvs rdiff -u -r1.24 -r1.25 src/sbin/newfs_ext2fs/mke2fs.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sbin/newfs_ext2fs/mke2fs.c
diff -u src/sbin/newfs_ext2fs/mke2fs.c:1.24 src/sbin/newfs_ext2fs/mke2fs.c:1.25
--- src/sbin/newfs_ext2fs/mke2fs.c:1.24	Thu Aug  4 17:43:47 2016
+++ src/sbin/newfs_ext2fs/mke2fs.c	Mon Sep  5 10:44:36 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: mke2fs.c,v 1.24 2016/08/04 17:43:47 jdolecek Exp $	*/
+/*	$NetBSD: mke2fs.c,v 1.25 2016/09/05 10:44:36 martin Exp $	*/
 
 /*-
  * Copyright (c) 2007 Izumi Tsutsui.  All rights reserved.
@@ -100,7 +100,7 @@
 #if 0
 static char sccsid[] = "@(#)mkfs.c	8.11 (Berkeley) 5/3/95";
 #else
-__RCSID("$NetBSD: mke2fs.c,v 1.24 2016/08/04 17:43:47 jdolecek Exp $");
+__RCSID("$NetBSD: mke2fs.c,v 1.25 2016/09/05 10:44:36 martin Exp $");
 #endif
 #endif /* not lint */
 
@@ -495,24 +495,27 @@ mke2fs(const char *fsys, int fi, int fo)
 			     EXT2F_COMPAT_RESIZE) != 0)
 				boffset += sblock.e2fs.e2fs_reserved_ngdb;
 		}
-		gd[cylno].ext2bgd_b_bitmap = boffset;
+		gd[cylno].ext2bgd_b_bitmap = h2fs32(boffset);
 		boffset += NBLOCK_BLOCK_BITMAP;
-		gd[cylno].ext2bgd_i_bitmap = boffset;
+		gd[cylno].ext2bgd_i_bitmap = h2fs32(boffset);
 		boffset += NBLOCK_INODE_BITMAP;
-		gd[cylno].ext2bgd_i_tables = boffset;
+		gd[cylno].ext2bgd_i_tables = h2fs32(boffset);
 		if (cylno == (ncg - 1))
-			gd[cylno].ext2bgd_nbfree =
-			    blocks_lastcg - cgoverhead(cylno);
+			gd[cylno].ext2bgd_nbfree = h2fs16(
+			    blocks_lastcg - cgoverhead(cylno));
 		else
-			gd[cylno].ext2bgd_nbfree =
-			    sblock.e2fs.e2fs_bpg - cgoverhead(cylno);
-		fbcount += gd[cylno].ext2bgd_nbfree;
-		gd[cylno].ext2bgd_nifree = sblock.e2fs.e2fs_ipg;
+			gd[cylno].ext2bgd_nbfree = h2fs16(
+			    sblock.e2fs.e2fs_bpg - cgoverhead(cylno));
+		fbcount += fs2h16(gd[cylno].ext2bgd_nbfree);
 		if (cylno == 0) {
 			/* take reserved inodes off nifree */
-			gd[cylno].ext2bgd_nifree -= EXT2_RESERVED_INODES;
+			gd[cylno].ext2bgd_nifree = h2fs16(
+			    sblock.e2fs.e2fs_ipg-EXT2_RESERVED_INODES);
+		} else {
+			gd[cylno].ext2bgd_nifree = 
+			    h2fs16(sblock.e2fs.e2fs_ipg);
 		}
-		ficount += gd[cylno].ext2bgd_nifree;
+		ficount += fs2h16(gd[cylno].ext2bgd_nifree);
 		gd[cylno].ext2bgd_ndirs = 0;
 	}
 	sblock.e2fs.e2fs_fbcount = fbcount;
@@ -729,7 +732,7 @@ initcg(uint cylno)
 	i = i * NBBY;
 	for (; i < cgoverhead(cylno); i++)
 		setbit(buf, i);
-	wtfs(EXT2_FSBTODB(&sblock, gd[cylno].ext2bgd_b_bitmap),
+	wtfs(EXT2_FSBTODB(&sblock, fs2h32(gd[cylno].ext2bgd_b_bitmap)),
 	    sblock.e2fs_bsize, buf);
 
 	/*
@@ -747,7 +750,7 @@ initcg(uint cylno)
 		for (i = 1; i < EXT2_FIRSTINO; i++)
 			setbit(buf, EXT2_INO_INDEX(i));
 	}
-	wtfs(EXT2_FSBTODB(&sblock, gd[cylno].ext2bgd_i_bitmap),
+	wtfs(EXT2_FSBTODB(&sblock, fs2h32(gd[cylno].ext2bgd_i_bitmap)),
 	    sblock.e2fs_bsize, buf);
 
 	/*
@@ -764,7 +767,7 @@ initcg(uint cylno)
 			/* h2fs32() just for consistency */
 			dp->e2di_gen = h2fs32(arc4random());
 		}
-		wtfs(EXT2_FSBTODB(&sblock, gd[cylno].ext2bgd_i_tables + i),
+		wtfs(EXT2_FSBTODB(&sblock, fs2h32(gd[cylno].ext2bgd_i_tables) + i),
 		    sblock.e2fs_bsize, buf);
 	}
 }
@@ -1264,7 +1267,7 @@ alloc(uint32_t size, uint16_t mode)
 	bbp = malloc(sblock.e2fs_bsize);
 	if (bbp == NULL)
 		return 0;
-	rdfs(EXT2_FSBTODB(&sblock, gd[0].ext2bgd_b_bitmap),
+	rdfs(EXT2_FSBTODB(&sblock, fs2h32(gd[0].ext2bgd_b_bitmap)),
 	    sblock.e2fs_bsize, bbp);
 
 	/* XXX: kernel uses e2fs_fpg here */
@@ -1299,13 +1302,13 @@ alloc(uint32_t size, uint16_t mode)
 		errx(EXIT_FAILURE, "%s: inconsistent bitmap", __func__);
 
 	setbit(bbp, bno);
-	wtfs(EXT2_FSBTODB(&sblock, gd[0].ext2bgd_b_bitmap),
+	wtfs(EXT2_FSBTODB(&sblock, fs2h32(gd[0].ext2bgd_b_bitmap)),
 	    sblock.e2fs_bsize, bbp);
 	free(bbp);
 	/* XXX: modified group descriptors won't be written into backups */
-	gd[0].ext2bgd_nbfree--;
+	gd[0].ext2bgd_nbfree = h2fs16(fs2h16(gd[0].ext2bgd_nbfree)-1);
 	if ((mode & EXT2_IFDIR) != 0)
-		gd[0].ext2bgd_ndirs++;
+		gd[0].ext2bgd_ndirs = h2fs16(fs2h16(gd[0].ext2bgd_ndirs)+1);
 	sblock.e2fs.e2fs_fbcount--;
 
 	return sblock.e2fs.e2fs_first_dblock + bno;
@@ -1343,7 +1346,7 @@ iput(struct ext2fs_dinode *ip, ino_t ino
 			    __func__, (uint64_t)ino, c);
 
 		/* update inode bitmap */
-		rdfs(EXT2_FSBTODB(&sblock, gd[0].ext2bgd_i_bitmap),
+		rdfs(EXT2_FSBTODB(&sblock, fs2h32(gd[0].ext2bgd_i_bitmap)),
 		    sblock.e2fs_bsize, bp);
 
 		/* more sanity */
@@ -1351,9 +1354,9 @@ iput(struct ext2fs_dinode *ip, ino_t ino
 			errx(EXIT_FAILURE, "%s: inode %" PRIu64
 			    " already in use", __func__, (uint64_t)ino);
 		setbit(bp, EXT2_INO_INDEX(ino));
-		wtfs(EXT2_FSBTODB(&sblock, gd[0].ext2bgd_i_bitmap),
+		wtfs(EXT2_FSBTODB(&sblock, fs2h32(gd[0].ext2bgd_i_bitmap)),
 		    sblock.e2fs_bsize, bp);
-		gd[c].ext2bgd_nifree--;
+		gd[c].ext2bgd_nifree = h2fs16(fs2h16(gd[c].ext2bgd_nifree)-1);
 		sblock.e2fs.e2fs_ficount--;
 	}
 

Reply via email to