use inoinfo structure to quickly find any orphaned directories
[unix-history] / usr / src / sbin / fsck / pass4.c
index 6375515..8e89c64 100644 (file)
@@ -1,16 +1,27 @@
 /*
 /*
- * 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[] = "@(#)pass4.c    5.1 (Berkeley) %G%";
-#endif not lint
+static char sccsid[] = "@(#)pass4.c    5.7 (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"
 
 int    pass4check();
 #include "fsck.h"
 
 int    pass4check();
@@ -37,6 +48,10 @@ pass4()
                        else {
                                for (zlnp = zlnhead; zlnp; zlnp = zlnp->next)
                                        if (zlnp->zlncnt == inumber) {
                        else {
                                for (zlnp = zlnhead; zlnp; zlnp = zlnp->next)
                                        if (zlnp->zlncnt == inumber) {
+                                               zlnp->zlncnt = zlnhead->zlncnt;
+                                               zlnp = zlnhead;
+                                               zlnhead = zlnhead->next;
+                                               free((char *)zlnp);
                                                clri(&idesc, "UNREF", 1);
                                                break;
                                        }
                                                clri(&idesc, "UNREF", 1);
                                                break;
                                        }
@@ -51,6 +66,13 @@ pass4()
                case FCLEAR:
                        clri(&idesc, "BAD/DUP", 1);
                        break;
                case FCLEAR:
                        clri(&idesc, "BAD/DUP", 1);
                        break;
+
+               case USTATE:
+                       break;
+
+               default:
+                       errexit("BAD STATE %d FOR INODE I=%d",
+                           statemap[inumber], inumber);
                }
        }
 }
                }
        }
 }
@@ -63,16 +85,16 @@ pass4check(idesc)
        daddr_t blkno = idesc->id_blkno;
 
        for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) {
        daddr_t blkno = idesc->id_blkno;
 
        for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) {
-               if (outrange(blkno, 1)) {
+               if (chkrange(blkno, 1)) {
                        res = SKIP;
                        res = SKIP;
-               } else if (getbmap(blkno)) {
+               } else if (testbmap(blkno)) {
                        for (dlp = duplist; dlp; dlp = dlp->next) {
                                if (dlp->dup != blkno)
                                        continue;
                                dlp->dup = duplist->dup;
                                dlp = duplist;
                                duplist = duplist->next;
                        for (dlp = duplist; dlp; dlp = dlp->next) {
                                if (dlp->dup != blkno)
                                        continue;
                                dlp->dup = duplist->dup;
                                dlp = duplist;
                                duplist = duplist->next;
-                               /* free(dlp); */
+                               free((char *)dlp);
                                break;
                        }
                        if (dlp == 0) {
                                break;
                        }
                        if (dlp == 0) {