On Fri, May 29, 2020 at 09:30:04AM +0200, Otto Moerbeek wrote: > On Thu, May 28, 2020 at 12:54:41PM -0600, Todd C. Miller wrote: > > > On Thu, 28 May 2020 20:53:07 +0200, Otto Moerbeek wrote: > > > > > Here's the separate diff for the prefcg loops. From FreeBSD. > > > > OK millert@ > > > > - todd > > > > And here's the updated diff against -current. I removed a redundant > cast in a fs_ipg * fs_ncg multiplication in fsck_ffs. Since both are > u_int32 and we know the product is <= UINT_MAX, so we do not need to > cast. > > I would like to make some progress here, I have a followup diff to > speed up Phase 5 of fsck_ffs...
Did anyone look closer at this? Did anyone test? -Otto > > Index: sbin/clri/clri.c > =================================================================== > RCS file: /cvs/src/sbin/clri/clri.c,v > retrieving revision 1.20 > diff -u -p -r1.20 clri.c > --- sbin/clri/clri.c 28 Jun 2019 13:32:43 -0000 1.20 > +++ sbin/clri/clri.c 29 May 2020 07:23:27 -0000 > @@ -68,7 +68,8 @@ main(int argc, char *argv[]) > char *fs, sblock[SBLOCKSIZE]; > size_t bsize; > off_t offset; > - int i, fd, imax, inonum; > + int i, fd; > + ino_t imax, inonum; > > if (argc < 3) > usage(); > Index: sbin/dumpfs/dumpfs.c > =================================================================== > RCS file: /cvs/src/sbin/dumpfs/dumpfs.c,v > retrieving revision 1.35 > diff -u -p -r1.35 dumpfs.c > --- sbin/dumpfs/dumpfs.c 17 Feb 2020 16:11:25 -0000 1.35 > +++ sbin/dumpfs/dumpfs.c 29 May 2020 07:23:27 -0000 > @@ -69,7 +69,7 @@ union { > #define acg cgun.cg > > int dumpfs(int, const char *); > -int dumpcg(const char *, int, int); > +int dumpcg(const char *, int, u_int); > int marshal(const char *); > int open_disk(const char *); > void pbits(void *, int); > @@ -163,6 +163,7 @@ dumpfs(int fd, const char *name) > size_t size; > off_t off; > int i, j; > + u_int cg; > > switch (afs.fs_magic) { > case FS_UFS2_MAGIC: > @@ -172,7 +173,7 @@ dumpfs(int fd, const char *name) > afs.fs_magic, ctime(&fstime)); > printf("superblock location\t%jd\tid\t[ %x %x ]\n", > (intmax_t)afs.fs_sblockloc, afs.fs_id[0], afs.fs_id[1]); > - printf("ncg\t%d\tsize\t%jd\tblocks\t%jd\n", > + printf("ncg\t%u\tsize\t%jd\tblocks\t%jd\n", > afs.fs_ncg, (intmax_t)fssize, (intmax_t)afs.fs_dsize); > break; > case FS_UFS1_MAGIC: > @@ -198,7 +199,7 @@ dumpfs(int fd, const char *name) > printf("cylgrp\t%s\tinodes\t%s\tfslevel %d\n", > i < 1 ? "static" : "dynamic", > i < 2 ? "4.2/4.3BSD" : "4.4BSD", i); > - printf("ncg\t%d\tncyl\t%d\tsize\t%d\tblocks\t%d\n", > + printf("ncg\t%u\tncyl\t%d\tsize\t%d\tblocks\t%d\n", > afs.fs_ncg, afs.fs_ncyl, afs.fs_ffs1_size, > afs.fs_ffs1_dsize); > break; > default: > @@ -223,9 +224,9 @@ dumpfs(int fd, const char *name) > (intmax_t)afs.fs_cstotal.cs_ndir, > (intmax_t)afs.fs_cstotal.cs_nifree, > (intmax_t)afs.fs_cstotal.cs_nffree); > - printf("bpg\t%d\tfpg\t%d\tipg\t%d\n", > + printf("bpg\t%d\tfpg\t%d\tipg\t%u\n", > afs.fs_fpg / afs.fs_frag, afs.fs_fpg, afs.fs_ipg); > - printf("nindir\t%d\tinopb\t%d\tmaxfilesize\t%ju\n", > + printf("nindir\t%d\tinopb\t%u\tmaxfilesize\t%ju\n", > afs.fs_nindir, afs.fs_inopb, > (uintmax_t)afs.fs_maxfilesize); > printf("sbsize\t%d\tcgsize\t%d\tcsaddr\t%jd\tcssize\t%d\n", > @@ -238,10 +239,10 @@ dumpfs(int fd, const char *name) > printf("nbfree\t%d\tndir\t%d\tnifree\t%d\tnffree\t%d\n", > afs.fs_ffs1_cstotal.cs_nbfree, afs.fs_ffs1_cstotal.cs_ndir, > afs.fs_ffs1_cstotal.cs_nifree, > afs.fs_ffs1_cstotal.cs_nffree); > - printf("cpg\t%d\tbpg\t%d\tfpg\t%d\tipg\t%d\n", > + printf("cpg\t%d\tbpg\t%d\tfpg\t%d\tipg\t%u\n", > afs.fs_cpg, afs.fs_fpg / afs.fs_frag, afs.fs_fpg, > afs.fs_ipg); > - printf("nindir\t%d\tinopb\t%d\tnspf\t%d\tmaxfilesize\t%ju\n", > + printf("nindir\t%d\tinopb\t%u\tnspf\t%d\tmaxfilesize\t%ju\n", > afs.fs_nindir, afs.fs_inopb, afs.fs_nspf, > (uintmax_t)afs.fs_maxfilesize); > printf("sbsize\t%d\tcgsize\t%d\tcgoffset %d\tcgmask\t0x%08x\n", > @@ -261,7 +262,7 @@ dumpfs(int fd, const char *name) > afs.fs_sblkno, afs.fs_cblkno, afs.fs_iblkno, afs.fs_dblkno); > printf("cgrotor\t%d\tfmod\t%d\tronly\t%d\tclean\t%d\n", > afs.fs_cgrotor, afs.fs_fmod, afs.fs_ronly, afs.fs_clean); > - printf("avgfpdir %d\tavgfilesize %d\n", > + printf("avgfpdir %u\tavgfilesize %u\n", > afs.fs_avgfpdir, afs.fs_avgfilesize); > printf("flags\t"); > if (afs.fs_magic == FS_UFS2_MAGIC || > @@ -296,8 +297,8 @@ dumpfs(int fd, const char *name) > if (pread(fd, (char *)afs.fs_csp + i, size, off) != size) > goto err; > } > - for (i = 0; i < afs.fs_ncg; i++) { > - struct csum *cs = &afs.fs_cs(&afs, i); > + for (cg = 0; cg < afs.fs_ncg; cg++) { > + struct csum *cs = &afs.fs_cs(&afs, cg); > if (i && i % 4 == 0) > printf("\n\t"); > printf("(%d,%d,%d,%d) ", > @@ -312,8 +313,8 @@ dumpfs(int fd, const char *name) > printf("blocks in last group %ld\n\n", > (long)((fssize % afs.fs_fpg) / afs.fs_frag)); > } > - for (i = 0; i < afs.fs_ncg; i++) > - if (dumpcg(name, fd, i)) > + for (cg = 0; cg < afs.fs_ncg; cg++) > + if (dumpcg(name, fd, cg)) > goto err; > return (0); > > @@ -322,13 +323,13 @@ err: warn("%s", name); > } > > int > -dumpcg(const char *name, int fd, int c) > +dumpcg(const char *name, int fd, u_int c) > { > time_t cgtime; > off_t cur; > int i, j; > > - printf("\ncg %d:\n", c); > + printf("\ncg %u:\n", c); > cur = (off_t)fsbtodb(&afs, cgtod(&afs, c)) * DEV_BSIZE; > if (pread(fd, &acg, afs.fs_bsize, cur) != afs.fs_bsize) { > warn("%s: error reading cg", name); > @@ -339,7 +340,7 @@ dumpcg(const char *name, int fd, int c) > cgtime = acg.cg_ffs2_time; > printf("magic\t%x\ttell\t%jx\ttime\t%s", > acg.cg_magic, (intmax_t)cur, ctime(&cgtime)); > - printf("cgx\t%d\tndblk\t%d\tniblk\t%d\tinitiblk %d\n", > + printf("cgx\t%u\tndblk\t%u\tniblk\t%u\tinitiblk %u\n", > acg.cg_cgx, acg.cg_ndblk, acg.cg_ffs2_niblk, > acg.cg_initediblk); > break; > @@ -349,7 +350,7 @@ dumpcg(const char *name, int fd, int c) > afs.fs_postblformat == FS_42POSTBLFMT ? > ((struct ocg *)&acg)->cg_magic : acg.cg_magic, > (intmax_t)cur, ctime(&cgtime)); > - printf("cgx\t%d\tncyl\t%d\tniblk\t%d\tndblk\t%d\n", > + printf("cgx\t%u\tncyl\t%d\tniblk\t%d\tndblk\t%u\n", > acg.cg_cgx, acg.cg_ncyl, acg.cg_niblk, acg.cg_ndblk); > break; > default: > @@ -358,10 +359,10 @@ dumpcg(const char *name, int fd, int c) > printf("nbfree\t%d\tndir\t%d\tnifree\t%d\tnffree\t%d\n", > acg.cg_cs.cs_nbfree, acg.cg_cs.cs_ndir, > acg.cg_cs.cs_nifree, acg.cg_cs.cs_nffree); > - printf("rotor\t%d\tirotor\t%d\tfrotor\t%d\nfrsum", > + printf("rotor\t%u\tirotor\t%u\tfrotor\t%u\nfrsum", > acg.cg_rotor, acg.cg_irotor, acg.cg_frotor); > for (i = 1, j = 0; i < afs.fs_frag; i++) { > - printf("\t%d", acg.cg_frsum[i]); > + printf("\t%u", acg.cg_frsum[i]); > j += i * acg.cg_frsum[i]; > } > printf("\nsum of frsum: %d", j); > @@ -416,8 +417,8 @@ marshal(const char *name) > /* -c unimplemented */ > printf("-e %d ", afs.fs_maxbpg); > printf("-f %d ", afs.fs_fsize); > - printf("-g %d ", afs.fs_avgfilesize); > - printf("-h %d ", afs.fs_avgfpdir); > + printf("-g %u ", afs.fs_avgfilesize); > + printf("-h %u ", afs.fs_avgfpdir); > /* -i unimplemented */ > printf("-m %d ", afs.fs_minfree); > printf("-o "); > Index: sbin/fsck_ffs/pass1.c > =================================================================== > RCS file: /cvs/src/sbin/fsck_ffs/pass1.c,v > retrieving revision 1.45 > diff -u -p -r1.45 pass1.c > --- sbin/fsck_ffs/pass1.c 12 Apr 2017 15:23:08 -0000 1.45 > +++ sbin/fsck_ffs/pass1.c 29 May 2020 07:23:27 -0000 > @@ -66,7 +66,7 @@ pass1(void) > ino_t inumber, inosused, ninosused; > size_t inospace; > struct inostat *info; > - int c; > + u_int c; > struct inodesc idesc; > daddr_t i, cgd; > u_int8_t *cp; > Index: sbin/fsck_ffs/pass1b.c > =================================================================== > RCS file: /cvs/src/sbin/fsck_ffs/pass1b.c,v > retrieving revision 1.21 > diff -u -p -r1.21 pass1b.c > --- sbin/fsck_ffs/pass1b.c 20 Jan 2015 18:22:21 -0000 1.21 > +++ sbin/fsck_ffs/pass1b.c 29 May 2020 07:23:27 -0000 > @@ -55,7 +55,7 @@ pass1b_info(char *buf, size_t buflen) > void > pass1b(void) > { > - int c, i; > + u_int c, i; > union dinode *dp; > struct inodesc idesc; > ino_t inumber; > Index: sbin/fsck_ffs/pass4.c > =================================================================== > RCS file: /cvs/src/sbin/fsck_ffs/pass4.c,v > retrieving revision 1.25 > diff -u -p -r1.25 pass4.c > --- sbin/fsck_ffs/pass4.c 13 Apr 2017 07:30:21 -0000 1.25 > +++ sbin/fsck_ffs/pass4.c 29 May 2020 07:23:27 -0000 > @@ -59,7 +59,8 @@ pass4(void) > struct zlncnt *zlnp; > union dinode *dp; > struct inodesc idesc; > - int n, c, i; > + int n, i; > + u_int c; > > memset(&idesc, 0, sizeof(struct inodesc)); > idesc.id_type = ADDR; > Index: sbin/fsck_ffs/pass5.c > =================================================================== > RCS file: /cvs/src/sbin/fsck_ffs/pass5.c,v > retrieving revision 1.48 > diff -u -p -r1.48 pass5.c > --- sbin/fsck_ffs/pass5.c 20 Jan 2015 18:22:21 -0000 1.48 > +++ sbin/fsck_ffs/pass5.c 29 May 2020 07:23:27 -0000 > @@ -48,26 +48,28 @@ > > #define MINIMUM(a, b) (((a) < (b)) ? (a) : (b)) > > -static int info_cg; > -static int info_maxcg; > +static u_int info_cg; > +static u_int info_maxcg; > > static int > pass5_info(char *buf, size_t buflen) > { > - return (snprintf(buf, buflen, "phase 5, cg %d/%d", > + return (snprintf(buf, buflen, "phase 5, cg %u/%u", > info_cg, info_maxcg) > 0); > } > > void > pass5(void) > { > - int c, blk, frags, basesize, sumsize, mapsize, savednrpos=0; > + int blk, frags, basesize, sumsize, mapsize, savednrpos=0; > + u_int c; > int inomapsize, blkmapsize; > struct fs *fs = &sblock; > struct cg *cg = &cgrp; > daddr_t dbase, dmax; > daddr_t d; > - long i, j, k, rewritecg = 0; > + long i, k, rewritecg = 0; > + ino_t j; > struct csum *cs; > struct csum_total cstotal; > struct inodesc idesc[3]; > @@ -179,7 +181,7 @@ pass5(void) > info_cg = c; > getblk(&cgblk, cgtod(fs, c), fs->fs_cgsize); > if (!cg_chkmagic(cg)) > - pfatal("CG %d: BAD MAGIC NUMBER\n", c); > + pfatal("CG %u: BAD MAGIC NUMBER\n", c); > dbase = cgbase(fs, c); > dmax = dbase + fs->fs_fpg; > if (dmax > fs->fs_size) > @@ -215,7 +217,7 @@ pass5(void) > newcg->cg_irotor = cg->cg_irotor; > } else { > newcg->cg_ncyl = 0; > - if ((unsigned)cg->cg_initediblk > fs->fs_ipg) > + if (cg->cg_initediblk > fs->fs_ipg) > newcg->cg_initediblk = fs->fs_ipg; > else > newcg->cg_initediblk = cg->cg_initediblk; > @@ -339,8 +341,8 @@ pass5(void) > continue; > if (cg_inosused(cg)[i] & (1 << k)) > continue; > - pwarn("ALLOCATED INODE %lld MARKED > FREE\n", > - ((long long)c * fs->fs_ipg + i * > 8) + k); > + pwarn("ALLOCATED INODE %llu MARKED > FREE\n", > + ((ino_t)c * fs->fs_ipg + i * 8) + > k); > } > } > for (i = 0; i < blkmapsize; i++) { > Index: sbin/fsck_ffs/setup.c > =================================================================== > RCS file: /cvs/src/sbin/fsck_ffs/setup.c,v > retrieving revision 1.66 > diff -u -p -r1.66 setup.c > --- sbin/fsck_ffs/setup.c 28 Jun 2019 13:32:43 -0000 1.66 > +++ sbin/fsck_ffs/setup.c 29 May 2020 07:23:27 -0000 > @@ -366,7 +366,7 @@ found: > else > inopb = sblock.fs_bsize / sizeof(struct ufs1_dinode); > if (INOPB(&sblock) != inopb) { > - pwarn("INCONSISTENT INOPB=%d\n", INOPB(&sblock)); > + pwarn("INCONSISTENT INOPB=%u\n", INOPB(&sblock)); > sblock.fs_inopb = inopb; > if (preen) > printf(" (FIXED)\n"); > Index: sbin/fsck_ffs/utilities.c > =================================================================== > RCS file: /cvs/src/sbin/fsck_ffs/utilities.c,v > retrieving revision 1.52 > diff -u -p -r1.52 utilities.c > --- sbin/fsck_ffs/utilities.c 6 Feb 2019 13:26:13 -0000 1.52 > +++ sbin/fsck_ffs/utilities.c 29 May 2020 07:23:27 -0000 > @@ -581,7 +581,7 @@ dofix(struct inodesc *idesc, char *msg) > return (0); > > default: > - errexit("UNKNOWN INODESC FIX MODE %d\n", idesc->id_fix); > + errexit("UNKNOWN INODESC FIX MODE %u\n", idesc->id_fix); > } > /* NOTREACHED */ > } > Index: sbin/fsirand/fsirand.c > =================================================================== > RCS file: /cvs/src/sbin/fsirand/fsirand.c,v > retrieving revision 1.42 > diff -u -p -r1.42 fsirand.c > --- sbin/fsirand/fsirand.c 17 Feb 2020 19:00:58 -0000 1.42 > +++ sbin/fsirand/fsirand.c 29 May 2020 07:23:27 -0000 > @@ -101,7 +101,8 @@ fsirand(char *device) > ino_t inumber; > daddr_t sblockloc, dblk; > char sbuf[SBSIZE], sbuftmp[SBSIZE]; > - int devfd, n, cg, i; > + int devfd, n, i; > + u_int cg; > char *devpath, *ib; > u_int32_t bsize = DEV_BSIZE; > struct disklabel label; > Index: sbin/growfs/growfs.c > =================================================================== > RCS file: /cvs/src/sbin/growfs/growfs.c,v > retrieving revision 1.53 > diff -u -p -r1.53 growfs.c > --- sbin/growfs/growfs.c 3 Jul 2019 03:24:01 -0000 1.53 > +++ sbin/growfs/growfs.c 29 May 2020 07:23:27 -0000 > @@ -136,8 +136,8 @@ static void usage(void); > static int isblock(struct fs *, unsigned char *, int); > static void clrblock(struct fs *, unsigned char *, int); > static void setblock(struct fs *, unsigned char *, int); > -static void initcg(int, time_t, int, unsigned int); > -static void updjcg(int, time_t, int, int, unsigned int); > +static void initcg(u_int, time_t, int, unsigned int); > +static void updjcg(u_int, time_t, int, int, unsigned int); > static void updcsloc(time_t, int, int, unsigned int); > static struct disklabel *get_disklabel(int); > static void return_disklabel(int, struct disklabel *, unsigned int); > @@ -167,8 +167,8 @@ int colwidth; > static void > growfs(int fsi, int fso, unsigned int Nflag) > { > - int i; > - int cylno, j; > + int i, j; > + u_int cg; > time_t utime; > char tmpbuf[100]; > > @@ -199,7 +199,7 @@ growfs(int fsi, int fso, unsigned int Nf > (float)sblock.fs_size * sblock.fs_fsize * B2MBFACTOR, > (intmax_t)fsbtodb(&sblock, sblock.fs_size), sblock.fs_bsize, > sblock.fs_fsize); > - printf("\tusing %d cylinder groups of %.2fMB, %d blks, %d inodes.\n", > + printf("\tusing %u cylinder groups of %.2fMB, %d blks, %u inodes.\n", > sblock.fs_ncg, (float)sblock.fs_fpg * sblock.fs_fsize * B2MBFACTOR, > sblock.fs_fpg / sblock.fs_frag, sblock.fs_ipg); > if (sblock.fs_flags & FS_DOSOFTDEP) > @@ -217,13 +217,13 @@ growfs(int fsi, int fso, unsigned int Nf > /* > * Iterate for only the new cylinder groups. > */ > - for (cylno = osblock.fs_ncg; cylno < sblock.fs_ncg; cylno++) { > - initcg(cylno, utime, fso, Nflag); > + for (cg = osblock.fs_ncg; cg < sblock.fs_ncg; cg++) { > + initcg(cg, utime, fso, Nflag); > if (quiet) > continue; > j = snprintf(tmpbuf, sizeof(tmpbuf), " %lld%s", > - fsbtodb(&sblock, cgsblock(&sblock, cylno)), > - cylno < (sblock.fs_ncg - 1) ? "," : ""); > + fsbtodb(&sblock, cgsblock(&sblock, cg)), > + cg < (sblock.fs_ncg - 1) ? "," : ""); > if (j >= sizeof(tmpbuf)) > j = sizeof(tmpbuf) - 1; > if (j < 0 || i + j >= colwidth) { > @@ -310,8 +310,8 @@ growfs(int fsi, int fso, unsigned int Nf > /* > * Write out the duplicate superblocks. > */ > - for (cylno = 0; cylno < sblock.fs_ncg; cylno++) { > - wtfs(fsbtodb(&sblock, cgsblock(&sblock, cylno)), > + for (cg = 0; cg < sblock.fs_ncg; cg++) { > + wtfs(fsbtodb(&sblock, cgsblock(&sblock, cg)), > (size_t)SBLOCKSIZE, (void *)&sblock, fso, Nflag); > } > } > @@ -323,7 +323,7 @@ growfs(int fsi, int fso, unsigned int Nf > * provisions for that case are removed here. > */ > static void > -initcg(int cylno, time_t utime, int fso, unsigned int Nflag) > +initcg(u_int cg, time_t utime, int fso, unsigned int Nflag) > { > static char *iobuf; > daddr_t d, dlower, dupper, blkno, start; > @@ -348,19 +348,19 @@ initcg(int cylno, time_t utime, int fso, > * Allow space for super block summary information in first > * cylinder group. > */ > - cbase = cgbase(&sblock, cylno); > + cbase = cgbase(&sblock, cg); > dmax = cbase + sblock.fs_fpg; > if (dmax > sblock.fs_size) > dmax = sblock.fs_size; > - dlower = cgsblock(&sblock, cylno) - cbase; > - dupper = cgdmin(&sblock, cylno) - cbase; > - if (cylno == 0) /* XXX fscs may be relocated */ > + dlower = cgsblock(&sblock, cg) - cbase; > + dupper = cgdmin(&sblock, cg) - cbase; > + if (cg == 0) /* XXX fscs may be relocated */ > dupper += howmany(sblock.fs_cssize, sblock.fs_fsize); > - cs = &fscs[cylno]; > + cs = &fscs[cg]; > memset(&acg, 0, sblock.fs_cgsize); > acg.cg_ffs2_time = utime; > acg.cg_magic = CG_MAGIC; > - acg.cg_cgx = cylno; > + acg.cg_cgx = cg; > acg.cg_ffs2_niblk = sblock.fs_ipg; > acg.cg_initediblk = MINIMUM(sblock.fs_ipg, 2 * INOPB(&sblock)); > acg.cg_ndblk = dmax - cbase; > @@ -370,7 +370,7 @@ initcg(int cylno, time_t utime, int fso, > if (sblock.fs_magic == FS_UFS2_MAGIC) { > acg.cg_iusedoff = start; > } else { > - if (cylno == sblock.fs_ncg - 1) > + if (cg == sblock.fs_ncg - 1) > acg.cg_ncyl = sblock.fs_ncyl % sblock.fs_cpg; > else > acg.cg_ncyl = sblock.fs_cpg; > @@ -404,15 +404,15 @@ initcg(int cylno, time_t utime, int fso, > errx(37, "panic: cylinder group too big"); > } > acg.cg_cs.cs_nifree += sblock.fs_ipg; > - if (cylno == 0) { > + if (cg == 0) { > for (i = 0; i < ROOTINO; i++) { > setbit(cg_inosused(&acg), i); > acg.cg_cs.cs_nifree--; > } > } > - if (cylno > 0) { > + if (cg > 0) { > /* > - * In cylno 0, beginning space is reserved > + * In cg 0, beginning space is reserved > * for boot and super blocks. > */ > for (d = 0; d < dlower; d += sblock.fs_frag) { > @@ -501,7 +501,7 @@ initcg(int cylno, time_t utime, int fso, > dp2++; > } > } > - wtfs(fsbtodb(&sblock, cgsblock(&sblock, cylno)), iobufsize, > + wtfs(fsbtodb(&sblock, cgsblock(&sblock, cg)), iobufsize, > iobuf, fso, Nflag); > > /* Initialize inodes for FFS1. */ > @@ -513,7 +513,7 @@ initcg(int cylno, time_t utime, int fso, > dp1->di_gen = arc4random(); > dp1++; > } > - wtfs(fsbtodb(&sblock, cgimin(&sblock, cylno) + i), > + wtfs(fsbtodb(&sblock, cgimin(&sblock, cg) + i), > (size_t)sblock.fs_bsize, &iobuf[start], fso, Nflag); > } > } > @@ -626,7 +626,7 @@ cond_bl_upd(daddr_t *block, struct gfs_b > * tables and cluster summary during all those operations. > */ > static void > -updjcg(int cylno, time_t utime, int fsi, int fso, unsigned int Nflag) > +updjcg(u_int cg, time_t utime, int fsi, int fso, unsigned int Nflag) > { > daddr_t cbase, dmax, dupper; > struct csum *cs; > @@ -637,7 +637,7 @@ updjcg(int cylno, time_t utime, int fsi, > * Read the former last (joining) cylinder group from disk, and make > * a copy. > */ > - rdfs(fsbtodb(&osblock, cgtod(&osblock, cylno)), > + rdfs(fsbtodb(&osblock, cgtod(&osblock, cg)), > (size_t)osblock.fs_cgsize, (void *)&aocg, fsi); > > memcpy(&cgun1, &cgun2, sizeof(cgun2)); > @@ -649,11 +649,11 @@ updjcg(int cylno, time_t utime, int fsi, > * to be zero instead of fs_cpg. As this is now no longer the last > * cylinder group we have to change that value now to fs_cpg. > */ > - if (cgbase(&osblock, cylno+1) == osblock.fs_size) { > + if (cgbase(&osblock, cg+1) == osblock.fs_size) { > if (sblock.fs_magic == FS_UFS1_MAGIC) > acg.cg_ncyl = sblock.fs_cpg; > > - wtfs(fsbtodb(&sblock, cgtod(&sblock, cylno)), > + wtfs(fsbtodb(&sblock, cgtod(&sblock, cg)), > (size_t)sblock.fs_cgsize, (void *)&acg, fso, Nflag); > > return; > @@ -662,18 +662,18 @@ updjcg(int cylno, time_t utime, int fsi, > /* > * Set up some variables needed later. > */ > - cbase = cgbase(&sblock, cylno); > + cbase = cgbase(&sblock, cg); > dmax = cbase + sblock.fs_fpg; > if (dmax > sblock.fs_size) > dmax = sblock.fs_size; > - dupper = cgdmin(&sblock, cylno) - cbase; > - if (cylno == 0) /* XXX fscs may be relocated */ > + dupper = cgdmin(&sblock, cg) - cbase; > + if (cg == 0) /* XXX fscs may be relocated */ > dupper += howmany(sblock.fs_cssize, sblock.fs_fsize); > > /* > * Set pointer to the cylinder summary for our cylinder group. > */ > - cs = fscs + cylno; > + cs = fscs + cg; > > /* > * Touch the cylinder group, update all fields in the cylinder group as > @@ -681,7 +681,7 @@ updjcg(int cylno, time_t utime, int fsi, > */ > acg.cg_time = utime; > if (sblock.fs_magic == FS_UFS1_MAGIC) { > - if (cylno == sblock.fs_ncg - 1) { > + if (cg == sblock.fs_ncg - 1) { > /* > * This is still the last cylinder group. > */ > @@ -727,7 +727,7 @@ updjcg(int cylno, time_t utime, int fsi, > * filesystem. > */ > if (isblock(&sblock, cg_blksfree(&acg), > - ((osblock.fs_size - cgbase(&sblock, cylno))/ > + ((osblock.fs_size - cgbase(&sblock, cg))/ > sblock.fs_frag))) { > /* > * The block is now completely available. > @@ -822,7 +822,7 @@ updjcg(int cylno, time_t utime, int fsi, > /* > * Write the updated "joining" cylinder group back to disk. > */ > - wtfs(fsbtodb(&sblock, cgtod(&sblock, cylno)), (size_t)sblock.fs_cgsize, > + wtfs(fsbtodb(&sblock, cgtod(&sblock, cg)), (size_t)sblock.fs_cgsize, > (void *)&acg, fso, Nflag); > } > > @@ -850,7 +850,7 @@ updcsloc(time_t utime, int fsi, int fso, > int blocks; > daddr_t cbase, dupper, odupper, d, f, g; > int ind; > - int cylno, inc; > + u_int cg, inc; > struct gfs_bpp *bp; > int i, l; > int lcs = 0; > @@ -1337,9 +1337,9 @@ updcsloc(time_t utime, int fsi, int fso, > * cylinder groups, within those over all non zero length > * inodes. > */ > - for (cylno = 0; cylno < osblock.fs_ncg; cylno++) { > + for (cg = 0; cg < osblock.fs_ncg; cg++) { > for (inc = osblock.fs_ipg - 1; inc > 0; inc--) { > - updrefs(cylno, (ino_t)inc, bp, fsi, fso, Nflag); > + updrefs(cg, (ino_t)inc, bp, fsi, fso, Nflag); > } > } > > @@ -1906,6 +1906,8 @@ main(int argc, char **argv) > sblock.fs_ncyl++; > } > sblock.fs_ncg = howmany(sblock.fs_size, sblock.fs_fpg); > + if ((ino_t)sblock.fs_ncg * sblock.fs_ipg > UINT_MAX) > + errx(1, "more than 2^32 inodes requested"); > maxino = sblock.fs_ncg * sblock.fs_ipg; > > if (sblock.fs_size % sblock.fs_fpg != 0 && > Index: sbin/newfs/mkfs.c > =================================================================== > RCS file: /cvs/src/sbin/newfs/mkfs.c,v > retrieving revision 1.100 > diff -u -p -r1.100 mkfs.c > --- sbin/newfs/mkfs.c 28 May 2020 15:48:29 -0000 1.100 > +++ sbin/newfs/mkfs.c 29 May 2020 07:23:27 -0000 > @@ -131,7 +131,7 @@ static long iobufsize; > daddr_t alloc(int, int); > static int charsperline(void); > static int ilog2(int); > -void initcg(int, time_t); > +void initcg(u_int, time_t); > void wtfs(daddr_t, int, void *); > int fsinit1(time_t, mode_t, uid_t, gid_t); > int fsinit2(time_t, mode_t, uid_t, gid_t); > @@ -170,7 +170,8 @@ mkfs(struct partition *pp, char *fsys, i > int i, j, width, origdensity, fragsperinode, minfpg, optimalfpg; > int lastminfpg, mincylgrps; > uint32_t bpg; > - long cylno, csfrags; > + long csfrags; > + u_int cg; > char tmpbuf[100]; /* XXX this will break in about 2,500 years */ > > if ((fsun = calloc(1, sizeof (union fs_u))) == NULL || > @@ -427,6 +428,10 @@ mkfs(struct partition *pp, char *fsys, i > " to %d to enlarge last cylinder group", optimalfpg, > sblock.fs_fpg); > > + if ((ino_t)sblock.fs_ipg * sblock.fs_ncg > UINT_MAX) > + errx(42, "more than 2^32 inodes, increase density, block or " > + "fragment size"); > + > /* > * Back to filling superblock fields. > */ > @@ -498,7 +503,7 @@ mkfs(struct partition *pp, char *fsys, i > (float)sblock.fs_size * sblock.fs_fsize * B2MBFACTOR, > (intmax_t)fsbtodb(&sblock, sblock.fs_size) / > (sectorsize / DEV_BSIZE), sectorsize); > - printf("%d cylinder groups of %.2fMB, %d blocks, %d" > + printf("%u cylinder groups of %.2fMB, %d blocks, %u" > " inodes each\n", sblock.fs_ncg, > (float)sblock.fs_fpg * sblock.fs_fsize * B2MBFACTOR, > sblock.fs_fpg / sblock.fs_frag, sblock.fs_ipg); > @@ -558,13 +563,13 @@ mkfs(struct partition *pp, char *fsys, i > * writing out in each cylinder group. > */ > bcopy((char *)&sblock, iobuf, SBLOCKSIZE); > - for (cylno = 0; cylno < sblock.fs_ncg; cylno++) { > - cur_cylno = (sig_atomic_t)cylno; > - initcg(cylno, utime); > + for (cg = 0; cg < sblock.fs_ncg; cg++) { > + cur_cylno = (sig_atomic_t)cg; > + initcg(cg, utime); > if (quiet) > continue; > j = snprintf(tmpbuf, sizeof tmpbuf, " %lld,", > - (long long)fsbtodb(&sblock, cgsblock(&sblock, cylno))); > + (long long)fsbtodb(&sblock, cgsblock(&sblock, cg))); > if (j >= sizeof tmpbuf) > j = sizeof tmpbuf - 1; > if (j < 0 || i+j >= width) { > @@ -619,9 +624,9 @@ mkfs(struct partition *pp, char *fsys, i > * Initialize a cylinder group. > */ > void > -initcg(int cylno, time_t utime) > +initcg(u_int cg, time_t utime) > { > - int i, j, d, dlower, dupper, blkno, start; > + u_int i, j, d, dlower, dupper, blkno, start; > daddr_t cbase, dmax; > struct ufs1_dinode *dp1; > struct ufs2_dinode *dp2; > @@ -631,23 +636,23 @@ initcg(int cylno, time_t utime) > * Determine block bounds for cylinder group. Allow space for > * super block summary information in first cylinder group. > */ > - cbase = cgbase(&sblock, cylno); > + cbase = cgbase(&sblock, cg); > dmax = cbase + sblock.fs_fpg; > if (dmax > sblock.fs_size) > dmax = sblock.fs_size; > - if (fsbtodb(&sblock, cgsblock(&sblock, cylno)) + iobufsize / DEV_BSIZE > + if (fsbtodb(&sblock, cgsblock(&sblock, cg)) + iobufsize / DEV_BSIZE > > fssize) > errx(40, "inode table does not fit in cylinder group"); > > - dlower = cgsblock(&sblock, cylno) - cbase; > - dupper = cgdmin(&sblock, cylno) - cbase; > - if (cylno == 0) > + dlower = cgsblock(&sblock, cg) - cbase; > + dupper = cgdmin(&sblock, cg) - cbase; > + if (cg == 0) > dupper += howmany(sblock.fs_cssize, sblock.fs_fsize); > - cs = &fscs[cylno]; > + cs = &fscs[cg]; > memset(&acg, 0, sblock.fs_cgsize); > acg.cg_ffs2_time = utime; > acg.cg_magic = CG_MAGIC; > - acg.cg_cgx = cylno; > + acg.cg_cgx = cg; > acg.cg_ffs2_niblk = sblock.fs_ipg; > acg.cg_initediblk = MINIMUM(sblock.fs_ipg, 2 * INOPB(&sblock)); > acg.cg_ndblk = dmax - cbase; > @@ -655,7 +660,7 @@ initcg(int cylno, time_t utime) > start = sizeof(struct cg); > if (Oflag <= 1) { > /* Hack to maintain compatibility with old fsck. */ > - if (cylno == sblock.fs_ncg - 1) > + if (cg == sblock.fs_ncg - 1) > acg.cg_ncyl = 0; > else > acg.cg_ncyl = sblock.fs_cpg; > @@ -675,18 +680,18 @@ initcg(int cylno, time_t utime) > acg.cg_freeoff = acg.cg_iusedoff + howmany(sblock.fs_ipg, CHAR_BIT); > acg.cg_nextfreeoff = acg.cg_freeoff + howmany(sblock.fs_fpg, CHAR_BIT); > if (acg.cg_nextfreeoff > sblock.fs_cgsize) > - errx(37, "panic: cylinder group too big: %d > %d", > + errx(37, "panic: cylinder group too big: %u > %d", > acg.cg_nextfreeoff, sblock.fs_cgsize); > acg.cg_cs.cs_nifree += sblock.fs_ipg; > - if (cylno == 0) { > + if (cg == 0) { > for (i = 0; i < ROOTINO; i++) { > setbit(cg_inosused(&acg), i); > acg.cg_cs.cs_nifree--; > } > } > - if (cylno > 0) { > + if (cg > 0) { > /* > - * In cylno 0, space is reserved for boot and super blocks. > + * In cg 0, space is reserved for boot and super blocks. > */ > for (d = 0; d < dlower; d += sblock.fs_frag) { > blkno = d / sblock.fs_frag; > @@ -732,6 +737,10 @@ initcg(int cylno, time_t utime) > * and two blocks worth of inodes in a single write. > */ > start = sblock.fs_bsize > SBLOCKSIZE ? sblock.fs_bsize : SBLOCKSIZE; > + > + if (cg == 0 && acg.cg_cs.cs_nbfree == 0) > + errx(42, "cg 0: summary info is too large to fit"); > + > bcopy((char *)&acg, &iobuf[start], sblock.fs_cgsize); > start += sblock.fs_bsize; > dp1 = (struct ufs1_dinode *)(&iobuf[start]); > @@ -745,7 +754,7 @@ initcg(int cylno, time_t utime) > dp2++; > } > } > - wtfs(fsbtodb(&sblock, cgsblock(&sblock, cylno)), iobufsize, iobuf); > + wtfs(fsbtodb(&sblock, cgsblock(&sblock, cg)), iobufsize, iobuf); > > if (Oflag <= 1) { > /* Initialize inodes for FFS1. */ > @@ -757,7 +766,7 @@ initcg(int cylno, time_t utime) > dp1->di_gen = arc4random(); > dp1++; > } > - wtfs(fsbtodb(&sblock, cgimin(&sblock, cylno) + i), > + wtfs(fsbtodb(&sblock, cgimin(&sblock, cg) + i), > sblock.fs_bsize, &iobuf[start]); > } > } > Index: sys/ufs/ffs/ffs_alloc.c > =================================================================== > RCS file: /cvs/src/sys/ufs/ffs/ffs_alloc.c,v > retrieving revision 1.112 > diff -u -p -r1.112 ffs_alloc.c > --- sys/ufs/ffs/ffs_alloc.c 29 May 2020 06:46:15 -0000 1.112 > +++ sys/ufs/ffs/ffs_alloc.c 29 May 2020 07:23:29 -0000 > @@ -63,14 +63,14 @@ > (fs)->fs_fsmnt, (cp)); \ > } while (0) > > -daddr_t ffs_alloccg(struct inode *, int, daddr_t, int); > -struct buf * ffs_cgread(struct fs *, struct inode *, int); > +daddr_t ffs_alloccg(struct inode *, u_int, daddr_t, int); > +struct buf * ffs_cgread(struct fs *, struct inode *, u_int); > daddr_t ffs_alloccgblk(struct inode *, struct buf *, daddr_t); > ufsino_t ffs_dirpref(struct inode *); > -daddr_t ffs_fragextend(struct inode *, int, daddr_t, int, int); > -daddr_t ffs_hashalloc(struct inode *, int, daddr_t, int, > - daddr_t (*)(struct inode *, int, daddr_t, int)); > -daddr_t ffs_nodealloccg(struct inode *, int, daddr_t, int); > +daddr_t ffs_fragextend(struct inode *, u_int, daddr_t, int, > int); > +daddr_t ffs_hashalloc(struct inode *, u_int, daddr_t, int, > + daddr_t (*)(struct inode *, u_int, daddr_t, int)); > +daddr_t ffs_nodealloccg(struct inode *, u_int, daddr_t, int); > daddr_t ffs_mapsearch(struct fs *, struct cg *, daddr_t, int); > > static const struct timeval fserr_interval = { 2, 0 }; > @@ -102,7 +102,7 @@ ffs_alloc(struct inode *ip, daddr_t lbn, > static struct timeval fsfull_last; > struct fs *fs; > daddr_t bno; > - int cg; > + u_int cg; > int error; > > *bnp = 0; > @@ -174,7 +174,8 @@ ffs_realloccg(struct inode *ip, daddr_t > struct fs *fs; > struct buf *bp = NULL; > daddr_t quota_updated = 0; > - int cg, request, error; > + int request, error; > + u_int cg; > daddr_t bprev, bno; > > if (bpp != NULL) > @@ -360,7 +361,8 @@ ffs_inode_alloc(struct inode *pip, mode_ > struct fs *fs; > struct inode *ip; > ufsino_t ino, ipref; > - int cg, error; > + u_int cg; > + int error; > > *vpp = NULL; > fs = pip->i_fs; > @@ -449,11 +451,12 @@ ufsino_t > ffs_dirpref(struct inode *pip) > { > struct fs *fs; > - int cg, prefcg, dirsize, cgsize; > - int avgifree, avgbfree, avgndir, curdirsize; > - int minifree, minbfree, maxndir; > - int mincg, minndir; > - int maxcontigdirs; > + u_int cg, prefcg; > + u_int dirsize, cgsize; > + u_int avgifree, avgbfree, avgndir, curdirsize; > + u_int minifree, minbfree, maxndir; > + u_int mincg, minndir; > + u_int maxcontigdirs; > > fs = pip->i_fs; > > @@ -592,7 +595,8 @@ int32_t > ffs1_blkpref(struct inode *ip, daddr_t lbn, int indx, int32_t *bap) > { > struct fs *fs; > - int cg, inocg, avgbfree, startcg; > + u_int cg, inocg; > + u_int avgbfree, startcg; > uint32_t pref; > > KASSERT(indx <= 0 || bap != NULL); > @@ -692,7 +696,8 @@ int64_t > ffs2_blkpref(struct inode *ip, daddr_t lbn, int indx, int64_t *bap) > { > struct fs *fs; > - int cg, inocg, avgbfree, startcg; > + u_int cg, inocg; > + u_int avgbfree, startcg; > uint64_t pref; > > KASSERT(indx <= 0 || bap != NULL); > @@ -796,12 +801,12 @@ ffs2_blkpref(struct inode *ip, daddr_t l > * 3) brute force search for a free block. > */ > daddr_t > -ffs_hashalloc(struct inode *ip, int cg, daddr_t pref, int size, > - daddr_t (*allocator)(struct inode *, int, daddr_t, int)) > +ffs_hashalloc(struct inode *ip, u_int cg, daddr_t pref, int size, > + daddr_t (*allocator)(struct inode *, u_int, daddr_t, int)) > { > struct fs *fs; > daddr_t result; > - int i, icg = cg; > + u_int i, icg = cg; > > fs = ip->i_fs; > /* > @@ -839,7 +844,7 @@ ffs_hashalloc(struct inode *ip, int cg, > } > > struct buf * > -ffs_cgread(struct fs *fs, struct inode *ip, int cg) > +ffs_cgread(struct fs *fs, struct inode *ip, u_int cg) > { > struct buf *bp; > > @@ -864,7 +869,7 @@ ffs_cgread(struct fs *fs, struct inode * > * if they are, allocate them. > */ > daddr_t > -ffs_fragextend(struct inode *ip, int cg, daddr_t bprev, int osize, int nsize) > +ffs_fragextend(struct inode *ip, u_int cg, daddr_t bprev, int osize, int > nsize) > { > struct fs *fs; > struct cg *cgp; > @@ -930,7 +935,7 @@ ffs_fragextend(struct inode *ip, int cg, > * and if it is, allocate it. > */ > daddr_t > -ffs_alloccg(struct inode *ip, int cg, daddr_t bpref, int size) > +ffs_alloccg(struct inode *ip, u_int cg, daddr_t bpref, int size) > { > struct fs *fs; > struct cg *cgp; > @@ -1085,7 +1090,7 @@ gotit: > > /* inode allocation routine */ > daddr_t > -ffs_nodealloccg(struct inode *ip, int cg, daddr_t ipref, int mode) > +ffs_nodealloccg(struct inode *ip, u_int cg, daddr_t ipref, int mode) > { > struct fs *fs; > struct cg *cgp; > @@ -1379,10 +1384,10 @@ ffs_freefile(struct inode *pip, ufsino_t > struct cg *cgp; > struct buf *bp; > struct timespec now; > - int cg; > + u_int cg; > > fs = pip->i_fs; > - if ((u_int)ino >= fs->fs_ipg * fs->fs_ncg) > + if (ino >= fs->fs_ipg * fs->fs_ncg) > panic("ffs_freefile: range: dev = 0x%x, ino = %d, fs = %s", > pip->i_dev, ino, fs->fs_fsmnt); > > Index: sys/ufs/ffs/fs.h > =================================================================== > RCS file: /cvs/src/sys/ufs/ffs/fs.h,v > retrieving revision 1.42 > diff -u -p -r1.42 fs.h > --- sys/ufs/ffs/fs.h 27 Nov 2016 13:27:55 -0000 1.42 > +++ sys/ufs/ffs/fs.h 29 May 2020 07:23:29 -0000 > @@ -202,7 +202,7 @@ struct fs { > int32_t fs_ffs1_time; /* last time written */ > int32_t fs_ffs1_size; /* # of blocks in fs / frags */ > int32_t fs_ffs1_dsize; /* # of data blocks in fs */ > - int32_t fs_ncg; /* # of cylinder groups */ > + u_int32_t fs_ncg; /* # of cylinder groups */ > int32_t fs_bsize; /* size of basic blocks / bytes */ > int32_t fs_fsize; /* size of frag blocks / bytes */ > int32_t fs_frag; /* # of frags in a block in fs */ > @@ -225,7 +225,7 @@ struct fs { > int32_t fs_csmask; /* csum block offset (now unused) */ > int32_t fs_csshift; /* csum block number (now unused) */ > int32_t fs_nindir; /* value of NINDIR */ > - int32_t fs_inopb; /* inodes per file system block */ > + u_int32_t fs_inopb; /* inodes per file system block */ > int32_t fs_nspf; /* DEV_BSIZE sectors per frag */ > /* yet another configuration parameter */ > int32_t fs_optim; /* optimization preference, see below */ > @@ -247,7 +247,7 @@ struct fs { > int32_t fs_ncyl; /* cylinders in file system */ > /* these fields can be computed from the others */ > int32_t fs_cpg; /* cylinders per group */ > - int32_t fs_ipg; /* inodes per group */ > + u_int32_t fs_ipg; /* inodes per group */ > int32_t fs_fpg; /* blocks per group * fs_frag */ > /* this data must be re-computed after crashes */ > struct csum fs_ffs1_cstotal; /* cylinder summary information */ > @@ -278,11 +278,11 @@ struct fs { > int64_t fs_dsize; /* number of data blocks in fs */ > int64_t fs_csaddr; /* blk addr of cyl grp summary area */ > int64_t fs_pendingblocks; /* blocks in process of being freed */ > - int32_t fs_pendinginodes; /* inodes in process of being freed */ > - int32_t fs_snapinum[FSMAXSNAP];/* space reserved for snapshots */ > + u_int32_t fs_pendinginodes; /* inodes in process of being freed */ > + u_int32_t fs_snapinum[FSMAXSNAP];/* space reserved for snapshots */ > /* back to stuff that has been around a while */ > - int32_t fs_avgfilesize; /* expected average file size */ > - int32_t fs_avgfpdir; /* expected # of files per directory */ > + u_int32_t fs_avgfilesize; /* expected average file size */ > + u_int32_t fs_avgfpdir; /* expected # of files per directory */ > int32_t fs_sparecon[26]; /* reserved for future constants */ > u_int32_t fs_flags; /* see FS_ flags below */ > int32_t fs_fscktime; /* last time fsck(8)ed */ > @@ -377,25 +377,25 @@ struct cg { > int32_t cg_firstfield; /* historic cyl groups linked list */ > int32_t cg_magic; /* magic number */ > int32_t cg_time; /* time last written */ > - int32_t cg_cgx; /* we are the cgx'th cylinder group */ > + u_int32_t cg_cgx; /* we are the cgx'th cylinder group */ > int16_t cg_ncyl; /* number of cyl's this cg */ > int16_t cg_niblk; /* number of inode blocks this cg */ > - int32_t cg_ndblk; /* number of data blocks this cg */ > + u_int32_t cg_ndblk; /* number of data blocks this cg */ > struct csum cg_cs; /* cylinder summary information */ > - int32_t cg_rotor; /* position of last used block */ > - int32_t cg_frotor; /* position of last used frag */ > - int32_t cg_irotor; /* position of last used inode */ > - int32_t cg_frsum[MAXFRAG]; /* counts of available frags */ > + u_int32_t cg_rotor; /* position of last used block */ > + u_int32_t cg_frotor; /* position of last used frag */ > + u_int32_t cg_irotor; /* position of last used inode */ > + u_int32_t cg_frsum[MAXFRAG]; /* counts of available frags */ > int32_t cg_btotoff; /* (int32) block totals per cylinder */ > int32_t cg_boff; /* (u_int16) free block positions */ > - int32_t cg_iusedoff; /* (u_int8) used inode map */ > - int32_t cg_freeoff; /* (u_int8) free block map */ > - int32_t cg_nextfreeoff; /* (u_int8) next available space */ > - int32_t cg_clustersumoff; /* (u_int32) counts of avail clusters */ > - int32_t cg_clusteroff; /* (u_int8) free cluster map */ > - int32_t cg_nclusterblks; /* number of clusters this cg */ > - int32_t cg_ffs2_niblk; /* number of inode blocks this cg */ > - int32_t cg_initediblk; /* last initialized inode */ > + u_int32_t cg_iusedoff; /* (u_int8) used inode map */ > + u_int32_t cg_freeoff; /* (u_int8) free block map */ > + u_int32_t cg_nextfreeoff; /* (u_int8) next available space */ > + u_int32_t cg_clustersumoff; /* (u_int32) counts of avail clusters */ > + u_int32_t cg_clusteroff; /* (u_int8) free cluster map */ > + u_int32_t cg_nclusterblks; /* number of clusters this cg */ > + u_int32_t cg_ffs2_niblk; /* number of inode blocks this cg */ > + u_int32_t cg_initediblk; /* last initialized inode */ > int32_t cg_sparecon32[3]; /* reserved for future use */ > int64_t cg_ffs2_time; /* time last written */ > int64_t cg_sparecon64[3]; /* reserved for future use */ >