Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sbin/fsck_ext2fs Correct bogons in filetype option support, ...



details:   https://anonhg.NetBSD.org/src/rev/3cd43e66ff8f
branches:  trunk
changeset: 481419:3cd43e66ff8f
user:      bouyer <bouyer%NetBSD.org@localhost>
date:      Fri Jan 28 16:01:46 2000 +0000

description:
Correct bogons in filetype option support, and add support for the
sparse_super option.

diffstat:

 sbin/fsck_ext2fs/Makefile |   4 +-
 sbin/fsck_ext2fs/dir.c    |  18 ++++++------
 sbin/fsck_ext2fs/fsck.h   |   4 +-
 sbin/fsck_ext2fs/inode.c  |  38 ++++++++++++------------
 sbin/fsck_ext2fs/main.c   |   8 +++--
 sbin/fsck_ext2fs/pass1.c  |  44 ++++++++++++++++++++++-------
 sbin/fsck_ext2fs/pass2.c  |  23 ++++++++-------
 sbin/fsck_ext2fs/pass5.c  |  15 ++++-----
 sbin/fsck_ext2fs/setup.c  |  70 ++++++++++++++++++----------------------------
 9 files changed, 117 insertions(+), 107 deletions(-)

diffs (truncated from 563 to 300 lines):

diff -r 2adccbd8b297 -r 3cd43e66ff8f sbin/fsck_ext2fs/Makefile
--- a/sbin/fsck_ext2fs/Makefile Fri Jan 28 16:00:23 2000 +0000
+++ b/sbin/fsck_ext2fs/Makefile Fri Jan 28 16:01:46 2000 +0000
@@ -1,10 +1,10 @@
-#      $NetBSD: Makefile,v 1.7 1999/01/15 13:32:06 bouyer Exp $
+#      $NetBSD: Makefile,v 1.8 2000/01/28 16:01:46 bouyer Exp $
 #      @(#)Makefile    8.1 (Berkeley) 6/5/93
 
 PROG=  fsck_ext2fs
 MAN=    fsck_ext2fs.8
 SRCS=  dir.c inode.c main.c pass1.c pass1b.c pass2.c pass3.c pass4.c \
-       pass5.c fsutil.c setup.c utilities.c 
+       pass5.c fsutil.c setup.c utilities.c ext2fs_bswap.c
 FSCK=  ${.CURDIR}/../fsck
 CPPFLAGS+= -I${FSCK}
 .PATH: ${.CURDIR}/../../sys/ufs/ext2fs ${FSCK}
diff -r 2adccbd8b297 -r 3cd43e66ff8f sbin/fsck_ext2fs/dir.c
--- a/sbin/fsck_ext2fs/dir.c    Fri Jan 28 16:00:23 2000 +0000
+++ b/sbin/fsck_ext2fs/dir.c    Fri Jan 28 16:01:46 2000 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: dir.c,v 1.4 2000/01/26 16:21:31 bouyer Exp $   */
+/*     $NetBSD: dir.c,v 1.5 2000/01/28 16:01:46 bouyer Exp $   */
 
 /*
  * Copyright (c) 1997 Manuel Bouyer.
@@ -39,7 +39,7 @@
 #if 0
 static char sccsid[] = "@(#)dir.c      8.5 (Berkeley) 12/8/94";
 #else
-__RCSID("$NetBSD: dir.c,v 1.4 2000/01/26 16:21:31 bouyer Exp $");
+__RCSID("$NetBSD: dir.c,v 1.5 2000/01/28 16:01:46 bouyer Exp $");
 #endif
 #endif /* not lint */
 
@@ -64,8 +64,8 @@
 int    lfmode = 01777;
 struct ext2fs_dirtemplate emptydir = { 0, DIRBLKSIZ }; 
 struct ext2fs_dirtemplate dirhead = {
-       0, 12, 1, IFTODT(EXT2_IFDIR), ".",
-       0, DIRBLKSIZ - 12, 2, IFTODT(EXT2_IFDIR), ".."
+       0, 12, 1, EXT2_FT_DIR, ".",
+       0, DIRBLKSIZ - 12, 2, EXT2_FT_DIR, ".."
 };
 #undef DIRBLKSIZ
 
@@ -245,7 +245,7 @@
                return (0);
        if (dp->e2d_ino == 0)
                return (1);
