when debug is set, list remaining duplicate blocks
[unix-history] / usr / src / sbin / fsck / pass4.c
CommitLineData
577b7874 1#ifndef lint
82dc9a9e 2static char version[] = "@(#)pass4.c 3.4 (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{
82dc9a9e
KM
14 register ino_t inumber;
15 register struct zlncnt *zlnp;
577b7874 16 struct inodesc idesc;
82dc9a9e 17 int n;
577b7874
KM
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:
993a756c 27 case DFOUND:
577b7874
KM
28 n = lncntp[inumber];
29 if (n)
30 adjust(&idesc, (short)n);
31 else {
82dc9a9e
KM
32 for (zlnp = zlnhead; zlnp; zlnp = zlnp->next)
33 if (zlnp->zlncnt == inumber) {
577b7874
KM
34 clri(&idesc, "UNREF", 1);
35 break;
36 }
37 }
38 break;
39
40 case DSTATE:
41 clri(&idesc, "UNREF", 1);
42 break;
43
993a756c
KM
44 case DCLEAR:
45 case FCLEAR:
577b7874
KM
46 clri(&idesc, "BAD/DUP", 1);
47 break;
48 }
49 }
577b7874
KM
50}
51
52pass4check(idesc)
53 register struct inodesc *idesc;
54{
62e6c152 55 register struct dups *dlp;
577b7874
KM
56 int nfrags, res = KEEPON;
57 daddr_t blkno = idesc->id_blkno;
58
59 for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) {
62e6c152 60 if (outrange(blkno, 1)) {
577b7874 61 res = SKIP;
62e6c152
KM
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;
82dc9a9e 69 /* free(dlp); */
62e6c152
KM
70 break;
71 }
72 if (dlp == 0) {
73 clrbmap(blkno);
74 n_blks--;
75 }
577b7874
KM
76 }
77 }
78 return (res);
79}