xref: /csrg-svn/sbin/fsck/pass3.c (revision 68908)
122051Sdist /*
261492Sbostic  * Copyright (c) 1980, 1986, 1993
361492Sbostic  *	The Regents of the University of California.  All rights reserved.
439976Smckusick  *
542702Sbostic  * %sccs.include.redist.c%
622051Sdist  */
722051Sdist 
816265Smckusick #ifndef lint
9*68908Smckusick static char sccsid[] = "@(#)pass3.c	8.2 (Berkeley) 04/27/95";
1039976Smckusick #endif /* not lint */
1116265Smckusick 
1216265Smckusick #include <sys/param.h>
1353703Smckusick #include <sys/time.h>
14*68908Smckusick 
1551532Sbostic #include <ufs/ufs/dinode.h>
1651532Sbostic #include <ufs/ffs/fs.h>
17*68908Smckusick 
1816265Smckusick #include "fsck.h"
1916265Smckusick 
20*68908Smckusick void
pass3()2116265Smckusick pass3()
2216265Smckusick {
2340025Smckusick 	register struct inoinfo **inpp, *inp;
2440025Smckusick 	ino_t orphan;
2516265Smckusick 	int loopcnt;
2616265Smckusick 
2740025Smckusick 	for (inpp = &inpsort[inplast - 1]; inpp >= inpsort; inpp--) {
2840025Smckusick 		inp = *inpp;
2940025Smckusick 		if (inp->i_number == ROOTINO ||
3040025Smckusick 		    !(inp->i_parent == 0 || statemap[inp->i_number] == DSTATE))
3140025Smckusick 			continue;
3241132Smckusick 		if (statemap[inp->i_number] == DCLEAR)
3341132Smckusick 			continue;
3440025Smckusick 		for (loopcnt = 0; ; loopcnt++) {
3540025Smckusick 			orphan = inp->i_number;
3640025Smckusick 			if (inp->i_parent == 0 ||
3740025Smckusick 			    statemap[inp->i_parent] != DSTATE ||
3840025Smckusick 			    loopcnt > numdirs)
3940025Smckusick 				break;
4040025Smckusick 			inp = getinoinfo(inp->i_parent);
4116265Smckusick 		}
4240025Smckusick 		(void)linkup(orphan, inp->i_dotdot);
4340025Smckusick 		inp->i_parent = inp->i_dotdot = lfdir;
4440025Smckusick 		lncntp[lfdir]--;
4540025Smckusick 		statemap[orphan] = DFOUND;
4640025Smckusick 		propagate();
4716265Smckusick 	}
4816265Smckusick }
49