386BSD 0.1 development
[unix-history] / usr / src / sbin / fsck / pass1b.c
index 27e9aa1..8537162 100644 (file)
@@ -1,58 +1,98 @@
+/*
+ * Copyright (c) 1980, 1986 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[] = "@(#)pass1b.c  3.1 (Berkeley) %G%";
-#endif
+static char sccsid[] = "@(#)pass1b.c   5.8 (Berkeley) 7/20/90";
+#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 <string.h>
 #include "fsck.h"
 
 int    pass1bcheck();
 #include "fsck.h"
 
 int    pass1bcheck();
+static  struct dups *duphead;
 
 pass1b()
 {
        register int c, i;
 
 pass1b()
 {
        register int c, i;
-       register DINODE *dp;
+       register struct dinode *dp;
        struct inodesc idesc;
        ino_t inumber;
 
        bzero((char *)&idesc, sizeof(struct inodesc));
        idesc.id_type = ADDR;
        idesc.id_func = pass1bcheck;
        struct inodesc idesc;
        ino_t inumber;
 
        bzero((char *)&idesc, sizeof(struct inodesc));
        idesc.id_type = ADDR;
        idesc.id_func = pass1bcheck;
+       duphead = duplist;
        inumber = 0;
        for (c = 0; c < sblock.fs_ncg; c++) {
                for (i = 0; i < sblock.fs_ipg; i++, inumber++) {
        inumber = 0;
        for (c = 0; c < sblock.fs_ncg; c++) {
                for (i = 0; i < sblock.fs_ipg; i++, inumber++) {
+                       if (inumber < ROOTINO)
+                               continue;
                        dp = ginode(inumber);
                        if (dp == NULL)
                                continue;
                        idesc.id_number = inumber;
                        if (statemap[inumber] != USTATE &&
                            (ckinode(dp, &idesc) & STOP))
                        dp = ginode(inumber);
                        if (dp == NULL)
                                continue;
                        idesc.id_number = inumber;
                        if (statemap[inumber] != USTATE &&
                            (ckinode(dp, &idesc) & STOP))
-                               goto out1b;
+                               return;
                }
        }
                }
        }
-out1b:
-       flush(&dfile, &inoblk);
 }
 
 pass1bcheck(idesc)
        register struct inodesc *idesc;
 {
 }
 
 pass1bcheck(idesc)
        register struct inodesc *idesc;
 {
-       register daddr_t *dlp;
+       register struct dups *dlp;
        int nfrags, res = KEEPON;
        daddr_t blkno = idesc->id_blkno;
 
        for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) {
        int nfrags, res = KEEPON;
        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;
-               for (dlp = duplist; dlp < muldup; dlp++)
-                       if (*dlp == blkno) {
-                               blkerr(idesc->id_number, "DUP", blkno);
-                               *dlp = *--muldup;
-                               *muldup = blkno;
-                               if (muldup == duplist)
-                                       return (STOP);
+               for (dlp = duphead; dlp; dlp = dlp->next) {
+                       if (dlp->dup == blkno) {
+                               blkerror(idesc->id_number, "DUP", blkno);
+                               dlp->dup = duphead->dup;
+                               duphead->dup = blkno;
+                               duphead = duphead->next;
                        }
                        }
+                       if (dlp == muldup)
+                               break;
+               }
+               if (muldup == 0 || duphead == muldup->next)
+                       return (STOP);
        }
        return (res);
 }
        }
        return (res);
 }