Whamcloud - gitweb
ChangeLog, pass3.c, pass4.c, problem.c, problem.h, super.c:
authorTheodore Ts'o <tytso@mit.edu>
Thu, 3 Sep 1998 01:26:03 +0000 (01:26 +0000)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 3 Sep 1998 01:26:03 +0000 (01:26 +0000)
  problem.c: Add PR_3_NO_DIRINFO error code.
  super.c (check_super_value): Rename min and max to min_val and max_val
   to avoid possible cpp macro conflicts.
  pass4.c (e2fsck_pass4): Rename max to maxgroup, to avoid possible cpp
   macro conflicts.
  pass3.c (e2fsck_pass3): Rename max to maxdirs, to avoid possible cpp
   macro conflicts.
   (check_directory): Fix logic to avoid possible core dump in the
   case of ext2fs_get_dir_info returning NULL.  (By the time we get here,
   it should never happen, but...).  Also simply/streamline the control
   flow of the function.

e2fsck/ChangeLog
e2fsck/pass3.c
e2fsck/pass4.c
e2fsck/problem.c
e2fsck/problem.h
e2fsck/super.c

index 59db2cc..7ef240e 100644 (file)
@@ -1,3 +1,20 @@
+1998-09-02  Theodore Ts'o  <tytso@rsts-11.mit.edu>
+
+       * problem.c: Add PR_3_NO_DIRINFO error code.
+
+       * super.c (check_super_value): Rename min and max to min_val and
+               max_val to avoid possible cpp macro conflicts.
+
+       * pass4.c (e2fsck_pass4): Rename max to maxgroup, to avoid
+               possible cpp macro conflicts.
+       
+       * pass3.c (e2fsck_pass3): Rename max to maxdirs, to avoid possible
+               cpp macro conflicts.
+               (check_directory): Fix logic to avoid possible core dump
+               in the case of ext2fs_get_dir_info returning NULL.  (By
+               the time we get here, it should never happen, but...).
+               Also simply/streamline the control flow of the function.
+
 1998-08-17  Theodore Ts'o  <tytso@rsts-11.mit.edu>
 
        * unix.c (check_if_skip): Move the "not cleanly mounted" check
index c87ebd9..0700698 100644 (file)
@@ -64,7 +64,7 @@ void e2fsck_pass3(e2fsck_t ctx)
 #endif
        struct problem_context  pctx;
        struct dir_info *dir;
-       unsigned long max, count;
+       unsigned long maxdirs, count;
 
 #ifdef RESOURCE_TRACK
        init_resource_track(&rtrack);
@@ -109,16 +109,16 @@ void e2fsck_pass3(e2fsck_t ctx)
 
        ext2fs_mark_inode_bitmap(inode_done_map, EXT2_ROOT_INO);
 
-       max = e2fsck_get_num_dirinfo(ctx);
+       maxdirs = e2fsck_get_num_dirinfo(ctx);
        count = 1;
 
        if (ctx->progress)
