xref: /csrg-svn/sbin/fsck/pass3.c (revision 16265)
1 #ifndef lint
2 static char version[] = "@(#)pass3.c	3.1 (Berkeley) 03/31/84";
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	pass2check();
11 
12 pass3()
13 {
14 	register DINODE *dp;
15 	struct inodesc idesc;
16 	ino_t inumber, orphan;
17 	int loopcnt;
18 
19 	bzero((char *)&idesc, sizeof(struct inodesc));
20 	idesc.id_type = DATA;
21 	for (inumber = ROOTINO; inumber <= lastino; inumber++) {
22 		if (statemap[inumber] == DSTATE) {
23 			pathp = pathname;
24 			*pathp++ = '?';
25 			*pathp = '\0';
26 			idesc.id_func = findino;
27 			srchname = "..";
28 			idesc.id_parent = inumber;
29 			loopcnt = 0;
30 			do {
31 				orphan = idesc.id_parent;
32 				if ((dp = ginode(orphan)) == NULL)
33 					break;
34 				idesc.id_parent = 0;
35 				idesc.id_filesize = dp->di_size;
36 				idesc.id_number = orphan;
37 				(void)ckinode(dp, &idesc);
38 				if (idesc.id_parent == 0)
39 					break;
40 				if (loopcnt >= sblock.fs_cstotal.cs_ndir)
41 					break;
42 				loopcnt++;
43 			} while (statemap[idesc.id_parent] == DSTATE);
44 			if (linkup(orphan, idesc.id_parent) == 1) {
45 				idesc.id_func = pass2check;
46 				idesc.id_number = lfdir;
47 				descend(&idesc, orphan);
48 			}
49 		}
50 	}
51 }
52