Sat Jan 17 13:02:16 1998  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* e2fsck.h: If EXT2_FLAT_INCLUDES is defined, then assume all of
 		the ext2-specific header files are in a flat directory.

	* dirinfo.c, ehandler.c, pass1.c, pass1b.c, pass2.c, pass5.c,
 		super.c, swapfs.c, unix.c: Explicitly cast all assignments
 		from void * to be compatible with C++.

Tue Jan  6 11:30:24 1998  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* unix.c (sync_disk): Remove sync_disk and calls to that function,
		since ext2fs_close() now takes care of this.

Mon Dec 29 14:45:42 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* pass1.c, pass1b.c, pass2.c, pass3.c, swapfs, badblocks.c,
 		ehandler.c, unix.c: Change use of private to be priv_data,
 		to avoid C++ reserved name clash.

Fri Nov 28 09:30:26 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* dirinfo.c (e2fsck_add_dir_info): Use ext2fs_get_num_dirs instead
		of e2fsck_get_num_dirs, which has been removed.

Tue Nov 25 15:54:35 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* Makefile.in (PROGS): Remove @EXTRA_PROGS@, since we don't want
		to compile and install flushb.

Mon Nov 24 06:48:00 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* pass1.c (e2fsck_pass1_check_device_inode): For now, only check
		to make sure the extra i_blocks in a device are cleared if
		the immutable flag is set.

	* util.c (print_resource_track): Fix typo which caused the
 		time/resource tracking to print "Pass 1 :" instead of
 		"Pass 1: ".

Thu Nov 20 16:02:23 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* pass3.c (expand_directory): Fix bug which could cause core dump
 		when expanding the directory, and the bitmaps hadn't yet
 		been read in.  Also, only use ext2fs_write_dir_block when
		writing a directory block, not when writing out a fresh
		indirect block.

Wed Nov 19 16:15:44 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* pass1.c (process_bad_block): Fix bug where first_block wasn't
		getting incremented, which caused user to get a
		"Programming error?" warning if there was a bad block in a
		non-primary superblock/group_descriptor.  Also fixed
		another bug so that ext2fs_bg_has_super() is consulted, to
		avoid problems when using a filesystem with the
		sparse_groups option set and there are bad blocks at the
		beginning of a group which doesn't have a superblock.

Thu Nov  6 16:10:20 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* pass1.c, pass2.c, pass3.c, pass4.c, pass5.c: Add calls to the 
		progress indicator function.

	* pass1.c (scan_callback): Add call to the progress feedback
		function (if it exists).

Tue Nov  4 09:45:36 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* super.c (check_super_block): Skip the device size check if the
		get_device_size returns EXT2_EXT_UNIMPLEMENTED.

	* iscan.c (main): Don't use fatal_error() anymore.

	* pass1b.c, swapfs.c, badblocks.c: Set E2F_FLAG_ABORT instead of
 		calling fatal_error(0).

	* problem.c, pass3.c (PR_3_ROOT_NOT_DIR_ABORT, 
		PR_3_NO_ROOT_INODE_ABORT): New problem codes.
	
	* problem.c, pass2.c (PR_2_SPLIT_DOT): New problem code.

	* problem.c, pass1.c (PR_1_SUPPRESS_MESSAGES): New problem code.
	
	* problemP.h: New file which separates out the private fix_problem
		data structures.

	* util.c, dirinfo.c, pass1.c, pass1b.c, pass2.c, pass5.c, super.c,
 		swapfs.c util.c: allocate_memory() now takes a e2fsck
 		context as its first argument, and rename it to be
 		e2fsck_allocate_memory().

Mon Nov  3 14:35:29 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* unix.c (main): Add a special case check for the error code EROFS
		and display an appropriate error message for this case.

	* [lots of files]:  Change ext2fs_read_inode, ext2fs_write_inode
		to take the e2fsck context as their first argument.
		Change dir_info.c routines to take an e2fsck_context,
		renamed them to start with e2fsck_ to avoid namespace
		issues, and changed them to store the directory
		information inside the e2fsck context.
		Added e2fsck_run() which calls all of the e2fsck passes in
		the correct order, and which handles the return of abort
		codes.  Added abort processing, both via setjmp/longjmp
		and via flags in the e2fsck context.  Use a flag in the
		e2fsck context instead of the restart_e2fsck global
		variable.   Change uses of free and malloc to
		ext2fs_free_mem and ext2fs_get_mem.
	
