check for improper directory offsets; recover gracefully from read errors
[unix-history] / usr / src / sbin / fsck / pass4.c
CommitLineData
577b7874 1#ifndef lint
993a756c 2static char version[] = "@(#)pass4.c 3.2 (Berkeley) %G%";
577b7874
KM
3#endif
4
5#include <sys/param.h>
6#include <sys/inode.h>
7#include <sys/fs.h>
8#include "fsck.h"
9
10int pass4check();
11
12pass4()
13{
14 register ino_t inumber, *blp;
15 int n;
16 struct inodesc idesc;
17
18 bzero((char *)&idesc, sizeof(struct inodesc));
19 idesc.id_type = ADDR;
20 idesc.id_func = pass4check;
21 for (inumber = ROOTINO; inumber <= lastino; inumber++) {
22 idesc.id_number = inumber;
23 switch (statemap[inumber]) {
24
25 case FSTATE:
993a756c 26 case DFOUND:
577b7874
KM
27 n = lncntp[inumber];
28 if (n)
29 adjust(&idesc, (short)n);
30 else {
31 for (blp = badlncnt;blp < badlnp; blp++)
32 if (*blp == inumber) {
33 clri(&idesc, "UNREF", 1);
34 break;
35 }
36 }
37 break;
38
39 case DSTATE:
40 clri(&idesc, "UNREF", 1);
41 break;
42
993a756c
KM
43 case DCLEAR:
44 case FCLEAR:
577b7874
KM
45 clri(&idesc, "BAD/DUP", 1);
46 break;
47 }
48 }
577b7874
KM
49}
50
51pass4check(idesc)
52 register struct inodesc *idesc;
53{
54 register daddr_t *dlp;
55 int nfrags, res = KEEPON;
56 daddr_t blkno = idesc->id_blkno;
57
58 for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) {
59 if (outrange(blkno, 1))
60 res = SKIP;
61 else if (getbmap(blkno)) {
62 for (dlp = duplist; dlp < enddup; dlp++)
63 if (*dlp == blkno) {
64 *dlp = *--enddup;
65 return (KEEPON);
66 }
67 clrbmap(blkno);
68 n_blks--;
69 }
70 }
71 return (res);
72}