xref: /csrg-svn/sbin/fsck/pass4.c (revision 21744)
1 #ifndef lint
2 static char version[] = "@(#)pass4.c	3.3 (Berkeley) 05/31/85";
3 #endif
4 
5 #include <sys/param.h>
6 #include <sys/inode.h>
7 #include <sys/fs.h>
8 #include "fsck.h"
9 
10 int	pass4check();
11 
12 pass4()
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:
26 		case DFOUND:
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 
43 		case DCLEAR:
44 		case FCLEAR:
45 			clri(&idesc, "BAD/DUP", 1);
46 			break;
47 		}
48 	}
49 }
50 
51 pass4check(idesc)
52 	register struct inodesc *idesc;
53 {
54 	register struct dups *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; dlp = dlp->next) {
63 				if (dlp->dup != blkno)
64 					continue;
65 				dlp->dup = duplist->dup;
66 				dlp = duplist;
67 				duplist = duplist->next;
68 				free(dlp);
69 				break;
70 			}
71 			if (dlp == 0) {
72 				clrbmap(blkno);
73 				n_blks--;
74 			}
75 		}
76 	}
77 	return (res);
78 }
79