Fri Oct 31 01:12:43 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* pass1.c, pass3.c: Rename new error codes to _ET_ in them for
	 	consistency.

Sat Oct 25 00:10:58 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* pass3.c (get_lost_and_found): Check error return of 
		EXT2_FILE_NOT_FOUND instead of ENOTDIR

	* pass1.c (pass1_check_directory): Return EXT2_NO_DIRECTORY
		instead of ENOTDIR

Fri Oct 24 00:12:39 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* unix.c (PRS): Make the variable which getopt returns into be
		an int, so that it won't lose on platforms where char is
		unsigned. 

	* pass1b.c (clone_file): Fix bug in error reporting in the case
 		where cs.errcode is non-zero.

Sun Oct 19 21:12:11 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* pass*.c, super.c, unix.c, util.c, e2fsck.h: Place #ifdef
		RESOURCE_TRACK around code which uses init_resource_track
		and print_resource_track.  (Not all systems have timeval)

	* super.c: Remove excess #includes which are not necessary.

	* e2fsck.h: Add #ifdef's for HAVE_SYS_TYPES_H and HAVE_SYS_TIME_H

Fri Oct  3 13:40:03 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* pass*.c, super.c: Massive changes to avoid using printf and
		com_err routines.   All diagnostic messages are now routed
		through the fix_problem interface.

Sat Sep  6 17:13:28 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* pass2.c (check_dir_block): Check for duplicate '.' and '..'
		entries. 

	* problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
	 	PR_2_DUP_DOT_DOT.

Tue Sep  2 09:04:51 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* problem.c: Added new problem codes for some of the
		superblock corruption checks, and for the pass header
		messages.  ("Pass 1: xxxxx")

	* util.c (print_resource_track): Now takes a description
		argument. 

Mon Aug 25 10:23:13 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* super.c, unix.c, e2fsck.c: New files to separate out the
		operating-specific operations out from e2fsck.c.  
		e2fsck.c now contains the global e2fsck context management
		routines, and super.c contains the "pass 0" initial
		validation of the superblock and global block group
		descriptors. 

	* pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
		(nearly) all global variables and moved them to the e2fsck
		context structure.

	* problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
 		PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS,
 		PR_0_BLOCKS_PER_GROUP, PR_0_FIRST_DATA_BLOCK

Thu Aug 14 10:55:21 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* message.c: Add compression for the word "Illegal"

	* problem.c: Added entries for PR_2_BAD_CHAR_DEV and
	 	PR_2_BAD_BLOCK_DEV

Wed Aug 13 09:55:57 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* pass1.c (pass1, check_device_inode), pass2.c
 		(process_bad_inode): Use a more stringent test for a valid
 		device.

Sun Aug 10 18:58:02 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* e2fsck.c (check_mount): Add stronger warning message about the
		perils of running e2fsck on a mounted filesystem.

Tue Jun 17 01:33:20 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* Release of E2fsprogs 1.11

Thu Jun 12 00:25:31 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* pass1.c (mark_table_blocks): Mark the superblock and group
		descriptor blocks first, so that any conflicts between
		these and the bitmap or inode table blocks is noticed.

	* problem.c: Fix message printed out when a block or inode bitmap
		conflicts with other fs data, has the correct group number
		in it.

Tue Jun 10 12:07:37 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* pass2.c (pass2): Check the error return from ext2fs_dblist_iterate.

Thu May  8 22:45:27 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* e2fsck.8.in: Fix minor typos and grammer oops found by Bill
 		Hawes (whawes@star.net).

	* badblocks.c (read_bad_blocks_file): Pass the blocksize to the
		bad blocks command so that all of the filesystem gets
 		tested in the case where the blocksize 2048 or 4096.

Thu Apr 24 12:16:42 1997  Theodre Ts'o  <tytso@localhost.mit.edu>

	* Release of E2fsprogs version 1.10

Mon Apr 21 22:43:08 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* pass1b.c (pass1b): While scanning for inodes, simply skip inodes
 		where ext2fs_get_next_inode returns the 
 		EXT2_ET_BAD_BLOCK_IN_INODE_TABLE error.

Thu Apr 17 12:23:38 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* Release of E2fsprogs version 1.09

