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()2116265Smckusickpass3() 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