xref: /csrg-svn/sbin/fsck/pass4.c (revision 17937)
1 #ifndef lint
2 static char version[] = "@(#)pass4.c	3.2 (Berkeley) 02/08/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 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 }
73