ChangeLog, e2fsck.h, pass1.c, pass1b.c:
  e2fsck.h:
  pass1.c (mark_table_blocks, e2fsck_pass1): Remove
  	ctx->block_illegal_map, since it's not needed by pass1, and pass1b has
  	been modified to calculate it manually if needed.  This reduces the
  	memory footprint needed by e2fsck.
  pass1b.c (check_if_fs_block): New static function which returns
  	whether or not a block overlaps with filesystem metadata.  This
  	replaces consulting the block_illegal_map bitmap.
util.c:
  Make resource tracking message more concise.

diff --git a/e2fsck/ChangeLog b/e2fsck/ChangeLog
index abc0253..5677622 100644
--- a/e2fsck/ChangeLog
+++ b/e2fsck/ChangeLog
@@ -1,5 +1,15 @@
 2000-02-08    <tytso@snap.thunk.org>
 
+	* e2fsck.h:
+	* pass1.c (mark_table_blocks, e2fsck_pass1): Remove
+		ctx->block_illegal_map, since it's not needed by pass1,
+		and pass1b has been modified to calculate it manually if
+		needed.   This reduces the memory footprint needed by e2fsck.
+
+	* pass1b.c (check_if_fs_block): New static function which returns
+		whether or not a block overlaps with filesystem metadata.
+		This replaces consulting the block_illegal_map bitmap.
+
 	* Makefile.in: Call sync after finishing building all in this
 		directory. 
 	
diff --git a/e2fsck/e2fsck.h b/e2fsck/e2fsck.h
index e4a6837..28f2a90 100644
--- a/e2fsck/e2fsck.h
+++ b/e2fsck/e2fsck.h
@@ -166,7 +166,6 @@
 
 	ext2fs_block_bitmap block_found_map; /* Blocks which are in use */
 	ext2fs_block_bitmap block_dup_map; /* Blks referenced more than once */
-	ext2fs_block_bitmap block_illegal_map; /* Meta-data blocks */
 
 	/*
 	 * Inode count arrays
diff --git a/e2fsck/pass1.c b/e2fsck/pass1.c
index 25dd09d..cf30ef6 100644
--- a/e2fsck/pass1.c
+++ b/e2fsck/pass1.c
@@ -238,14 +238,6 @@
 		ctx->flags |= E2F_FLAG_ABORT;
 		return;
 	}
-	pctx.errcode = ext2fs_allocate_block_bitmap(fs, _("illegal block map"),
-					      &ctx->block_illegal_map);
-	if (pctx.errcode) {
-		pctx.num = 2;
-		fix_problem(ctx, PR_1_ALLOCATE_BBITMAP_ERROR, &pctx);
-		ctx->flags |= E2F_FLAG_ABORT;
-		return;
-	}
 	pctx.errcode = ext2fs_create_icount2(fs, 0, 0, 0,
 					     &ctx->inode_link_info);
 	if (pctx.errcode) {
@@ -558,8 +550,6 @@
 	e2fsck_use_inode_shortcuts(ctx, 0);
 	
 	ext2fs_free_mem((void **) &block_buf);
-	ext2fs_free_block_bitmap(ctx->block_illegal_map);
-	ctx->block_illegal_map = 0;
 
 	if (ctx->large_files && 
 	    !(sb->s_feature_ro_compat & 
@@ -995,11 +985,6 @@
 	if (blk < fs->super->s_first_data_block ||
 	    blk >= fs->super->s_blocks_count)
 		problem = PR_1_ILLEGAL_BLOCK_NUM;
-#if 0
-	else
-		if (ext2fs_test_block_bitmap(block_illegal_map, blk))
-			problem = PR_1_BLOCK_OVERLAPS_METADATA;
-#endif
 
 	if (problem) {
 		p->num_illegal_blocks++;
@@ -1310,8 +1295,6 @@
 			 * Mark this group's copy of the superblock
 			 */
 			ext2fs_mark_block_bitmap(ctx->block_found_map, block);
