aboutsummaryrefslogtreecommitdiff
path: root/sbin/growfs
diff options
context:
space:
mode:
authorKirk McKusick <mckusick@FreeBSD.org>2018-11-13 21:40:56 +0000
committerKirk McKusick <mckusick@FreeBSD.org>2018-11-13 21:40:56 +0000
commit9fc5d538fc57f438ca860e07db191b946b4768c9 (patch)
tree0f73178df156f836c4d9dde3af92b526b95c4e72 /sbin/growfs
parentf183fb162c1dbc58cc3f7e2c27891bd881db2bf2 (diff)
downloadsrc-9fc5d538fc57f438ca860e07db191b946b4768c9.tar.gz
src-9fc5d538fc57f438ca860e07db191b946b4768c9.zip
Notes
Diffstat (limited to 'sbin/growfs')
-rw-r--r--sbin/growfs/growfs.c44
1 files changed, 31 insertions, 13 deletions
diff --git a/sbin/growfs/growfs.c b/sbin/growfs/growfs.c
index 61f90de7ea68..b75f377841ef 100644
--- a/sbin/growfs/growfs.c
+++ b/sbin/growfs/growfs.c
@@ -301,16 +301,21 @@ initcg(int cylno, time_t modtime, int fso, unsigned int Nflag)
{
DBG_FUNC("initcg")
static caddr_t iobuf;
+ static long iobufsize;
long blkno, start;
ino_t ino;
ufs2_daddr_t i, cbase, dmax;
struct ufs1_dinode *dp1;
+ struct ufs2_dinode *dp2;
struct csum *cs;
uint j, d, dupper, dlower;
- if (iobuf == NULL && (iobuf = malloc(sblock.fs_bsize * 3)) == NULL)
- errx(37, "panic: cannot allocate I/O buffer");
-
+ if (iobuf == NULL) {
+ iobufsize = 2 * sblock.fs_bsize;
+ if ((iobuf = malloc(iobufsize)) == NULL)
+ errx(37, "panic: cannot allocate I/O buffer");
+ memset(iobuf, '\0', iobufsize);
+ }
/*
* Determine block bounds for cylinder group.
* Allow space for super block summary information in first
@@ -375,12 +380,29 @@ initcg(int cylno, time_t modtime, int fso, unsigned int Nflag)
acg.cg_cs.cs_nifree--;
}
/*
+ * Initialize the initial inode blocks.
+ */
+ dp1 = (struct ufs1_dinode *)(void *)iobuf;
+ dp2 = (struct ufs2_dinode *)(void *)iobuf;
+ for (i = 0; i < acg.cg_initediblk; i++) {
+ if (sblock.fs_magic == FS_UFS1_MAGIC) {
+ dp1->di_gen = arc4random();
+ dp1++;
+ } else {
+ dp2->di_gen = arc4random();
+ dp2++;
+ }
+ }
+ wtfs(fsbtodb(&sblock, cgimin(&sblock, cylno)), iobufsize, iobuf,
+ fso, Nflag);
+ /*
* For the old file system, we have to initialize all the inodes.
*/
- if (sblock.fs_magic == FS_UFS1_MAGIC) {
- bzero(iobuf, sblock.fs_bsize);
- for (i = 0; i < sblock.fs_ipg / INOPF(&sblock);
- i += sblock.fs_frag) {
+ if (sblock.fs_magic == FS_UFS1_MAGIC &&
+ sblock.fs_ipg > 2 * INOPB(&sblock)) {
+ for (i = 2 * sblock.fs_frag;
+ i < sblock.fs_ipg / INOPF(&sblock);
+ i += sblock.fs_frag) {
dp1 = (struct ufs1_dinode *)(void *)iobuf;
for (j = 0; j < INOPB(&sblock); j++) {
dp1->di_gen = arc4random();
@@ -463,12 +485,8 @@ initcg(int cylno, time_t modtime, int fso, unsigned int Nflag)
*cs = acg.cg_cs;
cgckhash(&acg);
- memcpy(iobuf, &acg, sblock.fs_cgsize);
- memset(iobuf + sblock.fs_cgsize, '\0',
- sblock.fs_bsize * 3 - sblock.fs_cgsize);
-
- wtfs(fsbtodb(&sblock, cgtod(&sblock, cylno)),
- sblock.fs_bsize * 3, iobuf, fso, Nflag);
+ wtfs(fsbtodb(&sblock, cgtod(&sblock, cylno)), sblock.fs_cgsize, &acg,
+ fso, Nflag);
DBG_DUMP_CG(&sblock, "new cg", &acg);
DBG_LEAVE;