no longer need to include time.h, vnode.h, and inode.h; just include dinode.h
[unix-history] / usr / src / sbin / fsck / inode.c
index 6a700fd..226144f 100644 (file)
@@ -5,16 +5,18 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)inode.c    5.1 (Berkeley) %G%";
+static char sccsid[] = "@(#)inode.c    5.9 (Berkeley) %G%";
 #endif not lint
 
 #endif not lint
 
-#include <pwd.h>
 #include <sys/param.h>
 #include <sys/param.h>
-#include <sys/inode.h>
-#include <sys/fs.h>
-#include <sys/dir.h>
+#include <ufs/dinode.h>
+#include <ufs/fs.h>
+#include <ufs/dir.h>
+#include <pwd.h>
 #include "fsck.h"
 
 #include "fsck.h"
 
+BUFAREA *pbp = 0;
+
 ckinode(dp, idesc)
        DINODE *dp;
        register struct inodesc *idesc;
 ckinode(dp, idesc)
        DINODE *dp;
        register struct inodesc *idesc;
@@ -67,8 +69,9 @@ iblock(idesc, ilevel, isize)
        register daddr_t *ap;
        register daddr_t *aplim;
        int i, n, (*func)(), nif, sizepb;
        register daddr_t *ap;
        register daddr_t *aplim;
        int i, n, (*func)(), nif, sizepb;
-       BUFAREA ib;
-       extern int pass1check();
+       register BUFAREA *bp;
+       char buf[BUFSIZ];
+       extern int dirscan(), pass1check();
 
        if (idesc->id_type == ADDR) {
                func = idesc->id_func;
 
        if (idesc->id_type == ADDR) {
                func = idesc->id_func;
@@ -78,10 +81,7 @@ iblock(idesc, ilevel, isize)
                func = dirscan;
        if (outrange(idesc->id_blkno, idesc->id_numfrags)) /* protect thyself */
                return (SKIP);
                func = dirscan;
        if (outrange(idesc->id_blkno, idesc->id_numfrags)) /* protect thyself */
                return (SKIP);
-       initbarea(&ib);
-       getblk(&ib, idesc->id_blkno, sblock.fs_bsize);
-       if (ib.b_errs != NULL)
-               return (SKIP);
+       bp = getdatablk(idesc->id_blkno, sblock.fs_bsize);
        ilevel--;
        for (sizepb = sblock.fs_bsize, i = 0; i < ilevel; i++)
                sizepb *= NINDIR(&sblock);
        ilevel--;
        for (sizepb = sblock.fs_bsize, i = 0; i < ilevel; i++)
                sizepb *= NINDIR(&sblock);
@@ -89,28 +89,34 @@ iblock(idesc, ilevel, isize)
        if (nif > NINDIR(&sblock))
                nif = NINDIR(&sblock);
        if (idesc->id_func == pass1check && nif < NINDIR(&sblock)) {
        if (nif > NINDIR(&sblock))
                nif = NINDIR(&sblock);
        if (idesc->id_func == pass1check && nif < NINDIR(&sblock)) {
-               aplim = &ib.b_un.b_indir[NINDIR(&sblock)];
-               for (ap = &ib.b_un.b_indir[nif]; ap < aplim; ap++) {
+               aplim = &bp->b_un.b_indir[NINDIR(&sblock)];
+               for (ap = &bp->b_un.b_indir[nif]; ap < aplim; ap++) {
                        if (*ap == 0)
                                continue;
                        if (*ap == 0)
                                continue;
-                       if (dofix(idesc, "PARTIALLY TRUNCATED INODE")) {
+                       (void)sprintf(buf, "PARTIALLY TRUNCATED INODE I=%d",
+                               idesc->id_number);
+                       if (dofix(idesc, buf)) {
                                *ap = 0;
                                *ap = 0;
-                               dirty(&ib);
+                               dirty(bp);
                        }
                }
                        }
                }
-               flush(&dfile, &ib);
+               flush(&dfile, bp);
        }
        }
-       aplim = &ib.b_un.b_indir[nif];
-       for (ap = ib.b_un.b_indir, i = 1; ap < aplim; ap++, i++)
+       aplim = &bp->b_un.b_indir[nif];
+       for (ap = bp->b_un.b_indir, i = 1; ap < aplim; ap++, i++) {
                if (*ap) {
                        idesc->id_blkno = *ap;
                        if (ilevel > 0)
                                n = iblock(idesc, ilevel, isize - i * sizepb);
                        else
                                n = (*func)(idesc);
                if (*ap) {
                        idesc->id_blkno = *ap;
                        if (ilevel > 0)
                                n = iblock(idesc, ilevel, isize - i * sizepb);
                        else
                                n = (*func)(idesc);
-                       if (n & STOP)
+                       if (n & STOP) {
+                               bp->b_flags &= ~B_INUSE;
                                return (n);
                                return (n);
+                       }
                }
                }
+       }
+       bp->b_flags &= ~B_INUSE;
        return (KEEPON);
 }
 
        return (KEEPON);
 }
 
@@ -159,10 +165,18 @@ ginode(inumber)
        if (startinum == 0 ||
            inumber < startinum || inumber >= startinum + INOPB(&sblock)) {
                iblk = itod(&sblock, inumber);
        if (startinum == 0 ||
            inumber < startinum || inumber >= startinum + INOPB(&sblock)) {
                iblk = itod(&sblock, inumber);
-               getblk(&inoblk, iblk, sblock.fs_bsize);
+               if (pbp != 0)
+                       pbp->b_flags &= ~B_INUSE;
+               pbp = getdatablk(iblk, sblock.fs_bsize);
                startinum = (inumber / INOPB(&sblock)) * INOPB(&sblock);
        }
                startinum = (inumber / INOPB(&sblock)) * INOPB(&sblock);
        }
-       return (&inoblk.b_un.b_dinode[inumber % INOPB(&sblock)]);
+       return (&pbp->b_un.b_dinode[inumber % INOPB(&sblock)]);
+}
+
+inodirty()
+{
+       
+       dirty(pbp);
 }
 
 clri(idesc, s, flg)
 }
 
 clri(idesc, s, flg)
@@ -196,7 +210,7 @@ findname(idesc)
        if (dirp->d_ino != idesc->id_parent)
                return (KEEPON);
        bcopy(dirp->d_name, idesc->id_name, dirp->d_namlen + 1);
        if (dirp->d_ino != idesc->id_parent)
                return (KEEPON);
        bcopy(dirp->d_name, idesc->id_name, dirp->d_namlen + 1);
-       return (STOP);
+       return (STOP|FOUND);
 }
 
 findino(idesc)
 }
 
 findino(idesc)
@@ -209,7 +223,7 @@ findino(idesc)
        if (strcmp(dirp->d_name, idesc->id_name) == 0 &&
            dirp->d_ino >= ROOTINO && dirp->d_ino <= imax) {
                idesc->id_parent = dirp->d_ino;
        if (strcmp(dirp->d_name, idesc->id_name) == 0 &&
            dirp->d_ino >= ROOTINO && dirp->d_ino <= imax) {
                idesc->id_parent = dirp->d_ino;
-               return (STOP);
+               return (STOP|FOUND);
        }
        return (KEEPON);
 }
        }
        return (KEEPON);
 }