xref: /csrg-svn/sbin/fsck/pass4.c (revision 21759)
1 #ifndef lint
2 static char version[] = "@(#)pass4.c	3.4 (Berkeley) 06/02/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;
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 
52 pass4check(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 }
80