Fri Apr 11 18:56:26 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* Release of E2fsprogs version 1.08

Thu Apr 10 13:51:16 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* pass1b.c (clone_file_block): If we clone a directory, we need to
		update the dblist entry so that we check (and correct) the
		right directory block.

Sun Apr  6 09:13:12 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* pass1.c (process_block): Don't clear blocks references to
		filesystem metadata; let pass 1B handle this case.

	* problem.c, problem.h: Add new problem, PR_1B_SHARE_METADATA.

	* pass1b.c (pass1d): Deal with a block which is shared with
 		filesystem metadata.

	* e2fsck.h: Make block_illegal_map be a global variable

Sat Apr  5 11:51:58 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* e2fsck.c, pass1.c (mark_table_blocks): Support the sparse_super
	 	feature.
		(get_backup_sb): New function which attempts to obtain the
	 	correct backup superblock (if possible).

Fri Apr  4 10:46:26 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* e2fsck.c (main): Check the version of the library, and warn if
		the library is out of date; this happens generally due to
		users who manually install e2fsprogs.

	* pass1.c (pass1_get_blocks): If the passed in inode number for
 		get_blocks isn't what we're expecting pass back
 		EXT2_ET_CALLBACK_NOT_HANDLED.

Wed Mar 12 13:32:05 1997  Theodore Y. Ts'o  <tytso@mit.edu>

	* Release of E2fsprogs version 1.07

Tue Mar 11 10:31:47 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* icount.c: New file which implements an inode count abstraction.
		This significantly reduces amount of memory needed to
		check really large filesystems.

	* pass1.c, pass2.c, pass3.c, pass4.c: Modified to use the icount
	 	abstraction.

Fri Mar  7 08:28:55 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* dirinfo.c (dir_info_iter): New function which allows iteration
		over the directories in the dir_info map.

	* pass3.c (pass3, check_directory): Speed up pass 3 by iterating
		over all directories in the dir_info structure, instead of
		iterating all inodes looking for directories, and then
		looking up the directories using get_dir_info().

Sat Feb  1 11:33:43 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* pass1.c (pass1, process_block): 
	* pass2.c (pass2): Use the ext2_dblist abstraction instead of
		manual code to manage the directory block list information.

	* pass1.c (check_blocks), pass1b.c (pass1b), pass2.c
	 	(deallocate_inode): Call the ext2 library routine
 	 	ext2_inode_has_valid_blocks() instead of
 	 	inode_has_valid_blocks().

	* swapfs.c (swap_inodes): Add check so that we don't try to call
		swap_inode_blocks unless the inode has valid blocks.
		(Otherwise a long fast symlink might cause
		swap_inode_blocks to erroneously get called.)

Wed Jan 22 14:42:53 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* problem.c, problem.h: Added entries for PR_2_DOT_NULL_TERM and
 	 	PR_2_DOT_DOT_NULL_TERM.

	* pass2.c (check_dot, check_dot_dot): Make sure the new . and
 		.. entries are null-terminated, since the 2.0 kernel
 		requires this (for no good reason).

Mon Jan 20 20:05:11 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* pass1.c (pass1): Set the EXT2_SF_SKIP_MISSING_ITABLE flag so
		that we can recover from missing inode tables.

	* dirinfo.c (get_dir_info): If there are no directories in the
 		dir_info abstraction, don't core dump (because dir_info is
 		NULL).

	* e2fsck.c (main): Don't try using the backup superblocks if there
		aren't any.
		(check_super_block): If there are illegal inode table or
		bitmaps, set the filesystem as being in error.

Wed Jan 15 11:32:01 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* pass2.c (check_dir_block): Added check to make sure that rec_len
 		is a a multiple of 4 (so that the directory entries are
 		4-byte aligned).

Sat Dec 28 12:16:32 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* Makefile.in (uninstall): Uninstall all programs in the PROGS
		line.
		(PROGS): Don't build and install the extend program by
		default. 
	

Sat Dec  7 16:41:02 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* pass1.c (process_inodes): Make sure the stashed_ino variable is
 		saved and restored as well.
		(pass1): For fast sym links, skip the check_blocks
		processing step altogether.

