- int c;
- daddr_t dbase, d, dmin, dmax;
- long i, j, s;
- register struct csum *cs;
-
- sblock.fs_nbfree = 0;
- sblock.fs_nffree = 0;
- for (c = 0; c < sblock.fs_ncg; c++) {
- bread(cgimin(c,&sblock), (char *)itab,
- sblock.fs_ipg * sizeof (struct dinode));
- dbase = cgbase(c, &sblock);
- dmax = dbase + sblock.fs_fpg;
- if (dmax > sblock.fs_size)
- dmax = sblock.fs_size;
- cs = &sblock.fs_cs(c);
- cgrp.cg_time = time((long)0);
- cgrp.cg_magic = CG_MAGIC;
- cgrp.cg_cgx = c;
- cgrp.cg_ncyl = sblock.fs_cpg;
- cgrp.cg_niblk = sblock.fs_ipg;
- cgrp.cg_ndblk = dmax - dbase;
- cgrp.cg_ndir = 0;
- cgrp.cg_nffree = 0;
- cgrp.cg_nbfree = 0;
- cgrp.cg_nifree = 0;
- for (i = 0; i < sblock.fs_ipg; i++)
- switch (itab[i].di_mode&IFMT) {
-
- case 0:
- cgrp.cg_nifree++;
- clrbit(cgrp.cg_iused, i);
- continue;
-
- case IFDIR:
- cgrp.cg_ndir++;
- /* fall into ... */
-
- default:
- setbit(cgrp.cg_iused, i);
- continue;
- }
- while (i < MAXIPG) {
- clrbit(cgrp.cg_iused, i);
- i++;
- }
- for (s = 0; s < MAXCPG; s++)
- for (i = 0; i < NRPOS; i++)
- cgrp.cg_b[s][i] = 0;
- dmin = cgdmin(c, &sblock) - dbase;
- if (c == 0)
- dmin += howmany(cssize(&sblock), BSIZE) * FRAG;
- for (d = 0; d < dmin; d++)
- clrbit(cgrp.cg_free, d);
-#define getbmap(i) isset(bmap, i)
- for (; (d + FRAG) <= dmax - dbase; d += FRAG) {
- j = 0;
- for (i = 0; i < FRAG; i++) {
- if (!getbmap(dbase+d+i)) {
- setbit(cgrp.cg_free, d+i);
- j++;
- } else
- clrbit(cgrp.cg_free, d+i);
- }
- if (j == FRAG) {
- cgrp.cg_nbfree++;
- s = d * NSPF;
- cgrp.cg_b[s/sblock.fs_spc]
- [s%sblock.fs_nsect*NRPOS/sblock.fs_nsect]++;
- } else
- cgrp.cg_nffree += j;
- }
- for (; d < dmax - dbase; d++) {
- if (!getbmap(dbase+d)) {
- setbit(cgrp.cg_free, d);
- cgrp.cg_nffree++;
- } else
- clrbit(cgrp.cg_free, d);
- }
- for (; d < MAXBPG; d++)
- clrbit(cgrp.cg_free, d);
- sblock.fs_nffree += cgrp.cg_nffree;
- sblock.fs_nbfree += cgrp.cg_nbfree;
- cs->cs_ndir = cgrp.cg_ndir;
- cs->cs_nifree = cgrp.cg_nifree;
- cs->cs_nbfree = cgrp.cg_nbfree;
- bwrite(cgtod(c, &sblock), (char *)&cgrp, sblock.fs_cgsize);
- }
- sblock.fs_ronly = 0;
- sblock.fs_fmod = 0;
- bwrite(SBLOCK, (char *)&sblock, sizeof (sblock));
- for (i = 0; i < howmany(cssize(&sblock), BSIZE); i++) {
- bwrite(csaddr(&sblock) + (i * FRAG),
- (char *)sblock.fs_csp[i], BSIZE);