-               if ((ctx->progress)(ctx, 3, 0, max))
+               if ((ctx->progress)(ctx, 3, 0, maxdirs))
                        goto abort_exit;
        
        for (i=0; (dir = e2fsck_dir_info_iter(ctx, &i)) != 0;) {
                if (ctx->progress)
-                       if ((ctx->progress)(ctx, 3, count++, max))
+                       if ((ctx->progress)(ctx, 3, count++, maxdirs))
                                goto abort_exit;
                if (ext2fs_test_inode_bitmap(ctx->inode_dir_map, dir->ino))
                        check_directory(ctx, dir, &pctx);
@@ -256,17 +256,19 @@ static void check_directory(e2fsck_t ctx, struct dir_info *dir,
        ext2_filsys fs = ctx->fs;
        struct dir_info *p = dir;
 
+       if (!p)
+               return;
+
        ext2fs_clear_inode_bitmap(inode_loop_detect);
-       while (p) {
-               /*
-                * If we find a parent which we've already checked,
-                * then stop; we know it's either already connected to
-                * the directory tree, or it isn't but the user has
-                * already told us he doesn't want us to reconnect the
-                * disconnected subtree.
-                */
-               if (ext2fs_test_inode_bitmap(inode_done_map, p->ino))
-                       goto check_dot_dot;
+
+       /*
+        * Keep going until we find a parent which we've already
+        * checked.  We know it's either already connected to the
+        * directory tree, or it isn't but the user has already told
+        * us he doesn't want us to reconnect the disconnected
+        * subtree.
+        */
+       while (!ext2fs_test_inode_bitmap(inode_done_map, p->ino)) {
                /*
                 * Mark this inode as being "done"; by the time we
                 * return from this function, the inode we either be
@@ -275,6 +277,7 @@ static void check_directory(e2fsck_t ctx, struct dir_info *dir,
                 * lost+found.
                 */
                ext2fs_mark_inode_bitmap(inode_done_map, p->ino);
+
                /*
                 * If this directory doesn't have a parent, or we've
                 * seen the parent once already, then offer to
@@ -282,23 +285,25 @@ static void check_directory(e2fsck_t ctx, struct dir_info *dir,
                 */
                if (!p->parent ||
                    (ext2fs_test_inode_bitmap(inode_loop_detect,
-                                             p->parent)))
+                                             p->parent))) {
+                       pctx->ino = p->ino;
+                       if (fix_problem(ctx, PR_3_UNCONNECTED_DIR, pctx)) {
+                               if (e2fsck_reconnect_file(ctx, p->ino))
+                                       ext2fs_unmark_valid(fs);
+                               else {
+                                       p->parent = lost_and_found;
+                                       fix_dotdot(ctx, p, lost_and_found);
+                               }
+                       }
                        break;
+               }
                ext2fs_mark_inode_bitmap(inode_loop_detect,
                                         p->parent);
+               pctx->ino = p->parent;
                p = e2fsck_get_dir_info(ctx, p->parent);
-       }
-       /*
-        * If we've reached here, we've hit a detached directory
-        * inode; offer to reconnect it to lost+found.
-        */
-       pctx->ino = p->ino;
-       if (fix_problem(ctx, PR_3_UNCONNECTED_DIR, pctx)) {
-               if (e2fsck_reconnect_file(ctx, p->ino))
-                       ext2fs_unmark_valid(fs);
-               else {
-                       p->parent = lost_and_found;
-                       fix_dotdot(ctx, p, lost_and_found);
+               if (!p) {
+                       fix_problem(ctx, PR_3_NO_DIRINFO, pctx);
+                       return;
                }
        }
 
@@ -306,7 +311,6 @@ static void check_directory(e2fsck_t ctx, struct dir_info *dir,
         * Make sure that .. and the parent directory are the same;
         * offer to fix it if not.
         */
-check_dot_dot:
        if (dir->parent != dir->dotdot) {
                pctx->ino = dir->ino;
                pctx->ino2 = dir->dotdot;
index f65785a..adde764 100644 (file)
@@ -85,7 +85,7 @@ void e2fsck_pass4(e2fsck_t ctx)
 #endif
        struct problem_context  pctx;
        __u16   link_count, link_counted;
-       int     group, max;
+       int     group, maxgroup;
        
 #ifdef RESOURCE_TRACK
        init_resource_track(&rtrack);
@@ -101,16 +101,16 @@ void e2fsck_pass4(e2fsck_t ctx)
                fix_problem(ctx, PR_4_PASS_HEADER, &pctx);
 
        group = 0;
-       max = fs->group_desc_count;
+       maxgroup = fs->group_desc_count;
        if (ctx->progress)
-               if ((ctx->progress)(ctx, 4, 0, max))
+               if ((ctx->progress)(ctx, 4, 0, maxgroup))
                        return;
        
        for (i=1; i <= fs->super->s_inodes_count; i++) {
                if ((i % fs->super->s_inodes_per_group) == 0) {
                        group++;
                        if (ctx->progress)
-                               if ((ctx->progress)(ctx, 4, group, max))
+                               if ((ctx->progress)(ctx, 4, group, maxgroup))
                                        return;
                }
                if (i == EXT2_BAD_INO ||
index f996b9b..d6f6774 100644 (file)
@@ -787,6 +787,11 @@ static const struct e2fsck_problem problem_table[] = {
          "Cannot proceed without a @r.\n",
          PROMPT_NONE, PR_FATAL },  
 
+       /* Internal error: couldn't find dir_info */
+       { PR_3_NO_DIRINFO,
+         "Internal error: couldn't find dir_info for %i.\n",
+         PROMPT_NONE, PR_FATAL },
+
        /* Pass 4 errors */
        
        /* Pass 4: Checking reference counts */
index fdc9d2d..0f16ba6 100644 (file)
@@ -472,6 +472,9 @@ struct problem_context {
 /* Cannot proceed without a root inode. */
 #define PR_3_NO_ROOT_INODE_ABORT       0x030015
 
+/* Internal error: couldn't find dir_info */
+#define PR_3_NO_DIRINFO                        0x020016
+
 /*
  * Pass 4 errors
  */
index f5dc7f2..ce33c3a 100644 (file)
 
 static void check_super_value(e2fsck_t ctx, const char *descr,
                              unsigned long value, int flags,
-                             unsigned long min, unsigned long max)
+                             unsigned long min_val, unsigned long max_val)
 {
        struct          problem_context pctx;
 
-       if (((flags & MIN_CHECK) && (value < min)) ||
-           ((flags & MAX_CHECK) && (value > max))) {
+       if (((flags & MIN_CHECK) && (value < min_val)) ||
+           ((flags & MAX_CHECK) && (value > max_val))) {
                clear_problem_context(&pctx);
                pctx.num = value;
                pctx.str = descr;
@@ -57,7 +57,7 @@ void check_super_block(e2fsck_t ctx)
        blk_t   first_block, last_block;
        struct ext2fs_sb *s = (struct ext2fs_sb *) fs->super;
        blk_t   blocks_per_group = fs->super->s_blocks_per_group;
-       int     i;
+       dgrp_t  i;
        blk_t   should_be;
        struct problem_context  pctx;