Mon Dec  2 09:28:24 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* problem.c, message.c: New files, to completely refurbish how
		filesystem problems are reported to the user.  The
		diagnostic messages are now encoded out in an easily
		customizable, extensible format.  The messages printed out
		in preen mode are all on one line, and contain the device
		name.

Fri Nov 29 20:26:08 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* swapfs.c (swap_inodes): When swapping a filesystem, ignore
		deleted files.

	* pass1.c (pass1): Ignore missing inode table errors during the
		scan, and just skip past those inodes.

	* pass3.c (check_root): Remove root_ino argument, and assume that
		the root inode must be EXT2_ROOT_INO.  Move responsibility
		of setting the parent of the root inode in the directory
		inode structure to pass2().

	* pass2.c (check_dir_block): Don't allow links to the root
		directory.  

	* dirinfo.c (add_dir_info): Remove last argument to add_dir_info,
		since the inode is no longer used.

Tue Oct 15 00:06:49 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* e2fsck.c (main): If the superblock magic number is wrong, or the
		block group fails a sanity check, then automatically
		restart trying to use the backup superblocks.

	* pass1.c (mark_table_blocks): Make the inode tables ahead of
		everything else; in the case where a bitmap block overlays
		the inode table, the inode table should take precedence.

	* pass2.c (maybe_clear_entry): Make the deleted/unused error
		message fit on one line, since the error can happen during
		a preen pass.  (We eventually need to revamp the whole
		e2fsck error reporting and prompting system, but that's a
		job for another day.)

Mon Oct 14 22:29:49 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* e2fsck.c (main): Read in the list badblocks into fs->badblocks
		for the benefit of the inode scan functions. 

	* pass1.c (pass1): If ext2fs_get_next_inode() returns an error
		indicating that an inode is in a bad block, mark that
		inode as being used, as well as in the inode "bb" map.

	* pass2.c (maybe_clear_entry): New function which generalizes the
 		error cases when a directory entry needs to be cleared.
		(check_dir_block): If an inode is in the "bb" map, offer
 		to clear the directory entry, since the inode is in a bad
 		block.

	* pass4.c (pass4): If an inode is marked as used, but is is marked
		in the "bb" map, don't process it as a disconnected inode.

Tue Oct  8 02:02:03 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* Release of E2fsprogs version 1.06

Mon Oct  7 00:45:30 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* e2fsck.c (main): Print out the version number of the shared
		library when using the -V option.

	* swapfs.c (swap_filesys): Change EXT2_SWAP to EXT2_FLAG_SWAP for
	 	consistency's sake.

	* e2fsck.c (main): By setting EXT2_FLAG_MASTER_SB_ONLY, only write
 		out the backup superblocks when we know we have a valid
 		filesystem.

Tue Oct  1 22:00:29 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* util.c (preenhalt): Make it explicit on preenhalt that running
		e2fsck manually means without the -a or -p flag.

Fri Sep 27 14:41:08 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* pass1.c (pass1): Add support for the EXT2_BOOT_LOADER inode.
		(Linux/FT actually sets the mode bits, so we have to
		handle it specially.)

	* e2fsck.c (check_if_skip): Print a message if the filesystem is
 		just dirty, so that the user knows that it's about to be
 		checked (since this will take a while).

Mon Sep 16 17:00:01 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* pass4.c: If a disconnected inode is zero-length, prompt to
		delete it instead of connecting it to lost+found.

Thu Sep 12 15:23:07 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* Release of E2fsprogs version 1.05

Fri Aug 30 20:24:30 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* pass4.c (pass4): If the user refuses to connect an unattached
		inode to lost+found, don't try to set i_links_count.  This
		is bad, since if the user says yes, the inode will be
		marked as unused, which is not necessarily the right
		thing, especially since the rest of the cleanup doesn't
		happen here.

	* pass2.c (deallocate_inode): Set inode_link_info[ino] when
		dellocating an inode.  (Not strictly necessary, but...)

	* pass4.c (pass4): Add "bonehead" explanation to the "programming
		error" message.

Tue Aug 27 11:26:32 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* e2fsck.c (PRS,main): Added new options -s and -S.  -s will
 		byte-swap the filesystem so that it is normalized.  -S
 		will byte-swap the filesystem regardless of its current
 		byte-order.

	* swapfs.c: New file, which will byte-swap a filesystem.

