static char version
[] = "@(#)pass1.c 3.7 (Berkeley) %G%";
* Set file system reserved blocks in used block map.
for (c
= 0; c
< sblock
.fs_ncg
; c
++) {
cgd
= cgdmin(&sblock
, c
);
cgd
+= howmany(sblock
.fs_cssize
, sblock
.fs_fsize
);
i
= cgsblock(&sblock
, c
);
* Find all allocated blocks.
bzero((char *)&idesc
, sizeof(struct inodesc
));
idesc
.id_func
= pass1check
;
for (c
= 0; c
< sblock
.fs_ncg
; c
++) {
for (i
= 0; i
< sblock
.fs_ipg
; i
++, inumber
++) {
if (bcmp((char *)dp
->di_db
, (char *)zino
.di_db
,
NDADDR
* sizeof(daddr_t
)) ||
bcmp((char *)dp
->di_ib
, (char *)zino
.di_ib
,
NIADDR
* sizeof(daddr_t
)) ||
dp
->di_mode
|| dp
->di_size
) {
pfatal("PARTIALLY ALLOCATED INODE I=%u",
if (reply("CLEAR") == 1) {
statemap
[inumber
] = USTATE
;
printf("bad size %d:", dp
->di_size
);
ndb
= howmany(dp
->di_size
, sblock
.fs_bsize
);
for (j
= ndb
; j
< NDADDR
; j
++)
printf("bad direct addr: %d\n",
for (j
= 0, ndb
-= NDADDR
; ndb
> 0; j
++)
printf("bad indirect addr: %d\n",
if (!preen
&& (dp
->di_mode
& IFMT
) == IFMT
&&
reply("HOLD BAD BLOCK") == 1) {
dp
->di_size
= sblock
.fs_fsize
;
dp
->di_mode
= IFREG
|0600;
} else if (ftypeok(dp
) == 0)
lncntp
[inumber
] = dp
->di_nlink
;
zlnp
= (struct zlncnt
*)malloc(sizeof *zlnp
);
pfatal("LINK COUNT TABLE OVERFLOW");
if (reply("CONTINUE") == 0)
statemap
[inumber
] = DIRCT(dp
) ? DSTATE
: FSTATE
;
badblk
= dupblk
= 0; maxblk
= 0;
idesc
.id_number
= inumber
;
(void)ckinode(dp
, &idesc
);
idesc
.id_entryno
*= btodb(sblock
.fs_fsize
);
if (dp
->di_blocks
!= idesc
.id_entryno
) {
pwarn("INCORRECT BLOCK COUNT I=%u (%ld should be %ld)",
inumber
, dp
->di_blocks
, idesc
.id_entryno
);
printf(" (CORRECTED)\n");
else if (reply("CORRECT") == 0)
dp
->di_blocks
= idesc
.id_entryno
;
pfatal("UNKNOWN FILE TYPE I=%u", inumber
);
if (reply("CLEAR") == 1) {
register struct inodesc
*idesc
;
daddr_t blkno
= idesc
->id_blkno
;
register struct dups
*dlp
;
if ((anyout
= outrange(blkno
, idesc
->id_numfrags
)) != 0) {
blkerr(idesc
->id_number
, "BAD", blkno
);
if (++badblk
>= MAXBAD
) {
pwarn("EXCESSIVE BAD BLKS I=%u",
else if (reply("CONTINUE") == 0)
for (nfrags
= idesc
->id_numfrags
; nfrags
> 0; blkno
++, nfrags
--) {
if (anyout
&& outrange(blkno
, 1)) {
} else if (!getbmap(blkno
)) {
blkerr(idesc
->id_number
, "DUP", blkno
);
if (++dupblk
>= MAXDUP
) {
pwarn("EXCESSIVE DUP BLKS I=%u",
else if (reply("CONTINUE") == 0)
new = (struct dups
*)malloc(sizeof(struct dups
));
pfatal("DUP TABLE OVERFLOW.");
if (reply("CONTINUE") == 0)
new->next
= muldup
->next
;
for (dlp
= duplist
; dlp
!= muldup
; dlp
= dlp
->next
)
if (dlp
== muldup
&& dlp
->dup
!= blkno
)
* count the number of blocks found in id_entryno