-       if (sblock.e2fs.e2fs_rev < E2FS_REV0 ||
+       if (sblock.e2fs.e2fs_rev < E2FS_REV1 ||
            (sblock.e2fs.e2fs_features_incompat & EXT2F_INCOMPAT_FTYPE) == 0)
                if (dp->e2d_type != 0)
                        return (1);
@@ -335,7 +335,7 @@
        newent.e2d_namlen = strlen(idesc->id_name);
        if (sblock.e2fs.e2fs_rev > E2FS_REV0 &&
            (sblock.e2fs.e2fs_features_incompat & EXT2F_INCOMPAT_FTYPE))
-               newent.e2d_type = typemap[idesc->id_parent];
+               newent.e2d_type = inot2ext2dt(typemap[idesc->id_parent]);
        newlen = EXT2FS_DIRSIZ(newent.e2d_namlen);
        if (dirp->e2d_ino != 0)
                oldlen = EXT2FS_DIRSIZ(dirp->e2d_namlen);
@@ -367,7 +367,7 @@
        dirp->e2d_ino = h2fs32(idesc->id_parent);
        if (sblock.e2fs.e2fs_rev > E2FS_REV0 &&
            (sblock.e2fs.e2fs_features_incompat & EXT2F_INCOMPAT_FTYPE))
-               dirp->e2d_type = typemap[idesc->id_parent];
+               dirp->e2d_type = inot2ext2dt(typemap[idesc->id_parent]);
        else
                dirp->e2d_type = 0;
        return (ALTERED|STOP);
@@ -615,13 +615,13 @@
        dirhead.dot_namlen = 1;
        if (sblock.e2fs.e2fs_rev > E2FS_REV0 &&
            (sblock.e2fs.e2fs_features_incompat & EXT2F_INCOMPAT_FTYPE))
-               dirhead.dot_type = IFTODT(EXT2_IFDIR);
+               dirhead.dot_type = EXT2_FT_DIR;
        else
                dirhead.dot_type = 0;
        dirhead.dotdot_namlen = 2;
        if (sblock.e2fs.e2fs_rev > E2FS_REV0 &&
            (sblock.e2fs.e2fs_features_incompat & EXT2F_INCOMPAT_FTYPE))
-               dirhead.dotdot_type = IFTODT(EXT2_IFDIR);
+               dirhead.dotdot_type = EXT2_FT_DIR;
        else
                dirhead.dotdot_type = 0;
        dirp = &dirhead;
diff -r 2adccbd8b297 -r 3cd43e66ff8f sbin/fsck_ext2fs/fsck.h
--- a/sbin/fsck_ext2fs/fsck.h   Fri Jan 28 16:00:23 2000 +0000
+++ b/sbin/fsck_ext2fs/fsck.h   Fri Jan 28 16:01:46 2000 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: fsck.h,v 1.3 2000/01/26 16:21:31 bouyer Exp $  */
+/*     $NetBSD: fsck.h,v 1.4 2000/01/28 16:01:46 bouyer Exp $  */
 
 /*
  * Copyright (c) 1997 Manuel Bouyer.
@@ -179,7 +179,6 @@
 int    rerun;                  /* rerun fsck.  Only used in non-preen mode */
 
 daddr_t        maxfsblock;             /* number of blocks in the file system */
-daddr_t cgoverhead;            /* overhead per cg */
 char   *blockmap;              /* ptr to primary blk allocation map */
 ino_t  maxino;                 /* number of inodes in file system */
 ino_t  lastino;                /* last inode in use */
@@ -212,3 +211,4 @@
 void getblk __P((struct bufarea *, daddr_t, long));
 ino_t allocino __P((ino_t, int));
 void copyback_sb __P((struct bufarea*));
+daddr_t cgoverhead __P((int)); /* overhead per cg */
diff -r 2adccbd8b297 -r 3cd43e66ff8f sbin/fsck_ext2fs/inode.c
--- a/sbin/fsck_ext2fs/inode.c  Fri Jan 28 16:00:23 2000 +0000
+++ b/sbin/fsck_ext2fs/inode.c  Fri Jan 28 16:01:46 2000 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: inode.c,v 1.7 2000/01/26 16:21:32 bouyer Exp $ */
+/*     $NetBSD: inode.c,v 1.8 2000/01/28 16:01:46 bouyer Exp $ */
 
 /*
  * Copyright (c) 1997 Manuel Bouyer.
@@ -39,7 +39,7 @@
 #if 0
 static char sccsid[] = "@(#)inode.c    8.5 (Berkeley) 2/8/95";
 #else
-__RCSID("$NetBSD: inode.c,v 1.7 2000/01/26 16:21:32 bouyer Exp $");
+__RCSID("$NetBSD: inode.c,v 1.8 2000/01/28 16:01:46 bouyer Exp $");
 #endif
 #endif /* not lint */
 
@@ -50,7 +50,6 @@
 #include <ufs/ext2fs/ext2fs.h>
 
 #include <ufs/ufs/dinode.h> /* for IFMT & friends */
-#include <ufs/ufs/dir.h> /* for IFTODT & friends */
 #ifndef SMALL
 #include <pwd.h>
 #endif
@@ -256,35 +255,36 @@
        daddr_t blk;
        int cnt;
 {
-       int c;
+       int c, overh;
 
        if ((unsigned)(blk + cnt) > maxfsblock)
                return (1);
        c = dtog(&sblock, blk);
-       if (blk < sblock.e2fs.e2fs_bpg * c + cgoverhead +
-                                                                                       sblock.e2fs.e2fs_first_dblock) {
-               if ((blk + cnt) > sblock.e2fs.e2fs_bpg * c + cgoverhead +
-                                                                                       sblock.e2fs.e2fs_first_dblock) {
+       overh = cgoverhead(c);
+       if (blk < sblock.e2fs.e2fs_bpg * c + overh +
+           sblock.e2fs.e2fs_first_dblock) {
+               if ((blk + cnt) > sblock.e2fs.e2fs_bpg * c + overh +
+                   sblock.e2fs.e2fs_first_dblock) {
                        if (debug) {
                                printf("blk %d < cgdmin %d;",
-                                   blk, sblock.e2fs.e2fs_bpg * c + cgoverhead +
-                                                                                       sblock.e2fs.e2fs_first_dblock);
+                                   blk, sblock.e2fs.e2fs_bpg * c + overh +
+                                   sblock.e2fs.e2fs_first_dblock);
                                printf(" blk + cnt %d > cgsbase %d\n",
-                                   blk + cnt, sblock.e2fs.e2fs_bpg * c + cgoverhead +
-                                                                                       sblock.e2fs.e2fs_first_dblock);
+                                   blk + cnt, sblock.e2fs.e2fs_bpg * c +
+                                   overh + sblock.e2fs.e2fs_first_dblock);
                        }
                        return (1);
                }
        } else {
-               if ((blk + cnt) > sblock.e2fs.e2fs_bpg * (c + 1) + cgoverhead +
-                                                                                       sblock.e2fs.e2fs_first_dblock) {
+               if ((blk + cnt) > sblock.e2fs.e2fs_bpg * (c + 1) + overh +
+                   sblock.e2fs.e2fs_first_dblock) {
                        if (debug)  {
                                printf("blk %d >= cgdmin %d;",
-                                   blk, sblock.e2fs.e2fs_bpg * c + cgoverhead +
-                                                                                       sblock.e2fs.e2fs_first_dblock);
+                                   blk, sblock.e2fs.e2fs_bpg * c + overh +
+                                   sblock.e2fs.e2fs_first_dblock);
                                printf(" blk + cnt %d > cgdmax %d\n",
-                                   blk+cnt, sblock.e2fs.e2fs_bpg * (c + 1) + cgoverhead +
-                                                                                       sblock.e2fs.e2fs_first_dblock);
+                                   blk+cnt, sblock.e2fs.e2fs_bpg * (c + 1) +
+                                   overh + sblock.e2fs.e2fs_first_dblock);
                        }
                        return (1);
                }
@@ -638,7 +638,7 @@
        dp->e2di_nblock = h2fs32(btodb(sblock.e2fs_bsize));
        n_files++;
        inodirty();
-       typemap[ino] = IFTODT(type);
+       typemap[ino] = E2IFTODT(type);
        return (ino);
 }
 
diff -r 2adccbd8b297 -r 3cd43e66ff8f sbin/fsck_ext2fs/main.c
--- a/sbin/fsck_ext2fs/main.c   Fri Jan 28 16:00:23 2000 +0000
+++ b/sbin/fsck_ext2fs/main.c   Fri Jan 28 16:01:46 2000 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: main.c,v 1.7 2000/01/26 16:21:32 bouyer Exp $  */
+/*     $NetBSD: main.c,v 1.8 2000/01/28 16:01:46 bouyer Exp $  */
 
 /*
  * Copyright (c) 1997 Manuel Bouyer.
@@ -44,7 +44,7 @@
 #if 0
 static char sccsid[] = "@(#)main.c     8.2 (Berkeley) 1/23/94";
 #else
-__RCSID("$NetBSD: main.c,v 1.7 2000/01/26 16:21:32 bouyer Exp $");
+__RCSID("$NetBSD: main.c,v 1.8 2000/01/28 16:01:46 bouyer Exp $");
 #endif
 #endif /* not lint */
 
@@ -176,6 +176,7 @@
        daddr_t n_bfree;
        struct dups *dp;
        struct zlncnt *zlnp;
+       int i;
 
        if (preen && child)
                (void)signal(SIGQUIT, voidquit);
@@ -253,7 +254,8 @@
            (n_files -= maxino - 9 - sblock.e2fs.e2fs_ficount))
                printf("%d files missing\n", n_files);
        if (debug) {
-               n_blks += sblock.e2fs_ncg * cgoverhead;
+               for (i = 0; i < sblock.e2fs_ncg; i++)
+                       n_blks +=  cgoverhead(i);
                n_blks += sblock.e2fs.e2fs_first_dblock;
                if (n_blks -= maxfsblock - n_bfree)
                        printf("%d blocks missing\n", n_blks);
diff -r 2adccbd8b297 -r 3cd43e66ff8f sbin/fsck_ext2fs/pass1.c
--- a/sbin/fsck_ext2fs/pass1.c  Fri Jan 28 16:00:23 2000 +0000
+++ b/sbin/fsck_ext2fs/pass1.c  Fri Jan 28 16:01:46 2000 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: pass1.c,v 1.7 2000/01/26 16:21:32 bouyer Exp $ */
+/*     $NetBSD: pass1.c,v 1.8 2000/01/28 16:01:46 bouyer Exp $ */
 
 /*
  * Copyright (c) 1997 Manuel Bouyer.
@@ -39,7 +39,7 @@
 #if 0
 static char sccsid[] = "@(#)pass1.c    8.1 (Berkeley) 6/5/93";
 #else
-__RCSID("$NetBSD: pass1.c,v 1.7 2000/01/26 16:21:32 bouyer Exp $");
+__RCSID("$NetBSD: pass1.c,v 1.8 2000/01/28 16:01:46 bouyer Exp $");
 #endif
 #endif /* not lint */
 
@@ -50,7 +50,6 @@
 #include <ufs/ext2fs/ext2fs.h>
 
 #include <ufs/ufs/dinode.h> /* for IFMT & friends */
-#include <ufs/ufs/dir.h> /* for IFTODT & friends */
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -69,20 +68,43 @@
 pass1()
 {
        ino_t inumber;
-       int c, i, cgd;
+       int c, i;
+       daddr_t dbase;
        struct inodesc idesc;
 
        /*
         * Set file system reserved blocks in used block map.
         */
        for (c = 0; c < sblock.e2fs_ncg; c++) {
-               i = c * sblock.e2fs.e2fs_bpg + sblock.e2fs.e2fs_first_dblock;
-               cgd = i + cgoverhead;
+               dbase = c * sblock.e2fs.e2fs_bpg +
+                   sblock.e2fs.e2fs_first_dblock;
+               /* Mark the blocks used for the inode table */
+               if (sblock.e2fs_gd[c].ext2bgd_i_tables >= dbase) {
+                       for (i = 0; i < sblock.e2fs_itpg; i++)
+                               setbmap(sblock.e2fs_gd[c].ext2bgd_i_tables + i);
+               }
+               /* Mark the blocks used for the block bitmap */
+               if (sblock.e2fs_gd[c].ext2bgd_b_bitmap >= dbase)
+                       setbmap(sblock.e2fs_gd[c].ext2bgd_b_bitmap);
+               /* Mark the blocks used for the inode bitmap */
+               if (sblock.e2fs_gd[c].ext2bgd_i_bitmap >= dbase)
+                       setbmap(sblock.e2fs_gd[c].ext2bgd_i_bitmap);
 
-               if (c == 0)
-                       i = 0;
-               for (; i < cgd; i++)
-                       setbmap(i);
+               if (sblock.e2fs.e2fs_rev == E2FS_REV0 ||
+                   (sblock.e2fs.e2fs_features_rocompat &
+                       EXT2F_ROCOMPAT_SPARSESUPER) == 0 ||
+                   cg_has_sb(c)) {
+                       /* Mark copuy of SB and descriptors */
+                       setbmap(dbase);
+                       for (i = 1; i <= sblock.e2fs_ngdb; i++)
+                               setbmap(dbase+i);



Home | Main Index | Thread Index | Old Index