Tue Aug 20 09:41:37 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* pass1.c (pass1): Change handling on files with non-zero dtime
		and non-zero i_link_count; before we treated them as
		deleted file per botched ext2 0.3c kernel behavior.  We
		now clear dtime instead.

Mon Aug 19 23:33:57 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* e2fsck.c (main): If e2fsck sets the clean bit, even if
		nothing else is changed, make sure FSCK_NONDESTRUCT is
		set (since after all having the filesystem set to
		invalid is an error.  :-)

Fri Aug  9 10:25:13 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* pass1.c (process_block): Make sure that meta data doesn't get
		accidentally set in the dir_blocks array (which could
		happen in some error condtions).
	
	* pass1.c (pass1): 
	* pass2.c (process_bad_inode): Check for fragments in a
		OS-independent fashion.

Thu Aug  8 15:20:54 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* e2fsck.c (check_if_skip): Close the filesystem when skipping the
		cleanup for the filesystem.

Mon Jul 22 22:03:28 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* e2fsck.c: Improve corrupt_msg, so that it's less confusing.

Thu May 16 11:12:30 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* Release of E2fsprogs version 1.04

Wed May 15 21:41:29 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* e2fsck.c (relocate_hint): Issue a hint that the user may wish to
		try "e2fsck -b 8193" before allowing e2fsck to relocate
		inode table blocks.

	* Makefile.in (e2fsck): Build e2fsck statically or dynamically
		depending on the option to configure.  Added targets for
		e2fsck.static and e2fsck.shared for people who want to
		build a static or shared variant manually.

Wed Mar 27 00:33:40 1996    <tytso@rsts-11.mit.edu>

	* Release of E2fsprogs version 1.03

Tue Mar 26 12:03:42 1996    <tytso@rsts-11.mit.edu>

	* e2fsck.c (show_stats): Don't use floating point to display
		percentage of non-contiguous files, as different libc
		handle result truncation differently, and this causes the
		test suite to bomb out depending on which libc you are
		using.

	* util.c (allocate_memory): Fix error message to omit extraneous
		%%s.

Tue Mar  5 03:50:40 1996    <tytso@rsts-11.mit.edu>

	* pass4.c (pass4): 
	* pass2.c (check_dir_block): 
	* pass1.c (pass1): Add support for dynamic first inode revision.

Wed Feb 14 16:27:30 1996    <tytso@rsts-11.mit.edu>

	* pass3.c (check_root): Fix spelling typo

Mon Feb  5 22:30:30 1996    <tytso@rsts-11.mit.edu>

	* e2fsck.c (check_super_block): If the superblock fails certain
		internal consistency checks, exit with a fatal error after
		printing the "superblock is corrupt message".

Wed Jan 31 11:06:08 1996    <tytso@rsts-11.mit.edu>

	* Release of E2fsprogs version 1.02

Wed Dec 15 21:24:26 1996    <tytso@rsts-11.mit.edu>

	* pass1.c (process_block): Check to see if a file is "fragmented".
		i.e., non-contiguous.  Note that any file which is larger
		than the block group is guaranteed to be non-contiguous.
		We may want to use a different hueristic for deciding
		whether or not a file is "fragmented".

	* e2fsck.c (show_stats): Print statistics of how many
		non-contiguous files are on the system.

Fri Dec 15 19:19:47 1995    <tytso@rsts-11.mit.edu>

	* badblocks.c (read_bad_blocks_file, test_disk): Fold
		functionality of test_disk() (which runs badblocks) into
		read_bad_blocks_file(); test_disk() now calls
		read_bad_blocks_file() with a NULL bad_blocks_file
		argument.

Mon Nov 20 18:30:10 1995    <tytso@rsts-11.mit.edu>

	* e2fsck.c (check_mount): Use #if defined(__linux__) instead of
		#if defined(linux).  The latter won't work if we're
		compiling -ansi.

Mon Oct 30 20:31:17 1995    <tytso@rsts-11.mit.edu>

	* e2fsck.c (check_mount): For Linux systems, the check to see if
		the root is mounted read-only has to be done for all
		filesystems, not just for the root filesystem, due to the
		way that some /etc/rc scripts are set up.

Thu Oct 26 12:05:30 1995    <tytso@rsts-11.mit.edu>

	* Makefile.in (install): Strip programs when they are installed.
		(e2fsck): Build e2fsck statically.

