additional sanity checks
[unix-history] / usr / src / sbin / fsck / pass1b.c
CommitLineData
76797561 1/*
fe32782c
KM
2 * Copyright (c) 1980, 1986 The Regents of the University of California.
3 * All rights reserved.
4 *
70ab3c27 5 * %sccs.include.redist.c%
76797561
DF
6 */
7
7fa08060 8#ifndef lint
d72e970b 9static char sccsid[] = "@(#)pass1b.c 5.8 (Berkeley) %G%";
fe32782c 10#endif /* not lint */
7fa08060
KM
11
12#include <sys/param.h>
72e5286b 13#include <ufs/dinode.h>
4d7f4685 14#include <ufs/fs.h>
d72e970b 15#include <string.h>
7fa08060
KM
16#include "fsck.h"
17
18int pass1bcheck();
62e6c152 19static struct dups *duphead;
7fa08060
KM
20
21pass1b()
22{
23 register int c, i;
569ec282 24 register struct dinode *dp;
7fa08060
KM
25 struct inodesc idesc;
26 ino_t inumber;
27
28 bzero((char *)&idesc, sizeof(struct inodesc));
29 idesc.id_type = ADDR;
30 idesc.id_func = pass1bcheck;
62e6c152 31 duphead = duplist;
7fa08060
KM
32 inumber = 0;
33 for (c = 0; c < sblock.fs_ncg; c++) {
34 for (i = 0; i < sblock.fs_ipg; i++, inumber++) {
a50c3bff
KM
35 if (inumber < ROOTINO)
36 continue;
7fa08060
KM
37 dp = ginode(inumber);
38 if (dp == NULL)
39 continue;
40 idesc.id_number = inumber;
41 if (statemap[inumber] != USTATE &&
42 (ckinode(dp, &idesc) & STOP))
569ec282 43 return;
7fa08060
KM
44 }
45 }
7fa08060
KM
46}
47
48pass1bcheck(idesc)
49 register struct inodesc *idesc;
50{
62e6c152 51 register struct dups *dlp;
7fa08060
KM
52 int nfrags, res = KEEPON;
53 daddr_t blkno = idesc->id_blkno;
54
55 for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) {
569ec282 56 if (chkrange(blkno, 1))
7fa08060 57 res = SKIP;
62e6c152
KM
58 for (dlp = duphead; dlp; dlp = dlp->next) {
59 if (dlp->dup == blkno) {
569ec282 60 blkerror(idesc->id_number, "DUP", blkno);
62e6c152
KM
61 dlp->dup = duphead->dup;
62 duphead->dup = blkno;
63 duphead = duphead->next;
7fa08060 64 }
62e6c152
KM
65 if (dlp == muldup)
66 break;
67 }
68 if (muldup == 0 || duphead == muldup->next)
69 return (STOP);
7fa08060
KM
70 }
71 return (res);
72}