date and time created 85/06/03 17:31:54 by mckusick
[unix-history] / usr / src / sbin / fsck / pass4.c
... / ...
CommitLineData
1#ifndef lint
2static char version[] = "@(#)pass4.c 3.4 (Berkeley) %G%";
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;
15 register struct zlncnt *zlnp;
16 struct inodesc idesc;
17 int n;
18
19 bzero((char *)&idesc, sizeof(struct inodesc));
20 idesc.id_type = ADDR;
21 idesc.id_func = pass4check;
22 for (inumber = ROOTINO; inumber <= lastino; inumber++) {
23 idesc.id_number = inumber;
24 switch (statemap[inumber]) {
25
26 case FSTATE:
27 case DFOUND:
28 n = lncntp[inumber];
29 if (n)
30 adjust(&idesc, (short)n);
31 else {
32 for (zlnp = zlnhead; zlnp; zlnp = zlnp->next)
33 if (zlnp->zlncnt == inumber) {
34 clri(&idesc, "UNREF", 1);
35 break;
36 }
37 }
38 break;
39
40 case DSTATE:
41 clri(&idesc, "UNREF", 1);
42 break;
43
44 case DCLEAR:
45 case FCLEAR:
46 clri(&idesc, "BAD/DUP", 1);
47 break;
48 }
49 }
50}
51
52pass4check(idesc)
53 register struct inodesc *idesc;
54{
55 register struct dups *dlp;
56 int nfrags, res = KEEPON;
57 daddr_t blkno = idesc->id_blkno;
58
59 for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) {
60 if (outrange(blkno, 1)) {
61 res = SKIP;
62 } else if (getbmap(blkno)) {
63 for (dlp = duplist; dlp; dlp = dlp->next) {
64 if (dlp->dup != blkno)
65 continue;
66 dlp->dup = duplist->dup;
67 dlp = duplist;
68 duplist = duplist->next;
69 /* free(dlp); */
70 break;
71 }
72 if (dlp == 0) {
73 clrbmap(blkno);
74 n_blks--;
75 }
76 }
77 }
78 return (res);
79}