Wed Oct 25 21:18:16 1995    <tytso@rsts-11.mit.edu>

	* util.c (preenhalt): Preenhalt now takes an argument, which is an
		ext2fs_filsys; this allows it to set the EXT2_ERROR_FS
		flag in the superblock in cases where preenhalt is called.
		All calls to preenhalt() were changed to either
		preenhalt(fs) or preenhalt(NULL) in a few cases where the
		fs pointer was not available.  (Most notable, for block
		read/write errors.)

Mon Sep  4 21:41:03 1995  Remy Card  <card@bbj>

	* ehandler.c:
	  util.c: Include <sys/time.h> before <sys/resource.h>.  BSD needs it.

Mon Sep  4 10:14:49 1995    <tytso@rsts-11.mit.edu>

	* e2fsck.c (show_stats): Show statistics about how many inodes
		have indirect, doubly indirect, and triply indirect
		blocks.  Allow up to 8 digits for statistics, instead of
		merely 6, so things look pretty for large filesystems.

	* pass1.c (pass1): Keep statistics about indirect, doubly
	        indirect, and triply indirect blocks.

	* pass1.c (unwind_pass1): Clear the above statistics when unwinding
		pass 1.

Fri Aug 18 15:17:10 1995  Theodore Y. Ts'o  <tytso@dcl>

	* util.c, ehandler.c: Move #include of <sys/resource.h> after
		#include of "e2fsck.h", since sys/resource.h may depend on
		sys/time.h, which is #included in e2fsck.h.

Thu Aug 17 22:33:37 1995    <tytso@rsts-11.mit.edu>

	* e2fsck.c (check_mount):  Use the new ext2fs_check_if_mounted()
		function to determine if the device is mounted.

	* e2fsck.c (main):  Add better error messages if ext2fs_open()
		fails. 

Wed Aug 16 16:25:02 1995    <tytso@rsts-11.mit.edu>

	* pass1.c (check_blocks): If we're clearing a directory, clear
		pb.is_dir so we don't do the following check of making
		sure the directory size matches; this is pointless, since
		we've already cleared the inode.

Fri Aug 11 09:08:54 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>

	* pass1.c (bad_primary_block): New function, called by
		process_bad_block, which explains the facts of life to the
		user when a block in the primary superblock or primary
		group descriptors is bad.

	* pass2.c (check_dot): Handle the case where the first directory
		entry is used, but not ".".

	* pass2.c (check_dotdot): Handle the case where the second directory
		entry is used, but is not "..".

Thu Aug 10 10:05:10 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>

	* e2fsck.c (check_super_block): Get the size of the physical
		device and if it is smaller than the reported size of the
		filesystem, report an error.

Sat Aug 12 03:39:18 1995  Remy Card  <card@bbj>

	* e2fsck.c (check_if_skip): Print the number of allocated files and
		blocks on clean filesystems.

Fri Aug 11 14:15:36 1995  Remy Card  <card@bbj>

	* e2fsck.8: Updated date and version number.

Thu Aug 10 14:26:01 1995  Remy Card  <card@bbj>

	* pass1.c (check_blocks): Check that directory size matches *exactly*
		the count of allocated blocks.

Wed Aug  9 21:21:24 1995  Theodore Y. Ts'o  <tytso@dcl>

	* pass1b.c (pass1d): Free the shared[] array when we're done with
		it to avoid a memory leak.

	* pass1.c (unwind_pass1): Use ext2fs_free_block_bitmap to free the
	        block_dup_map.

	* pass2.c (process_bad_inode): When clearing the inode, make sure
		the pathname is freed, to prevent a memory leak.

	* pass5.c (check_inode_bitmaps): Free free_array and dir_array
		when we're finished with them.
		(check_block_bitmaps): Free free_array when we're finished
		with them.

	* Makefile.in (e2fsck, flushb): Use $(LD) instead of $(CC) when
		linking the executable.

	* pass2.c (process_bad_inode): Even on OS's that don't support the
		fragment fields, make sure the Linux equivalent fields are
		set to zero.  If an OS wants to reuse these fields, which
		is probably a bad idea (although we may get desperate in
		the future) this code will have to be changed.

	* pass1.c (dir_block_cmp): If the block numbers are equal, compare
		on the inode field, and then blockcnt field.  This is just
		to keep the ordering of dir_blocks the same on all
		platforms when there are more than on missing directory
		blocks, which are indicated directories with holes, which
		are indicated with the block number being set to zero.

