date and time created 90/05/05 00:01:16 by mckusick
[unix-history] / usr / src / sbin / fsck / pass3.c
index f6c4117..7a81c5d 100644 (file)
@@ -1,57 +1,54 @@
 /*
 /*
- * Copyright (c) 1980 Regents of the University of California.
- * All rights reserved.  The Berkeley software License Agreement
- * specifies the terms and conditions for redistribution.
+ * Copyright (c) 1980, 1986 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley.  The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)pass3.c    5.1 (Berkeley) %G%";
-#endif not lint
+static char sccsid[] = "@(#)pass3.c    5.9 (Berkeley) %G%";
+#endif /* not lint */
 
 #include <sys/param.h>
 
 #include <sys/param.h>
-#include <sys/inode.h>
-#include <sys/fs.h>
+#include <ufs/dinode.h>
+#include <ufs/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();
        }
 }
        }
 }