xref: /original-bsd/sbin/fsck/pass3.c (revision b9cffa27)
1 /*
2  * Copyright (c) 1980, 1986 The Regents of the University of California.
3  * All rights reserved.
4  *
5  * %sccs.include.redist.c%
6  */
7 
8 #ifndef lint
9 static char sccsid[] = "@(#)pass3.c	5.11 (Berkeley) 11/04/91";
10 #endif /* not lint */
11 
12 #include <sys/param.h>
13 #include <ufs/ufs/dinode.h>
14 #include <ufs/ffs/fs.h>
15 #include "fsck.h"
16 
17 pass3()
18 {
19 	register struct inoinfo **inpp, *inp;
20 	ino_t orphan;
21 	int loopcnt;
22 
23 	for (inpp = &inpsort[inplast - 1]; inpp >= inpsort; inpp--) {
24 		inp = *inpp;
25 		if (inp->i_number == ROOTINO ||
26 		    !(inp->i_parent == 0 || statemap[inp->i_number] == DSTATE))
27 			continue;
28 		if (statemap[inp->i_number] == DCLEAR)
29 			continue;
30 		for (loopcnt = 0; ; loopcnt++) {
31 			orphan = inp->i_number;
32 			if (inp->i_parent == 0 ||
33 			    statemap[inp->i_parent] != DSTATE ||
34 			    loopcnt > numdirs)
35 				break;
36 			inp = getinoinfo(inp->i_parent);
37 		}
38 		(void)linkup(orphan, inp->i_dotdot);
39 		inp->i_parent = inp->i_dotdot = lfdir;
40 		lncntp[lfdir]--;
41 		statemap[orphan] = DFOUND;
42 		propagate();
43 	}
44 }
45