Sun Aug  6 15:40:58 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>

	* pass1.c (check_blocks, process_block): check_blocks() modified
		to call the ext2fs_block_iterate() with BLOCK_FLAG_HOLE if
		the inode is a directory.  process_block() now checks to
		see if a directory has a "hole", or missing block.  If so,
		this fact is recorded in the directory block list so that
		the problem can be resolved in pass #2.

	* pass2.c (allocate_dir_block): Added allocate_dir_block() to
		allocate new blocks for directories with "holes".  Called
		out of check_dir_block if a block in the directory block
		list is zero.

	* pass3.c (get_lost_and_found): Move location of free(block) to
		prevent possible memory leak.

Sat Aug  5 12:42:22 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>

	* pass2.c (check_dir_block): Use a automatic, fixed-saize array
		instead of alloca() --- alloca is not portable!  Check to
		make sure the filename is not longer than EXT2_NAME_LEN,
		and offer to fix it by truncating it, since it should
		never happen.

	* e2fsck.c (PRS): Use malloc() instead of alloca() --- alloca() is
		not portable!!  In any case putenv() in some systems must
		take a static character array or malloc()'ed memory;
		passing memory allocated using alloca() to putenv() is not
		advisable.

	* pass2.c (check_dot, check_dotdot): Use malloc() instead of
		alloca() --- alloca() is not portable!!!

Tue Jul 18 20:04:02 1995    <tytso@rsx-11.mit.edu>

	* pass1b.c (pass1c): 
	* pass3.c (check_root, get_lost_and_found): 
	* pass2.c (check_dir_block): Use ext2fs_{read,write}_dir_block
		to read/write the directory block.

Mon Jul 17 04:00:56 1995    <tytso@rsx-11.mit.edu>

	* util.c (ask_yn): Apply patch supplied by Peter A. Zaitcev to
		make sure VMIN and VTIME are set correct.

Fri Jul 14 19:26:29 1995    <tytso@rsx-11.mit.edu>

	* pass1.c (mark_block_used): Change to be an inline function.
		Assume that the block validity checks are already done,
		and use the fast variant of the bitmap functions.

Thu Jul 13 08:10:55 1995    <tytso@rsx-11.mit.edu>

	* pass5.c (check_block_bitmaps, check_inode_bitmaps): Check the
		bounds of the bitmaps in advance, and then use the fast
		variant of e2fs_test_{block,inode}_bitmap.

	* pass1.c (mark_block_used): Use ext2_fast_mark_block_bitmap since
		the bounds checking has already been done earlier.

Wed Jul 12 02:22:46 1995    <tytso@rsx-11.mit.edu>

	* pass1.c (pass1): Allocate and free the block_illegal_map, which
		is used for shortcut processing in process_block.
		(mark_table_blocks): Initialize block_illegal_map with the
		filesystem blocks.
		(describe_illegal_block): New helper function that
		describes why a block is illegal.
		(process_block): Use block_illegal_map as a shortcut
		to determine whether a block is bad.  Use
		describe_illegal_block to print out why the block is illegal.

Mon Jun 12 19:11:06 1995  Theodore Y. Ts'o  (tytso@dcl)

	* flushb.c: Don't include <linux/fs.h> if it doesn't exist.

	* scantest.c: Don't include <linux/fs.h>, <getopt.h>, or
		<mntent.h> if they don't exist.  (Mostly so that "make
		depend" works.)

	* pass1.c, pass1b.c, pass3.c, badblocks.c: Include <errno.h> (if
		it exists).

	* e2fsck.c, scantest.c: Don't include <getopt.h> if it doesn't
		exist. 

Mon Jun 12 08:37:49 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>

	* pass2.c (process_bad_inode, check_for_zero_long,
	        check_for_zero_char):  Change long to u32, and char to u8.

Sun Jun 11 15:05:57 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>

	* util.c (inode_has_valid_blocks): 
	* pass2.c (process_bad_inode): 
	* pass1.c (pass1, check_blocks, pass1_check_directory): Use
		LINUX_S_IS* instead of S_IS*.

	* e2fsck.h: Don't #include <sys/stat.h>

	* flushb.c (main): Add #ifdef BLKFLSBUF around ioctl.  (Although
		this program is pretty much useless if BLKFLSBUF isn't
		supported.)

	* e2fsck.c, badblocks.c: Add #include <errno.h>, since errno is
	        used.

