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--; }