be more persistent in trying to read directories;
authorKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Thu, 8 Jan 1987 11:26:45 +0000 (03:26 -0800)
committerKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Thu, 8 Jan 1987 11:26:45 +0000 (03:26 -0800)
add FOUND return status for routines called from dirscan

SCCS-vsn: sbin/fsck/dir.c 5.3
SCCS-vsn: sbin/fsck/fsck.h 5.2
SCCS-vsn: sbin/fsck/inode.c 5.3
SCCS-vsn: sbin/fsck/pass3.c 5.2
SCCS-vsn: sbin/fsck/utilities.c 5.3

usr/src/sbin/fsck/dir.c
usr/src/sbin/fsck/fsck.h
usr/src/sbin/fsck/inode.c
usr/src/sbin/fsck/pass3.c
usr/src/sbin/fsck/utilities.c

index ad5466e..396a190 100644 (file)
@@ -5,7 +5,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)dir.c      5.2 (Berkeley) %G%";
+static char sccsid[] = "@(#)dir.c      5.3 (Berkeley) %G%";
 #endif not lint
 
 #include <sys/param.h>
 #endif not lint
 
 #include <sys/param.h>
@@ -63,6 +63,11 @@ descend(parentino, inumber)
        curino.id_parent = parentino->id_number;
        curino.id_number = inumber;
        (void)ckinode(dp, &curino);
        curino.id_parent = parentino->id_number;
        curino.id_number = inumber;
        (void)ckinode(dp, &curino);
+       if (curino.id_entryno < 2) {
+               direrr(inumber, "NULL DIRECTORY");
+               if (reply("REMOVE") == 1)
+                       statemap[inumber] = DCLEAR;
+       }
 }
 
 dirscan(idesc)
 }
 
 dirscan(idesc)
@@ -90,13 +95,9 @@ dirscan(idesc)
                idesc->id_dirp = (DIRECT *)dbuf;
                if ((n = (*idesc->id_func)(idesc)) & ALTERED) {
                        getblk(&fileblk, idesc->id_blkno, blksiz);
                idesc->id_dirp = (DIRECT *)dbuf;
                if ((n = (*idesc->id_func)(idesc)) & ALTERED) {
                        getblk(&fileblk, idesc->id_blkno, blksiz);
-                       if (fileblk.b_errs != NULL) {
-                               n &= ~ALTERED;
-                       } else {
-                               bcopy(dbuf, (char *)dp, dsize);
-                               dirty(&fileblk);
-                               sbdirty();
-                       }
+                       bcopy(dbuf, (char *)dp, dsize);
+                       dirty(&fileblk);
+                       sbdirty();
                }
                if (n & STOP) 
                        return (n);
                }
                if (n & STOP) 
                        return (n);
@@ -116,10 +117,6 @@ fsck_readdir(idesc)
 
        blksiz = idesc->id_numfrags * sblock.fs_fsize;
        getblk(&fileblk, idesc->id_blkno, blksiz);
 
        blksiz = idesc->id_numfrags * sblock.fs_fsize;
        getblk(&fileblk, idesc->id_blkno, blksiz);