Thu Jun  8 12:31:19 1995  Miles Bader  <miles@churchy.gnu.ai.mit.edu>

	* pass2.c (check_dot, check_dotdot, check_dir_block): Use alloca
	to allocate space for file names instead of using fixed size buffers.
	(process_bad_inode): Only check inode frag fields if
	HAVE_EXT2_FRAGS is defined (by configure).
	* pass1.c (pass1): Only check the inode frag fields if
	HAVE_EXT2_FRAGS is defined (by configure).

	* e2fsck.c (check_mount): Only check for a mounted filesystem if
	HAVE_MNTENT_H is defined (by configure).
	(PRS): Use alloca to allocate the new path string, instead of
	having a fixed size buffer (which was the wrong size anyway).
	(PRS): Only support the -F (flush) option if the BLKFLSBUF ioctl
	is defined.

	* e2fsck.h: Only include <linux/fs.h> if HAVE_LINUX_FS_H is
	defined (by configure).

	* Makefile.in: Rewritten to conform to GNU coding standards and
	support separate compilation directories.

Thu Apr  6 15:04:36 1995  Remy Card  <card@bbj.ibp.fr>

	* pass1.c (pass1): Test the mode in reserved inodes (must be zero).

Sat Mar 11 13:12:16 1995  Theodore Y. Ts'o  <tytso@localhost>

	* pass1.c (unwind_pass1): Clear the file type statistics counter
		when pass 1 needs to be restarted from scratch.

	* pass1.c (handle_fs_bad_blocks): Fix bug where bitmap blocks were
		being reallocated to blocks in the next block group,
		instead of the current block grup.

	* pass1.c (pass1, check_blocks): Set inode_link_info[ino] whenever
		inode.i_links_count is set.

Tue Feb 14 01:38:04 1995  Theodore Y. Ts'o  (tytso@rt-11)

	* pass1.c (process_block): Add checks for if the block is
		trepassing on a superblock or group descriptor table.

Sat Dec 31 00:52:11 1994    <tytso@rsx-11.mit.edu>

	* main.c (corrupt_msg): Extend the message which is printed out
		when the superblock is corrupt, to include the suggestion
		of using the -b option to specify an alternate superblock.

Thu Nov 24 09:29:58 1994  Theodore Y. Ts'o  (tytso@rt-11)

	* badblocks.c (read_bad_blocks_file): If we are adding or
		replacing bad blocks in the bad blocks inode, sanity check
		the bad block inode first, and clear out any illegal blocks.

	* pass2.c (check_name): Don't bomb out if the attempt to get the
		pathname of the containing directory returns an error; the
		directory may be too badly damaged to expect that
		ext2fs_get_pathname will always succeed.  Use "???" if the
		pathname can't be obtained (it's only for a printf to the
		user anyway).

		The name of the containing directory and the bad filename
		were incorrectly interchanged in the user message.  Fixed.

	* pass2.c (check_name, check_dir_block): Use a common static
		string for the unknown pathname.

Mon Nov  7 22:30:54 1994  Remy Card  <card@bbj>

	* Fixed lots of printf formats to make sure that block and inode
	numbers are printed as unsigned integers.

Mon Oct 24 14:10:46 1994    (tytso@rsx-11)

	* pass5.c (check_block_end): Fix calculation of how the last block
		in the block bitmap should be calculated.

Wed Sep  7 10:01:13 1994    (tytso@rsx-11)

	* pass1b.c (pass1_dupblocks): Fix declaration of dup_inode_map to
		be an ext2fs_inode_bitmap, and free it properly.

	* e2fsck.h
	* e2fsck.c (main): Folded in Remy Card's changes to add a revision
	level to the superblock.

Wed Aug 17 22:00:20 1994  Remy Card  (card@bbj)

	* e2fsck.c (usage): Fixed bogus usage message.

Wed Aug 17 11:21:45 1994  Theodore Y. Ts'o  (tytso@rt-11)

	* pass1.c (process_bad_block): Fixed bug so that blocks in the
	backup superblocks and group descriptors are handled gracefully.

