adb2880375084d70ba011152345976430e164350
* Copyright (c) 1980, 1986, 1993
* The Regents of the University of California. All rights reserved.
* %sccs.include.redist.c%
static char sccsid
[] = "@(#)pass5.c 8.2 (Berkeley) %G%";
#include <ufs/ufs/dinode.h>
int c
, blk
, frags
, basesize
, sumsize
, mapsize
, savednrpos
;
register struct fs
*fs
= &sblock
;
register struct cg
*cg
= &cgrp
;
register struct cg
*newcg
= (struct cg
*)buf
;
struct ocg
*ocg
= (struct ocg
*)buf
;
bzero((char *)newcg
, (size_t)fs
->fs_cgsize
);
newcg
->cg_niblk
= fs
->fs_ipg
;
if (fs
->fs_maxcontig
< 2 && fs
->fs_contigsumsize
> 0) {
pwarn("DELETING CLUSTERING MAPS\n");
if (preen
|| reply("DELETE CLUSTERING MAPS")) {
fs
->fs_contigsumsize
= 0;
if (fs
->fs_maxcontig
> 1) {
if (fs
->fs_contigsumsize
< 1) {
} else if (fs
->fs_contigsumsize
< fs
->fs_maxcontig
&&
fs
->fs_contigsumsize
< FS_MAXCONTIG
) {
i
= fs
->fs_contigsumsize
;
MIN(fs
->fs_maxcontig
, FS_MAXCONTIG
);
if (CGSIZE(fs
) > fs
->fs_bsize
) {
pwarn("CANNOT %s CLUSTER MAPS\n", doit
);
fs
->fs_contigsumsize
= i
;
reply("CREATE CLUSTER MAPS")) {
pwarn("%sING CLUSTER MAPS\n",
fragroundup(fs
, CGSIZE(fs
));
switch ((int)fs
->fs_postblformat
) {
basesize
= (char *)(&ocg
->cg_btot
[0]) - (char *)(&ocg
->cg_link
);
sumsize
= &ocg
->cg_iused
[0] - (char *)(&ocg
->cg_btot
[0]);
mapsize
= &ocg
->cg_free
[howmany(fs
->fs_fpg
, NBBY
)] -
(u_char
*)&ocg
->cg_iused
[0];
ocg
->cg_magic
= CG_MAGIC
;
savednrpos
= fs
->fs_nrpos
;
case FS_DYNAMICPOSTBLFMT
:
&newcg
->cg_space
[0] - (u_char
*)(&newcg
->cg_link
);
newcg
->cg_btotoff
+ fs
->fs_cpg
* sizeof(long);
newcg
->cg_iusedoff
= newcg
->cg_boff
+
fs
->fs_cpg
* fs
->fs_nrpos
* sizeof(short);
newcg
->cg_iusedoff
+ howmany(fs
->fs_ipg
, NBBY
);
if (fs
->fs_contigsumsize
<= 0) {
newcg
->cg_nextfreeoff
= newcg
->cg_freeoff
+
howmany(fs
->fs_cpg
* fs
->fs_spc
/ NSPF(fs
), NBBY
);
newcg
->cg_clustersumoff
= newcg
->cg_freeoff
+
howmany(fs
->fs_cpg
* fs
->fs_spc
/ NSPF(fs
), NBBY
) -
newcg
->cg_clustersumoff
=
roundup(newcg
->cg_clustersumoff
, sizeof(long));
newcg
->cg_clusteroff
= newcg
->cg_clustersumoff
+
(fs
->fs_contigsumsize
+ 1) * sizeof(long);
newcg
->cg_nextfreeoff
= newcg
->cg_clusteroff
+
howmany(fs
->fs_cpg
* fs
->fs_spc
/ NSPB(fs
), NBBY
);
newcg
->cg_magic
= CG_MAGIC
;
basesize
= &newcg
->cg_space
[0] - (u_char
*)(&newcg
->cg_link
);
sumsize
= newcg
->cg_iusedoff
- newcg
->cg_btotoff
;
mapsize
= newcg
->cg_nextfreeoff
- newcg
->cg_iusedoff
;
errexit("UNKNOWN ROTATIONAL TABLE FORMAT %d\n",
bzero((char *)&idesc
[0], sizeof idesc
);
for (i
= 0; i
< 3; i
++) {
bzero((char *)&cstotal
, sizeof(struct csum
));
j
= blknum(fs
, fs
->fs_size
+ fs
->fs_frag
- 1);
for (i
= fs
->fs_size
; i
< j
; i
++)
for (c
= 0; c
< fs
->fs_ncg
; c
++) {
getblk(&cgblk
, cgtod(fs
, c
), fs
->fs_cgsize
);
pfatal("CG %d: BAD MAGIC NUMBER\n", c
);
dmax
= dbase
+ fs
->fs_fpg
;
newcg
->cg_time
= cg
->cg_time
;
newcg
->cg_ncyl
= fs
->fs_ncyl
% fs
->fs_cpg
;
newcg
->cg_ncyl
= fs
->fs_cpg
;
newcg
->cg_ndblk
= dmax
- dbase
;
if (fs
->fs_contigsumsize
> 0)
newcg
->cg_nclusterblks
= newcg
->cg_ndblk
/ fs
->fs_frag
;
newcg
->cg_cs
.cs_ndir
= 0;
newcg
->cg_cs
.cs_nffree
= 0;
newcg
->cg_cs
.cs_nbfree
= 0;
newcg
->cg_cs
.cs_nifree
= fs
->fs_ipg
;
if (cg
->cg_rotor
< newcg
->cg_ndblk
)
newcg
->cg_rotor
= cg
->cg_rotor
;
if (cg
->cg_frotor
< newcg
->cg_ndblk
)
newcg
->cg_frotor
= cg
->cg_frotor
;
if (cg
->cg_irotor
< newcg
->cg_niblk
)
newcg
->cg_irotor
= cg
->cg_irotor
;
bzero((char *)&newcg
->cg_frsum
[0], sizeof newcg
->cg_frsum
);
bzero((char *)&cg_blktot(newcg
)[0],
(size_t)(sumsize
+ mapsize
));
if (fs
->fs_postblformat
== FS_42POSTBLFMT
)
ocg
->cg_magic
= CG_MAGIC
;
for (i
= 0; i
< fs
->fs_ipg
; j
++, i
++) {
newcg
->cg_cs
.cs_nifree
--;
setbit(cg_inosused(newcg
), i
);
errexit("BAD STATE %d FOR INODE I=%d",
for (i
= 0; i
< ROOTINO
; i
++) {
setbit(cg_inosused(newcg
), i
);
newcg
->cg_cs
.cs_nifree
--;
d
+= fs
->fs_frag
, i
+= fs
->fs_frag
) {
for (j
= 0; j
< fs
->fs_frag
; j
++) {
setbit(cg_blksfree(newcg
), i
+ j
);
if (frags
== fs
->fs_frag
) {
newcg
->cg_cs
.cs_nbfree
++;
cg_blks(fs
, newcg
, j
)[cbtorpos(fs
, i
)]++;
if (fs
->fs_contigsumsize
> 0)
setbit(cg_clustersfree(newcg
),
newcg
->cg_cs
.cs_nffree
+= frags
;
blk
= blkmap(fs
, cg_blksfree(newcg
), i
);
ffs_fragacct(fs
, blk
, newcg
->cg_frsum
, 1);
if (fs
->fs_contigsumsize
> 0) {
long *sump
= cg_clustersum(newcg
);
u_char
*mapp
= cg_clustersfree(newcg
);
for (i
= 0; i
< newcg
->cg_nclusterblks
; i
++) {
if (run
> fs
->fs_contigsumsize
)
run
= fs
->fs_contigsumsize
;
if ((i
& (NBBY
- 1)) != (NBBY
- 1)) {
if (run
> fs
->fs_contigsumsize
)
run
= fs
->fs_contigsumsize
;
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((char *)&newcg
->cg_cs
, (char *)cs
, sizeof *cs
) != 0 &&
dofix(&idesc
[0], "FREE BLK COUNT(S) WRONG IN SUPERBLK")) {
bcopy((char *)&newcg
->cg_cs
, (char *)cs
, sizeof *cs
);
bcopy((char *)newcg
, (char *)cg
, (size_t)fs
->fs_cgsize
);
if (bcmp(cg_inosused(newcg
),
cg_inosused(cg
), mapsize
) != 0 &&
dofix(&idesc
[1], "BLK(S) MISSING IN BIT MAPS")) {
bcopy(cg_inosused(newcg
), cg_inosused(cg
),
if ((bcmp((char *)newcg
, (char *)cg
, basesize
) != 0 ||
bcmp((char *)&cg_blktot(newcg
)[0],
(char *)&cg_blktot(cg
)[0], sumsize
) != 0) &&
dofix(&idesc
[2], "SUMMARY INFORMATION BAD")) {
bcopy((char *)newcg
, (char *)cg
, (size_t)basesize
);
bcopy((char *)&cg_blktot(newcg
)[0],
(char *)&cg_blktot(cg
)[0], (size_t)sumsize
);
if (fs
->fs_postblformat
== FS_42POSTBLFMT
)
fs
->fs_nrpos
= savednrpos
;
if (bcmp((char *)&cstotal
, (char *)&fs
->fs_cstotal
, sizeof *cs
) != 0
&& dofix(&idesc
[0], "FREE BLK COUNT(S) WRONG IN SUPERBLK")) {
bcopy((char *)&cstotal
, (char *)&fs
->fs_cstotal
, sizeof *cs
);