-			ext2fs_mark_block_bitmap(ctx->block_illegal_map,
-						 block);
 		
 			/*
 			 * Mark this group's copy of the descriptors
@@ -1319,8 +1302,6 @@
 			for (j = 0; j < fs->desc_blocks; j++) {
 				ext2fs_mark_block_bitmap(ctx->block_found_map,
 							 block + j + 1);
-				ext2fs_mark_block_bitmap(ctx->block_illegal_map,
-							 block + j + 1);
 			}
 		}
 		
@@ -1342,8 +1323,6 @@
 				} else {
 				    ext2fs_mark_block_bitmap(ctx->block_found_map,
 							     b);
-				    ext2fs_mark_block_bitmap(ctx->block_illegal_map,
-							     b);
 			    	}
 			}
 		}
@@ -1362,8 +1341,6 @@
 			} else {
 			    ext2fs_mark_block_bitmap(ctx->block_found_map,
 				     fs->group_desc[i].bg_block_bitmap);
-			    ext2fs_mark_block_bitmap(ctx->block_illegal_map,
-				     fs->group_desc[i].bg_block_bitmap);
 		    }
 			
 		}
@@ -1381,8 +1358,6 @@
 			} else {
 			    ext2fs_mark_block_bitmap(ctx->block_found_map,
 				     fs->group_desc[i].bg_inode_bitmap);
-			    ext2fs_mark_block_bitmap(ctx->block_illegal_map,
-				     fs->group_desc[i].bg_inode_bitmap);
 			}
 		}
 		block += fs->super->s_blocks_per_group;
diff --git a/e2fsck/pass1b.c b/e2fsck/pass1b.c
index 03e3b72..a1cbf18 100644
--- a/e2fsck/pass1b.c
+++ b/e2fsck/pass1b.c
@@ -92,6 +92,8 @@
 static void delete_file(e2fsck_t ctx, struct dup_inode *dp,
 			char *block_buf);
 static int clone_file(e2fsck_t ctx, struct dup_inode *dp, char* block_buf);
+static int check_if_fs_block(e2fsck_t ctx, blk_t test_blk);
+
 static void pass1b(e2fsck_t ctx, char *block_buf);
 static void pass1c(e2fsck_t ctx, char *block_buf);
 static void pass1d(e2fsck_t ctx, char *block_buf);
@@ -408,8 +410,7 @@
 				continue;
 			if (q->num_bad > 1)
 				file_ok = 0;
-			if (ext2fs_test_block_bitmap(ctx->block_illegal_map,
-						     q->block)) {
+			if (check_if_fs_block(ctx, q->block)) {
 				file_ok = 0;
 				meta_data = 1;
 			}
@@ -602,8 +603,7 @@
 			}
 			p->num_bad--;
 			if (p->num_bad == 1 &&
-			    !ext2fs_test_block_bitmap(ctx->block_illegal_map,
-						      *block_nr))
+			    !check_if_fs_block(ctx, *block_nr))
 				ext2fs_unmark_block_bitmap(ctx->block_dup_map,
 							   *block_nr);
 			*block_nr = new_block;
@@ -652,3 +652,40 @@
 	}
 	return 0;
 }
+
+/*
+ * This routine returns 1 if a block overlaps with one of the superblocks,
+ * group descriptors, inode bitmaps, or block bitmaps.
+ */
+static int check_if_fs_block(e2fsck_t ctx, blk_t test_block)
+{
+	ext2_filsys fs = ctx->fs;
+	blk_t	block;
+	int	i;
+	
+	block = fs->super->s_first_data_block;
+	for (i = 0; i < fs->group_desc_count; i++) {
+
+		/* Check superblocks/block group descriptros */
+		if (ext2fs_bg_has_super(fs, i)) {
+			if (test_block >= block &&
+			    (test_block <= block + fs->desc_blocks))
+				return 1;
+		}
+		
+		/* Check the inode table */
+		if ((fs->group_desc[i].bg_inode_table) &&
+		    (test_block >= fs->group_desc[i].bg_inode_table) &&
+		    (test_block < (fs->group_desc[i].bg_inode_table +
+				   fs->inode_blocks_per_group)))
+			return 1;
+
+		/* Check the bitmap blocks */
+		if ((test_block == fs->group_desc[i].bg_block_bitmap) ||
+		    (test_block == fs->group_desc[i].bg_inode_bitmap))
+			return 1;
+		
+		block += fs->super->s_blocks_per_group;
+	}
+	return 0;
+}
diff --git a/e2fsck/util.c b/e2fsck/util.c
index d525ba6..9fd0114 100644
--- a/e2fsck/util.c
+++ b/e2fsck/util.c
@@ -251,9 +251,12 @@
 		printf("%s: ", desc);
 
 #ifdef HAVE_MALLINFO
+#define kbytes(x)	(((x) + 1023) / 1024)
+	
 	malloc_info = mallinfo();
-	printf(_("Memory used: %d/%d, "),
-		malloc_info.arena, malloc_info.hblkhd);
+	printf(_("Memory used: %dk/%dk (%dk/%dk), "),
+	       kbytes(malloc_info.arena), kbytes(malloc_info.hblkhd),
+	       kbytes(malloc_info.uordblks), kbytes(malloc_info.fordblks));
 #else
 	printf(_("Memory used: %d, "),
 	       (int) (((char *) sbrk(0)) - ((char *) track->brk_start)));
@@ -261,7 +264,7 @@
 #ifdef HAVE_GETRUSAGE
 	getrusage(RUSAGE_SELF, &r);
 
-	printf(_("elapsed time: %6.3f/%6.3f/%6.3f\n"),
+	printf(_("time: %5.2f/%5.2f/%5.2f\n"),
 	       timeval_subtract(&time_end, &track->time_start),
 	       timeval_subtract(&r.ru_utime, &track->user_start),
 	       timeval_subtract(&r.ru_stime, &track->system_start));