BSD 4_4 release
[unix-history] / usr / src / sbin / fsck / pass3.c
index a68ab71..5c6f09d 100644 (file)
@@ -1,51 +1,71 @@
+/*
+ * Copyright (c) 1980, 1986, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
 #ifndef lint
 #ifndef lint
-static char version[] = "@(#)pass3.c   3.4 (Berkeley) %G%";
-#endif
+static char sccsid[] = "@(#)pass3.c    8.1 (Berkeley) 6/5/93";
+#endif /* not lint */
 
 #include <sys/param.h>
 
 #include <sys/param.h>
-#include <sys/inode.h>
-#include <sys/fs.h>
+#include <sys/time.h>
+#include <ufs/ufs/dinode.h>
+#include <ufs/ffs/fs.h>
 #include "fsck.h"
 
 #include "fsck.h"
 
-int    pass2check();
-
 pass3()
 {
 pass3()
 {
-       register DINODE *dp;
-       struct inodesc idesc;
-       ino_t inumber, orphan;
+       register struct inoinfo **inpp, *inp;
+       ino_t orphan;
        int loopcnt;
 
        int loopcnt;
 
-       bzero((char *)&idesc, sizeof(struct inodesc));
-       idesc.id_type = DATA;
-       for (inumber = ROOTINO; inumber <= lastino; inumber++) {
-               if (statemap[inumber] == DSTATE) {
-                       pathp = pathname;
-                       *pathp++ = '?';
-                       *pathp = '\0';
-                       idesc.id_func = findino;
-                       idesc.id_name = "..";
-                       idesc.id_parent = inumber;
-                       loopcnt = 0;
-                       do {
-                               orphan = idesc.id_parent;
-                               if (orphan < ROOTINO || orphan > imax)
-                                       break;
-                               dp = ginode(orphan);
-                               idesc.id_parent = 0;
-                               idesc.id_number = orphan;
-                               (void)ckinode(dp, &idesc);
-                               if (idesc.id_parent == 0)
-                                       break;
-                               if (loopcnt >= sblock.fs_cstotal.cs_ndir)
-                                       break;
-                               loopcnt++;
-                       } while (statemap[idesc.id_parent] == DSTATE);
-                       if (linkup(orphan, idesc.id_parent) == 1) {
-                               idesc.id_func = pass2check;
-                               idesc.id_number = lfdir;
-                               descend(&idesc, orphan);
-                       }
+       for (inpp = &inpsort[inplast - 1]; inpp >= inpsort; inpp--) {
+               inp = *inpp;
+               if (inp->i_number == ROOTINO ||
+                   !(inp->i_parent == 0 || statemap[inp->i_number] == DSTATE))
+                       continue;
+               if (statemap[inp->i_number] == DCLEAR)
+                       continue;
+               for (loopcnt = 0; ; loopcnt++) {
+                       orphan = inp->i_number;
+                       if (inp->i_parent == 0 ||
+                           statemap[inp->i_parent] != DSTATE ||
+                           loopcnt > numdirs)
+                               break;
+                       inp = getinoinfo(inp->i_parent);
                }
                }
+               (void)linkup(orphan, inp->i_dotdot);
+               inp->i_parent = inp->i_dotdot = lfdir;
+               lncntp[lfdir]--;
+               statemap[orphan] = DFOUND;
+               propagate();
        }
 }
        }
 }