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.
This commit is contained in:
martin 2016-09-05 10:44:36 +00:00
parent 118ae671e7
commit 9286e800c1
1 changed files with 26 additions and 23 deletions

View File

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