* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
static char sccsid
[] = "@(#)pass5.c 5.3 (Berkeley) %G%";
int c
, blk
, frags
, sumsize
, mapsize
;
register struct cg
*newcg
= (struct cg
*)buf
;
bzero((char *)newcg
, sblock
.fs_cgsize
);
newcg
->cg_magic
= CG_MAGIC
;
bzero((char *)&idesc
, sizeof(struct inodesc
));
bzero((char *)&cstotal
, sizeof(struct csum
));
sumsize
= cgrp
.cg_iused
- (char *)(&cgrp
);
mapsize
= &cgrp
.cg_free
[howmany(sblock
.fs_fpg
, NBBY
)] -
for (c
= 0; c
< sblock
.fs_ncg
; c
++) {
getblk(&cgblk
, cgtod(&sblock
, c
), sblock
.fs_cgsize
);
if (cgrp
.cg_magic
!= CG_MAGIC
)
pfatal("CG %d: BAD MAGIC NUMBER\n", c
);
dbase
= cgbase(&sblock
, c
);
dmax
= dbase
+ sblock
.fs_fpg
;
if (dmax
> sblock
.fs_size
)
newcg
->cg_time
= cgrp
.cg_time
;
if (c
== sblock
.fs_ncg
- 1)
newcg
->cg_ncyl
= sblock
.fs_ncyl
% sblock
.fs_cpg
;
newcg
->cg_ncyl
= sblock
.fs_cpg
;
newcg
->cg_niblk
= sblock
.fs_ipg
;
newcg
->cg_ndblk
= dmax
- dbase
;
newcg
->cg_cs
.cs_ndir
= 0;
newcg
->cg_cs
.cs_nffree
= 0;
newcg
->cg_cs
.cs_nbfree
= 0;
newcg
->cg_cs
.cs_nifree
= sblock
.fs_ipg
;
if (cgrp
.cg_rotor
< newcg
->cg_ndblk
)
newcg
->cg_rotor
= cgrp
.cg_rotor
;
if (cgrp
.cg_frotor
< newcg
->cg_ndblk
)
newcg
->cg_frotor
= cgrp
.cg_frotor
;
if (cgrp
.cg_irotor
< newcg
->cg_niblk
)
newcg
->cg_irotor
= cgrp
.cg_irotor
;
bzero((char *)newcg
->cg_frsum
, sizeof newcg
->cg_frsum
);
bzero((char *)newcg
->cg_btot
, sizeof newcg
->cg_btot
);
bzero((char *)newcg
->cg_b
, sizeof newcg
->cg_b
);
bzero((char *)newcg
->cg_free
, howmany(sblock
.fs_fpg
, NBBY
));
bzero((char *)newcg
->cg_iused
, howmany(sblock
.fs_ipg
, NBBY
));
for (i
= 0; i
< sblock
.fs_ipg
; j
++, i
++) {
newcg
->cg_cs
.cs_nifree
--;
setbit(newcg
->cg_iused
, i
);
errexit("BAD STATE %d FOR INODE I=%d",
for (i
= 0; i
< ROOTINO
; i
++) {
setbit(newcg
->cg_iused
, i
);
newcg
->cg_cs
.cs_nifree
--;
d
<= dmax
- sblock
.fs_frag
;
d
+= sblock
.fs_frag
, i
+= sblock
.fs_frag
) {
for (j
= 0; j
< sblock
.fs_frag
; j
++) {
setbit(newcg
->cg_free
, i
+ j
);
if (frags
== sblock
.fs_frag
) {
newcg
->cg_cs
.cs_nbfree
++;
j
= cbtocylno(&sblock
, i
);
newcg
->cg_b
[j
][cbtorpos(&sblock
, i
)]++;
newcg
->cg_cs
.cs_nffree
+= frags
;
blk
= blkmap(&sblock
, newcg
->cg_free
, i
);
fragacct(&sblock
, blk
, newcg
->cg_frsum
, 1);
for (frags
= d
; d
< dmax
; d
++) {
setbit(newcg
->cg_free
, d
- dbase
);
newcg
->cg_cs
.cs_nffree
++;
/* tahoe compiler workaround */
blk
= blkmap(&sblock
, newcg
->cg_free
, x
);
blk
= blkmap(&sblock
, newcg
->cg_free
, (frags
- dbase
));
fragacct(&sblock
, blk
, newcg
->cg_frsum
, 1);
cstotal
.cs_nffree
+= newcg
->cg_cs
.cs_nffree
;
cstotal
.cs_nbfree
+= newcg
->cg_cs
.cs_nbfree
;
cstotal
.cs_nifree
+= newcg
->cg_cs
.cs_nifree
;
cstotal
.cs_ndir
+= newcg
->cg_cs
.cs_ndir
;
if (bcmp(newcg
->cg_iused
, cgrp
.cg_iused
, mapsize
) != 0 &&
dofix(&idesc
, "BLK(S) MISSING IN BIT MAPS")) {
bcopy(newcg
->cg_iused
, cgrp
.cg_iused
, mapsize
);
if (bcmp((char *)newcg
, (char *)&cgrp
, sumsize
) != 0 &&
dofix(&idesc
, "SUMMARY INFORMATION BAD")) {
bcopy((char *)newcg
, (char *)&cgrp
, sumsize
);
cs
= &sblock
.fs_cs(&sblock
, c
);
if (bcmp((char *)&newcg
->cg_cs
, (char *)cs
, sizeof *cs
) != 0 &&
dofix(&idesc
, "FREE BLK COUNT(S) WRONG IN SUPERBLK")) {
bcopy((char *)&newcg
->cg_cs
, (char *)cs
, sizeof *cs
);
if (bcmp((char *)&cstotal
, (char *)&sblock
.fs_cstotal
, sizeof *cs
) != 0
&& dofix(&idesc
, "FREE BLK COUNT(S) WRONG IN SUPERBLK")) {
bcopy((char *)&cstotal
, (char *)&sblock
.fs_cstotal
, sizeof *cs
);