* Copyright (c) 1980, 1986 The Regents of the University of California.
* %sccs.include.redist.c%
static char sccsid
[] = "@(#)pass1.c 5.20 (Berkeley) %G%";
#include <ufs/ufs/dinode.h>
struct dinode
*getnextinode();
* 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
++) {
checkinode(inumber
, &idesc
);
checkinode(inumber
, idesc
)
register struct inodesc
*idesc
;
register struct dinode
*dp
;
char symbuf
[MAXSYMLINKLEN
];
dp
= getnextinode(inumber
);
mode
= dp
->di_mode
& IFMT
;
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=%lu", inumber
);
if (reply("CLEAR") == 1) {
statemap
[inumber
] = USTATE
;
if (/* dp->di_size < 0 || */
dp
->di_size
+ sblock
.fs_bsize
- 1 < dp
->di_size
) {
printf("bad size %qu:", dp
->di_size
);
if (!preen
&& mode
== IFMT
&& reply("HOLD BAD BLOCK") == 1) {
dp
->di_size
= sblock
.fs_fsize
;
dp
->di_mode
= IFREG
|0600;
ndb
= howmany(dp
->di_size
, sblock
.fs_bsize
);
printf("bad size %qu ndb %d:",
if (mode
== IFBLK
|| mode
== IFCHR
)
dp
->di_size
> 0 && dp
->di_size
< MAXSYMLINKLEN
&&
if (bread(fsreadfd
, symbuf
,
fsbtodb(&sblock
, dp
->di_db
[0]),
errexit("cannot read symlink");
printf("convert symlink %d(%s) of size %d\n",
inumber
, symbuf
, (long)dp
->di_size
);
bcopy(symbuf
, (caddr_t
)dp
->di_shortlink
,
* Fake ndb value so direct/indirect block checks below
* will detect any garbage after symlink string.
if (dp
->di_size
< sblock
.fs_maxsymlinklen
) {
ndb
= howmany(dp
->di_size
, sizeof(daddr_t
));
for (ndb
= 1; j
> 1; j
--)
for (j
= ndb
; j
< NDADDR
; j
++)
printf("bad direct addr: %ld\n", dp
->di_db
[j
]);
for (j
= 0, ndb
-= NDADDR
; ndb
> 0; j
++)
printf("bad indirect addr: %ld\n",
lncntp
[inumber
] = dp
->di_nlink
;
zlnp
= (struct zlncnt
*)malloc(sizeof *zlnp
);
pfatal("LINK COUNT TABLE OVERFLOW");
if (reply("CONTINUE") == 0)
statemap
[inumber
] = DCLEAR
;
statemap
[inumber
] = DSTATE
;
statemap
[inumber
] = FSTATE
;
typemap
[inumber
] = IFTODT(mode
);
if (doinglevel2
&& (dp
->di_ouid
!= -1 || dp
->di_ogid
!= -1)) {
dp
->di_uid
= dp
->di_ouid
;
dp
->di_gid
= dp
->di_ogid
;
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=%lu (%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=%lu", inumber
);
statemap
[inumber
] = FCLEAR
;
if (reply("CLEAR") == 1) {
statemap
[inumber
] = USTATE
;
register struct inodesc
*idesc
;
daddr_t blkno
= idesc
->id_blkno
;
register struct dups
*dlp
;
if ((anyout
= chkrange(blkno
, idesc
->id_numfrags
)) != 0) {
blkerror(idesc
->id_number
, "BAD", blkno
);
if (badblk
++ >= MAXBAD
) {
pwarn("EXCESSIVE BAD BLKS I=%lu",
else if (reply("CONTINUE") == 0)
for (nfrags
= idesc
->id_numfrags
; nfrags
> 0; blkno
++, nfrags
--) {
if (anyout
&& chkrange(blkno
, 1)) {
} else if (!testbmap(blkno
)) {
blkerror(idesc
->id_number
, "DUP", blkno
);
if (dupblk
++ >= MAXDUP
) {
pwarn("EXCESSIVE DUP BLKS I=%lu",
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