xref: /original-bsd/sbin/fsck/pass4.c (revision 5bfa3c83)
1 /*
2  * Copyright (c) 1980 Regents of the University of California.
3  * All rights reserved.  The Berkeley software License Agreement
4  * specifies the terms and conditions for redistribution.
5  */
6 
7 #ifndef lint
8 static char sccsid[] = "@(#)pass4.c	5.5 (Berkeley) 10/24/89";
9 #endif not lint
10 
11 #include <sys/param.h>
12 #include <ufs/dinode.h>
13 #include <ufs/fs.h>
14 #include "fsck.h"
15 
16 int	pass4check();
17 
18 pass4()
19 {
20 	register ino_t inumber;
21 	register struct zlncnt *zlnp;
22 	struct inodesc idesc;
23 	int n;
24 
25 	bzero((char *)&idesc, sizeof(struct inodesc));
26 	idesc.id_type = ADDR;
27 	idesc.id_func = pass4check;
28 	for (inumber = ROOTINO; inumber <= lastino; inumber++) {
29 		idesc.id_number = inumber;
30 		switch (statemap[inumber]) {
31 
32 		case FSTATE:
33 		case DFOUND:
34 			n = lncntp[inumber];
35 			if (n)
36 				adjust(&idesc, (short)n);
37 			else {
38 				for (zlnp = zlnhead; zlnp; zlnp = zlnp->next)
39 					if (zlnp->zlncnt == inumber) {
40 						zlnp->zlncnt = zlnhead->zlncnt;
41 						zlnp = zlnhead;
42 						zlnhead = zlnhead->next;
43 						free(zlnp);
44 						clri(&idesc, "UNREF", 1);
45 						break;
46 					}
47 			}
48 			break;
49 
50 		case DSTATE:
51 			clri(&idesc, "UNREF", 1);
52 			break;
53 
54 		case DCLEAR:
55 		case FCLEAR:
56 			clri(&idesc, "BAD/DUP", 1);
57 			break;
58 
59 		case USTATE:
60 			break;
61 
62 		default:
63 			errexit("BAD STATE %d FOR INODE I=%d",
64 			    statemap[inumber], inumber);
65 		}
66 	}
67 }
68 
69 pass4check(idesc)
70 	register struct inodesc *idesc;
71 {
72 	register struct dups *dlp;
73 	int nfrags, res = KEEPON;
74 	daddr_t blkno = idesc->id_blkno;
75 
76 	for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) {
77 		if (outrange(blkno, 1)) {
78 			res = SKIP;
79 		} else if (getbmap(blkno)) {
80 			for (dlp = duplist; dlp; dlp = dlp->next) {
81 				if (dlp->dup != blkno)
82 					continue;
83 				dlp->dup = duplist->dup;
84 				dlp = duplist;
85 				duplist = duplist->next;
86 				free(dlp);
87 				break;
88 			}
89 			if (dlp == 0) {
90 				clrbmap(blkno);
91 				n_blks--;
92 			}
93 		}
94 	}
95 	return (res);
96 }
97