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