xref: /csrg-svn/sbin/fsck/pass4.c (revision 16266)
1*16266Smckusick #ifndef lint
2*16266Smckusick static char version[] = "@(#)pass4.c	3.1 (Berkeley) 03/31/84";
3*16266Smckusick #endif
4*16266Smckusick 
5*16266Smckusick #include <sys/param.h>
6*16266Smckusick #include <sys/inode.h>
7*16266Smckusick #include <sys/fs.h>
8*16266Smckusick #include "fsck.h"
9*16266Smckusick 
10*16266Smckusick int	pass4check();
11*16266Smckusick 
12*16266Smckusick pass4()
13*16266Smckusick {
14*16266Smckusick 	register ino_t inumber, *blp;
15*16266Smckusick 	int n;
16*16266Smckusick 	struct inodesc idesc;
17*16266Smckusick 
18*16266Smckusick 	bzero((char *)&idesc, sizeof(struct inodesc));
19*16266Smckusick 	idesc.id_type = ADDR;
20*16266Smckusick 	idesc.id_func = pass4check;
21*16266Smckusick 	for (inumber = ROOTINO; inumber <= lastino; inumber++) {
22*16266Smckusick 		idesc.id_number = inumber;
23*16266Smckusick 		switch (statemap[inumber]) {
24*16266Smckusick 
25*16266Smckusick 		case FSTATE:
26*16266Smckusick 			n = lncntp[inumber];
27*16266Smckusick 			if (n)
28*16266Smckusick 				adjust(&idesc, (short)n);
29*16266Smckusick 			else {
30*16266Smckusick 				for (blp = badlncnt;blp < badlnp; blp++)
31*16266Smckusick 					if (*blp == inumber) {
32*16266Smckusick 						clri(&idesc, "UNREF", 1);
33*16266Smckusick 						break;
34*16266Smckusick 					}
35*16266Smckusick 			}
36*16266Smckusick 			break;
37*16266Smckusick 
38*16266Smckusick 		case DSTATE:
39*16266Smckusick 			clri(&idesc, "UNREF", 1);
40*16266Smckusick 			break;
41*16266Smckusick 
42*16266Smckusick 		case CLEAR:
43*16266Smckusick 			clri(&idesc, "BAD/DUP", 1);
44*16266Smckusick 			break;
45*16266Smckusick 		}
46*16266Smckusick 	}
47*16266Smckusick 	if (imax - ROOTINO - n_files != sblock.fs_cstotal.cs_nifree) {
48*16266Smckusick 		pwarn("FREE INODE COUNT WRONG IN SUPERBLK");
49*16266Smckusick 		if (preen)
50*16266Smckusick 			printf(" (FIXED)\n");
51*16266Smckusick 		if (preen || reply("FIX") == 1) {
52*16266Smckusick 			sblock.fs_cstotal.cs_nifree = imax - ROOTINO - n_files;
53*16266Smckusick 			sbdirty();
54*16266Smckusick 		}
55*16266Smckusick 	}
56*16266Smckusick 	flush(&dfile, &fileblk);
57*16266Smckusick }
58*16266Smckusick 
59*16266Smckusick pass4check(idesc)
60*16266Smckusick 	register struct inodesc *idesc;
61*16266Smckusick {
62*16266Smckusick 	register daddr_t *dlp;
63*16266Smckusick 	int nfrags, res = KEEPON;
64*16266Smckusick 	daddr_t blkno = idesc->id_blkno;
65*16266Smckusick 
66*16266Smckusick 	for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) {
67*16266Smckusick 		if (outrange(blkno, 1))
68*16266Smckusick 			res = SKIP;
69*16266Smckusick 		else if (getbmap(blkno)) {
70*16266Smckusick 			for (dlp = duplist; dlp < enddup; dlp++)
71*16266Smckusick 				if (*dlp == blkno) {
72*16266Smckusick 					*dlp = *--enddup;
73*16266Smckusick 					return (KEEPON);
74*16266Smckusick 				}
75*16266Smckusick 			clrbmap(blkno);
76*16266Smckusick 			n_blks--;
77*16266Smckusick 		}
78*16266Smckusick 	}
79*16266Smckusick 	return (res);
80*16266Smckusick }
81