-       if (fileblk.b_errs != NULL) {
-               idesc->id_filesize -= blksiz - idesc->id_loc;
-               return NULL;
-       }
        if (idesc->id_loc % DIRBLKSIZ == 0 && idesc->id_filesize > 0 &&
            idesc->id_loc < blksiz) {
                dp = (DIRECT *)(dirblk.b_buf + idesc->id_loc);
        if (idesc->id_loc % DIRBLKSIZ == 0 && idesc->id_filesize > 0 &&
            idesc->id_loc < blksiz) {
                dp = (DIRECT *)(dirblk.b_buf + idesc->id_loc);
@@ -306,8 +303,7 @@ linkup(orphan, pdir)
                idesc.id_type = DATA;
                idesc.id_func = findino;
                idesc.id_number = ROOTINO;
                idesc.id_type = DATA;
                idesc.id_func = findino;
                idesc.id_number = ROOTINO;
-               (void)ckinode(dp, &idesc);
-               if (idesc.id_parent >= ROOTINO && idesc.id_parent < imax) {
+               if ((ckinode(dp, &idesc) & FOUND) != 0) {
                        lfdir = idesc.id_parent;
                } else {
                        pwarn("NO lost+found DIRECTORY");
                        lfdir = idesc.id_parent;
                } else {
                        pwarn("NO lost+found DIRECTORY");
index 24a12bf..43f2f3d 100644 (file)
@@ -3,7 +3,7 @@
  * All rights reserved.  The Berkeley software License Agreement
  * specifies the terms and conditions for redistribution.
  *
  * All rights reserved.  The Berkeley software License Agreement
  * specifies the terms and conditions for redistribution.
  *
- *     @(#)fsck.h      5.1 (Berkeley) %G%
+ *     @(#)fsck.h      5.2 (Berkeley) %G%
  */
 
 #define        MAXDUP          10      /* limit on dup blks (per inode) */
  */
 
 #define        MAXDUP          10      /* limit on dup blks (per inode) */
@@ -166,6 +166,7 @@ struct      dinode zino;
 #define        getbmap(x)      isset(blockmap, x)
 #define        clrbmap(x)      clrbit(blockmap, x)
 
 #define        getbmap(x)      isset(blockmap, x)
 #define        clrbmap(x)      clrbit(blockmap, x)
 
+#define        FOUND   020
 #define        ALTERED 010
 #define        KEEPON  04
 #define        SKIP    02
 #define        ALTERED 010
 #define        KEEPON  04
 #define        SKIP    02
index 8350ade..f8ea149 100644 (file)
@@ -5,7 +5,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)inode.c    5.2 (Berkeley) %G%";
+static char sccsid[] = "@(#)inode.c    5.3 (Berkeley) %G%";
 #endif not lint
 
 #include <pwd.h>
 #endif not lint
 
 #include <pwd.h>
@@ -81,8 +81,6 @@ iblock(idesc, ilevel, isize)
                return (SKIP);
        initbarea(&ib);
        getblk(&ib, idesc->id_blkno, sblock.fs_bsize);
                return (SKIP);
        initbarea(&ib);
        getblk(&ib, idesc->id_blkno, sblock.fs_bsize);
-       if (ib.b_errs != NULL)
-               return (SKIP);
        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);
@@ -199,7 +197,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)
@@ -212,7 +210,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);
 }
index f6c4117..f38de7f 100644 (file)
@@ -5,7 +5,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)pass3.c    5.1 (Berkeley) %G%";
+static char sccsid[] = "@(#)pass3.c    5.2 (Berkeley) %G%";
 #endif not lint
 
 #include <sys/param.h>
 #endif not lint
 
 #include <sys/param.h>
@@ -40,8 +40,7 @@ pass3()
                                dp = ginode(orphan);
                                idesc.id_parent = 0;
                                idesc.id_number = orphan;
                                dp = ginode(orphan);
                                idesc.id_parent = 0;
                                idesc.id_number = orphan;
-                               (void)ckinode(dp, &idesc);
-                               if (idesc.id_parent == 0)
+                               if ((ckinode(dp, &idesc) & FOUND) == 0)
                                        break;
                                if (loopcnt >= sblock.fs_cstotal.cs_ndir)
                                        break;
                                        break;
                                if (loopcnt >= sblock.fs_cstotal.cs_ndir)
                                        break;
index 19fffbd..c733f54 100644 (file)
@@ -5,7 +5,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)utilities.c        5.2 (Berkeley) %G%";
+static char sccsid[] = "@(#)utilities.c        5.3 (Berkeley) %G%";
 #endif not lint
 
 #include <stdio.h>
 #endif not lint
 
 #include <stdio.h>
@@ -273,7 +273,7 @@ getpathname(namebuf, curdir, ino)
        bzero(&idesc, sizeof(struct inodesc));
        idesc.id_type = DATA;
        cp = &namebuf[BUFSIZ - 1];
        bzero(&idesc, sizeof(struct inodesc));
        idesc.id_type = DATA;
        cp = &namebuf[BUFSIZ - 1];
-       *cp-- = '\0';
+       *cp = '\0';
        if (curdir != ino) {
                idesc.id_parent = curdir;
                goto namelookup;
        if (curdir != ino) {
                idesc.id_parent = curdir;
                goto namelookup;
@@ -282,14 +282,14 @@ getpathname(namebuf, curdir, ino)
                idesc.id_number = ino;
                idesc.id_func = findino;
                idesc.id_name = "..";
                idesc.id_number = ino;
                idesc.id_func = findino;
                idesc.id_name = "..";
-               if ((ckinode(ginode(ino), &idesc) & STOP) == 0)
+               if ((ckinode(ginode(ino), &idesc) & FOUND) == 0)
                        break;
        namelookup:
                idesc.id_number = idesc.id_parent;
                idesc.id_parent = ino;
                idesc.id_func = findname;
                idesc.id_name = namebuf;
                        break;
        namelookup:
                idesc.id_number = idesc.id_parent;
                idesc.id_parent = ino;
                idesc.id_func = findname;
                idesc.id_name = namebuf;
-               if ((ckinode(ginode(idesc.id_number), &idesc) & STOP) == 0)
+               if ((ckinode(ginode(idesc.id_number), &idesc) & FOUND) == 0)
                        break;
                len = strlen(namebuf);
                cp -= len;
                        break;
                len = strlen(namebuf);
                cp -= len;