E2fsprogs 1.16 (October 22, 1999)
=================================

Fixed a race condition bug in fsck; when printing a progress bar, if
checking multiple filesystems in parallel, it was possible for fsck to
send e2fsck a SIGUSR1 signal before e2fsck had installed its signal
handler, which would cause it to terminate with a signal 10.

E2fsck now properly handles filesystems that have the
INCOMPAT_FILETYPE feature turned on.  It can be used to convert a
filesystem into using or not using FILETYPE feature.

E2fsck now properly handles filesystems that have the IMAGIC feature
turned on (this is used on Linux AFS servers).

The mke2fs program now creates filesystems that have the filetype and
sparse_superblock features enabled by default, unless it is run on a
pre-2.2 kernel.  These features are not supported by a pre-2.2 kernel,
so there is now a new flag -O which allows the user to specify with
which features she would like to create the filesystem; "mke2fs -O
none" will create a filesystsem compatible with 2.0 kernels.

The tune2fs program now has a -O option which allows the user to set
and reset "safe" filesystem features.  Currently, the only ones which
allows to be modified are the filetype and sparse_superblock features.
Note setting or clearing either feature will require running e2fsck on
the filesystem afterwards.  (n.b. Clearing the sparse_superblock feature
requires that there is enough free space on the filesystem for the
extra superblocks which will be created by e2fsck.)

Debugfs can now set and print filesystem features in the superblock
using the "features" command.  Dumpe2fs will print out the complete
set of features when listing the superblock.

Dumpe2fs has new options -f (force) and -h (header-only).

Fixed a bug in e2fsck which could cause the PROGRAMMING ERROR/bonehead
message to come up.  This could happen when decrementing or
incrementing a link count could result in an overflow.

Fixed a bug in e2fsck where the block count on the lost+found
directory would not be properly incremented when the directory was
expanded to the point where an indirect block needed to be allocated.

E2fsck now makes some additional sanity checks on the superblock to
avoid crashing or giving a memory allocation error if some of the
values in the superblock are unresonable (but the superblock otherwise
looks valid).

Fixed a bug in e2fsck where a very badly corrupted filesystem might
require two passes to completely fix the filesystem.  This happened if
an inode claimed blocks that was part of the filesystem metadata
(typically, when garbage was written into an inode table or indirect
block, since this kind of filesystem corruption normally doesn't
happen otherwise).

On the Alpha, glibc declares st_flags although it isn't actually used;
the configure script was improved to detect this case so that
e2fsprogs can avoid using the non-functional stat field.

The manual pages were updated to use a more consistent formatting
style consistent with standard Unix man pages.  Mke2fs's man page
added documentation for a few previously undocumented options.

Fixed minor display bugs in tune2fs and mke2fs.

Programmer's notes:
-------------------

Improved portability of e2fsprogs to non-Unix systems (in particular, NT).

Added features to parse and print feature strings into the e2p library.  
(e2p_feature2string, e2p_string2feature, e2p_edit_feature).

ext2fs_mkdir() and ext2fs_new_dir_block() now creates directories
whose directory entries contain proper filetype information if the
filesystem supports it.

ext2fs_link() now uses the low 3 bits of its flags parameter to pass
the directory entry filetype information.  This is used to set the
directory entry filetype information if the filesystem supports it.

Fixed a bug in ext2fs_expand_dir() where the block count in a
directory's inode would not be properly incremented when the directory
was expanded to the point where an indirect block needed to be
allocated.


E2fsprogs 1.15 (July 18, 1999)
==============================

Add configuration checks so that e2fsprogs will compile cleanly on
Linux 2.3 kernels that have renamed i_version to i_generation.

E2fsck now prints a progress/completion bar (and not just a simple
spinner) if the -C0 option is requested or if it receives a SIGUSR1
signal.  Fsck will automatically manage the (potentially muliple)
e2fsck processes to print completion bars if it is given a -C option,
with the right thing happening if multiple filesystems are being
checked in parallel.

Mke2fs now has better automatic hueristics to determine the filesystem
parameters to be used for a particular filesystem.  Added a new option
-T which allows the user to specify how the filesystem is to be used,
which helps mke2fs do a better job selecting the filesystem parameters.

Mke2fs now creates revision 1 filesystems by default, and with the
sparse superblock feature enabled.  The sparse superblock feature is
not understood by Linux 2.0 kernels, so they will only allow read-only
mounts of filesystems with this sparse superblocks.

Fix bug where if /dev/null couldn't be opened (should never happen),
e2fsck would hang in a tight loop.

Make e2fsck handle the case where /lost+found isn't a directory.

E2fsck now uses mallinfo if it exists to get accurate statistics about
its memory usage.

Fix bug in e2fsck where it wouldn't check to see if a disconnected
inode had any problems before connecting it to /lost+found.

Add check to e2fsck so it makes sure that total number of inodes in
the filesystem is a sane number.

Fix fencepost error when clearing an the end of the block bitmap which
caused the last block in the bitmap not to get cleared.

Cleaned up a number of messages in e2fsck:
	* The message "Group's #'s copy of the group descriptor..."
		was fixed so that the correct number would be displayed.
	* Added missing space in the "disk write-protected" error messsage
	* Cleaned up the error message printed when a non-interactive
		e2fsck needs to abort a check because the filesystem
		appears to be mounted.

Added a new command-line utility, uuidgen, which will create and print
a UUID.

Make debugfs's icheck command more robust by checking to make sure an
inode has valid blocks before interarting over the inode's blocks.

UUID generation now uses a random-based scheme whenever possible to
prevent potential privacy problems.

Man pages for all of the UUID functions in the lirbary were added.

Fixed bug in fsck so it won't coredump if a filesystem not in
/etc/fstab is given to it.

Fsck now understands the UUID=xxxx and LABEL=yyyy forms in /etc/fstab
that most of the other mount utilities understands.

Mke2fs will make a filesystem even if it appears mounted if the force
option is given.

Dumpe2fs has new command-line options which allow a filesystem expert
to specify the superblock and blocksize when opening a filesystem.
This is mainly useful when examining the remains of a toasted
filesystem.

The badblocks program has been updated to display correctly on disks
with large block numbers.

The badblocks program no longer gives spurious errors when errors
occur on non-block boundaries, which is common if the blocksize is
larger than 1k.

Mke2fs will sync the disk device every MKE2FS_SYNC block groups if the
MKE2FS_SYNC environment variable is set.  This is to work around a VM
bug in the 2.0 kernel.  I've heard a report that a RAID user was able
to trigger it even using a 2.2 kernel, but hopefully it will not be
needed for most Linux 2.2 users.

Fixed miscellaneous documentation and man pages.

Programmer's notes:
-------------------

Cleaned up functions such as pass1_get_blocks, pass1_read_inode which
in e2fsck's pass1.c really should have been static.

The return value of the uuid_compare() function was changed to make it
match with the convetions used by strcmp, memcmp, and Paul Leach's
UUID sample document.

The "make depend" process has now been made more automated; it now
automatically word-wraps the dependencies, and only replaces source
Makefile.in if there has been a change in the dependencies.  Also, a
top-level "make depend" now recurses through all the subdirectories
automatically.

The Makefile in .../util has been changed so that subst is built using
the native C compiler during a cross-compilation, since the subst
program is only used during the build process.  Also add an explicit
rule to build util/subst by cd'ing to the correct directory and
running Makefile.

The man directories are defined in terms mandir, so that the configure
script can override the location of the manual pages.

The config files have been updated to recognize new machine types for
both the i386 and alpha families.

Fsck has been modified so that it will accurately create an
fsck_instance even when the noexecute flag is set.  This allows for
accurate debugging of the fsck pass structure.  Also, when the verbose
flag is given twice, fsck will print debugging information about when
fsck is waiting for jobs to finish.


E2fsprogs 1.14 (January 9, 1999)
================================

Fix the fstab parsing code so that it can handle blank lines and
comment characters.  Also, missing pass numbers need to be treated as
zero.

Fixed a bug in e2fsck where under some circumstances (when e2fsck
needs to restart processing after fixing an egregious inconsistency)
it would try to access already freed memory.

E2fsck now prints non-printable characters in directory entries and
pathnames using '^' and 'M-' notation.

Fixed chattr so that it will ignore symbolic links when doing
recursive descent traversals.  For both chattr and lsattr, no longer
print the version string unless the -V option is given.

Allow the system administrator to directly specify the number of
inodes desired in the filesystem, for some special cases where this is
necessary.

Fix portability problems so that e2fsprogs can be compiled under Linux
1.2 systems and Solaris systems.

Update the config.guess file with a more recent version that will
identify newer Linux platforms.

Programmer's notes
------------------

Ext2fs_read_inode and ext2fs_write_inode will now return an error if
an inode number of zero is passed to them.

E2fsprogs 1.13 (December 15, 1998)
==================================

Fixed a bug in debugfs where an error messages weren't getting printed
when the ext2 library routines to read inodes returned errors in the
stat, cmri and rm commands.

Fixed a bug in mke2fs so that if a ridiculous inode ratio parameter is
provided, it won't create an inode table smaller than the minimum
number of inodes required for a proper ext2 filesystem.

Fsck now parses the /etc/fstab file directly (instead of using
getmntent()), so that it can distinguish between a missing pass number
field and pass number field of zero.  This caused problems for
diskless workstations where all of the filesystems in /etc/fstab have
an explicit pass number of zero, and fsck could not distinguish this
from a /etc/fstab file with missing pass numbers.

E2fsck will create a /lost+found directory if there isn't one in the
filesystem, since it's safer to create the lost+found directory before
it's needed.

Fixed e2fsck so that it would detect bogus immutable inodes which
happen to be sockets and FIFO files, and offer to clear them.

If a filesystem has multiple reasons why it needs to be checked, and
one of the reasons is that it is uncleanly mounted, e2fsck will print
that as the reason why the filesystem is being checked.

Cleaned up the output routines of mke2fs so that it doesn't overflow
an 80 column display when formating really big filesystems.

Added a sanity check to e2fsck to make sure that file descriptors 0,
1, 2 are open before opening the hard disk.  This avoids a problem
where a broken program might exec e2fsck with those file descriptors
closed, which would cause disastrous results if the kernel returns a
file descriptor for the block device which is also used by FILE *
stdout.

Fixed up the e2fsck progress reporting functions so that the values
reliably reach 100% at the completion of all of the e2fsck passes.

Fixed minor documentation bugs in man pages and usage messages.

Programmer's notes:
-------------------

Fixed a number of lint warnings in the ext2fs library and potential
portability problems from other OS's header files that might define
CPP macros for names like "max" and "min".

ext2fs_badblocks_list_add() has been made more efficient when it needs
to grow the bad blocks list.

Fixed a bug in e2fsck which caused it to dereference a freed pointer
just before exiting.

Fixed the substition process for generating the mk_cmds and compile_et
scripts so that they will work outside of the build tree.

Add sanity check to e2fsck so that if an internal routine
(ext2fs_get_dir_info) returns NULL, avoid dereferencing the pointer
and causing a core dump.  This should never happen, but...

E2fsprogs 1.12 (July 9, 1998)
==================================

E2fsprogs now works with glibc (at least with the version shipped wtih
RedHat 5.0).  The ext2fs_llseek() function should now work even with
i386 ELF shared libraries and if llseek() is not present.  We also
explicitly do a configure test to see if (a) llseek is in libc, and
(b) if llseek is declared in the system header files.  (See standard
complaints about libc developers don't understand the concept of
compatibility with previous versions of libc.)

The ext2fs library now writes out the block group number in each of
the superblock copies.  This makes it easier to automatically
determine the starting block group of the filesystem when the block
group information is trashed.

Added support for the EXT2_FEATURE_INCOMPAT_FILETYPE feature,
which means that e2fsprogs will ignore the high 8 bits of the
directory entry's name_len field, so that it can be used for other
purposes.

Added support for the EXT2_FEATURE_RO_COMPAT_LARGE_FILE feature.
E2fsprogs will now support filesystems with 64-bit sized files.

Added support for the EXT2_FEATURE_COMPAT_DIR_PREALLOC feature.

Added new program "e2label", contributed by Andries Brouwer.  E2label
provides an easy-to-use interface to modify the filesystem label.

Fixed bug so that lsattr -v works instead of producing a core dump.

Fixed a minor bug in mke2fs so that all groups with bad superblock
backup blocks are printed (not just the first one).

Mke2fs will check the size of the device, and if the user specifies a
filesystem size larger than the apparent size of the device it will
print a warning message and ask if the user wants to proceed.

E2fsck has a new option -C, which sends completion information to the
specified file descriptor.  For the most part, this is intended for
programs to use, although -C 0 will print a spinning character to the
stdout device, which may be useful for users who want to see something
happening while e2fsck goes about its business.

Fixed a bug in e2fsck which could cause a core dump when it needs to
expand the /lost+found directory, and sometimes the bitmaps haven't
been merged in.  Also fixed a related bug where ext2fs_write_dir_block
was used to write out a non-directory block.  (Which would be bad on a
non-Intel platform with byte swapping going on.)

Fixed bug in e2fsck where it would print a "programming error" message
instead of correctly identifying where a bad block was in used when
the bad block was in a non-primary superblock or block group
descriptor.  Also fixed a related bug when sparse superblocks are in
use and there is a bad block where a superblock or block group
descriptor would have been in a group that doesn't include a
superblock.

Fixed a bug in e2fsck (really in libext2fs's dblist function) where if
the block group descriptor table is corrupt, it was possible to try to
allocate a huge array, fail, and then abort e2fsck.
ext2fs_get_num_dirs() now sanity checks the block group descriptor,
and subsitutes reasonable values if the descriptors are obviously bogus.

If e2fsck finds a device file which has the immutable flag set and the
i_blocks beyond the normal device number are non-zero, e2fsck will
offer to remove it, since it's probably caused by garbage in the inode
table.

When opening a filesystem, e2fsck specially checks for the EROFS error
code, and prints a specific error message to the user which is more
user friendly.

If the filesystem revision is too high, change the e2fsck to print
that this is either because e2fsck is out of date, or because the
superblock is corrupt.  

E2fsck now checks for directories that have duplicate '.' and '..'
entries, and fixes this corruption.

E2fsck no longer forces a sync of the filesystem (with attendant sleep
calls) at all times.  The ext2fs_flush() function now performs a sync
only if it needed to write data blocks to disk.

Fixed a minor bug in e2fsck's pass1b's file cloning function, where
certain errors would not be properly reported.

Updated and expanded a few points in the man pages which users
complained wheren't explicit enough.

Added special case byte-swapping code if compiling on the PowerPC, to
accomodate the strange big-endian variant of the ext2 filesystem that
was previously used on the PowerPC port.


Programmer's notes:
-------------------

Removed C++ keywords from the ext2fs libraries so that it could be
compiled with C++.

E2fsck's internal organization has now been massively reorganized so
that pass*.c don't have any printf statements.  Instead, all problems
are reported through the fix_problem() abstraction interface.  E2fsck
has also been revamped so that it can be called as a library from a
application.

Added new fileio primitives in libext2fs for reading and writing
files on an unmounted ext2 filesystem.  This interface is now used by
debugfs.

Added a new libext2fs function for mapping logical block numbers of
a file to a physical block number.

Added a new libext2fs function, ext2fs_alloc_block(), which allocates
a block, zeros it, and updates the filesystem accounting records
appropriately.

Added a new libext2fs function, ext2fs_set_bitmap_padding(), which
sets the padding of the bitmap to be all one's.  Used by e2fsck pass 5.

The libext2fs functions now use a set of memory allocation wrapper
functions: ext2fs_get_mem, ext2fs_free_mem, and ext2fs_resize_mem,
instead of malloc, free, and resize.  This makes it easier for us to
be ported to strange environments where malloc, et. al. aren't
necessarily available.

Change the libext2fs fucntion to return ext2-specific error codes
(EXT2_DIR_EXISTS and EXT2_DB_NOT_FOUND, for example) instead of using
and depending on the existence of system error codes (such as EEXIST
and ENOENT).

Renamed io.h to ext2_io.h to avoid collision with other OS's header
files.

Add protection against ext2_io.h and ext2fs.h being included multiple
times.

The types used for memory lengths, etc. have been made more portable.
In generla, the code has been made 16-bit safe.  Added Mark
Habersack's contributed DOS disk i/o routines.

Miscellaneous portability fixes, including not depending on char's
being signed.

The io_channel structure has a new element, app_data, which is
initialized by the ext2fs routines to contain a copy of the filesystem
handle.

ext2fs_check_directory()'s callback function may now return the error
EXT2_ET_CALLBACK_NOTHANDLED if it wishes ext2fs_check_directory() to
really do the checking, despite the presence of the callback function.


E2fsprosg 1.11 (June 17, 1997)
==============================

Fixed e2fsck to detect (previously ignored) conflicts between the
superblock or block group descriptors and block bitmaps, inode
bitmaps, and inode tables.

Fixed bug in e2fsck so that when the message printed out when a block
or inode bitmap conflicts with other data, it has the correct group
number.

Fixed bug in e2fsck and mke2fs where the blocksize wasn't being passed
to badblocks.  This meant that not all of the filesystem was being
tested for bad blocks! 

Fixed an array boundary overrun case which cropped up in
ext2fs_badblocks_list_test when a user tried running "mke2fs -c 
-b 4096".

Adjusted the number of columns printed by mke2fs when displaying the
superblock backups to avoid running over 80 columns when making a
really big filesystem.

Fixed up the man pages for e2fsck, debugfs, badblocks, chattr,
dumpe2fs, fsck, mke2fs, and tune2fs (typos and other minor grammar
fixes), thanks to some suggestions from Bill Hawes (whawes@star.net).

Programmer's notes:
-------------------

Fixed install rule in lib/ss so that ss_err.h is actually getting
installed.

Fixed bug in ext2fs_copy_bitmap; the destination bitmap wasn't getting
bassed back to the caller.

Fixed bug in ext2fs_inode_scan_goto_blockgroup; it had not been
setting the current inode number (which meant this function wasn't
working at all).

Fixed bug in ext2fs_resize_generic_bitmap; it had not be zeroing all
blocks in the bitmap when increasing the size of the bitmap.

Changed the initial number of blocks allocated by ext2fs_init_dblist()
to be more realistic.

Added a new function ext2fs_allocate_group_table, which sets up the
group descriptor information (and allocates inode and block bitmaps,
and inode tables for a particular group).  The function was created by
factoring out code form ext2fs_allocate_tables().

Added a new function ext2fs_move_blocks which takes a bitmap of the
blocks to be moved, and moves them to another location on the
boardboard.

Make the unix_io channel's io_channel_flush implementation calls sync()
to to flush the kernel buffers to disk.

Added a new function ext2fs_dblist_count returns the number of
directory blocks in dblist.


E2fsprogs 1.10 (April 24, 1997)
===============================

Mke2fs once again defaults to creating revision #0 filesystems, since
people were complaining about breaking compatibility with 1.2 kernels.
Warning messages were added to the mke2fs and tune2fs man pages that
the sparse superblock option isn't supported by most kernels yet (1.2
and 2.0 both don't support parse superblocks.)

Added new flag to mke2fs, -R <raid options>, which allows the user to
tell mke2fs about the RAID configuration of the filesystem.  Currently
the only supported raid option is "stride" which specifies the width
of the RAID stripe.

Fixed bug in e2fsck where pass1b would bomb out if there were any
blocks marked bad in the inode table.

Fixed rare bug in mke2fs where if the user had a very unlucky number
of blocks in a filesystem (probability less than .002) the resulting
filesystem would be corrupt in the last block group.

Fixed bug where if e2fsck tried to allocate a block to fix a
filesystem corruption problem and the filesystem had no free blocks,
ext2fs_new_block() would loop forever.

The configure script now checks explicitly to see if "-static" works,
since that can't be assumed to be true --- RedHat doesn't install
libc-static by default.

Fixed bug in libext2's block iterator functions where under some
cirmcustances, file with holes would cause the bcount parameter to the
callback function to be incorrect.  This bug didn't affect any of
e2fsprogs programs, but it was discovered by Paul Mackerras, the
author of the PPC boot loader.

Removed use of static variables to store the inode cache in libext2fs.
This caused problems if more than one filesystem was accessed via
libext2fs (static variables in libraries are generally a bad idea).
Again, this didn't affect e2fsprogs programs, but it was discovered by
Paul Mackerras.

Fixed minor bugs and version code drift to assure that e2fsprogs 1.10
will compile cleanly with 1.2.13 kernels (even with a.out shared
libraries!)

Programmer's notes:
-------------------

Added new functions to duplicate an ext2 filesystem handle, and its
associated substructure.  New functions: ext2fs_dup_handle(),
ext2fs_copy_dblist(), ext2fs_badblocks_copy(), ext2fs_copy_bitmap().
Other structures, such as the io_channel and the inode_cache, now have
a ref count so that they only get freed when they are no longer used
by any filesystem handle.  (These functions were added as part of the
development effort for an ext2 resizer).

E2fsprogs 1.09 (April 14, 1997)
===============================

Fixed bug in mke2fs (really in lib/ext2fs/initialize.c) which was
accidentally introduced in the 1.08 release.  The overhead calculation
was accidentally removed, which caused ext2fs_initialize() to not
notice when the filesystem size needed to be adjusted down because
there wasn't enough space in the last block group.

Fixed bug in version parsing library routine; it was always parsing
the library version string, instead of using the passed-in string.

Clarified chattr man page.

E2fsprogs 1.08 (April 10, 1997)
===============================

E2fsck 1.07 was very slow when checking very large filesystems with a
lot of files that had hard links (i.e., news spools).  This was fixed
by seriously revamping the icount abstraction.  Added a formal test
suite for the icount abstraction.

Debugfs now has a "-l" option to the "ls" command, which lists the
inode number, permissions, owner, group, size, and name of the files
in the directory.

Fix a bug in e2fsck where when a directory had its blocks moved to
another location during the pass 1b processing, the directory block
list wasn't updated, so pass 2 wouldn't check (and correct) the
correct directory block.

E2fsck will now treat inodes which contain blocks which are claimed by
the filesystem metadata by treating them as multiply claimed blocks.
This way, the data in those blocks can be copied to a new block during
the pass 1b--1d processing.

E2fsck will attempt to determine the correct superblock number and
display it in the diagnostic and warning messages if possible.

Add support for a new (incompatible) feature, "sparse_super".  This
feature reduces the number of blocks which contain copies of backup
superblocks and block group descriptors.  (It is only an incompatible
feature because of a bug in ext2_free_blocks.)  mke2fs and tune2fs now
support a new -s option; e2fsck will recognize filesystems built with
this feature turned on.

E2fsck now checks the library to make sure is the correct version,
using new library functions.  (This helps to diagnose incorrectly
installed e2fsprogs distributions.)

Dumpe2fs now prints more information; its now prints the the
filesystem revision number, the filesystem sparse_super feature (if
present), the block ranges for each block group, and the offset from
the beginning of the block group.

Mke2fs now distributes the inode and block bitmap blok so that the
won't be concentrated in one or two disks in RAID/striping setups.
Also, if the user chooses a 2k or 4k block group, mke2fs will try to
choose the largest blocks per group that be chosen.  (For 2k blocks,
you can have up to 16384 blocks/group; for 4k blocks, you can have up
to 32768 blocks/group.)  Previously mke2fs would not allow
specification of more than 8192 blocks per group, even if you were
using a 2k or 4k block group.

Programmer's notes:
-------------------

Added a new function ext2fs_create_icount2() which takes a "hint"
argument.  This hint argument presets the icount array with the list
of inodes which actually need to be in the icount array.  This really
helps to speed up e2fsck.

Added a new function ext2fs_icount_validate() which checks the rep
invariant for the icount structure.  This is used mostly for testing.

The error mesasage given when a bad inode number is passed to
test_generic_bitmap to reflect EXT2FS_TEST_ERROR (instead of
EXT2FS_UNMARK_ERROR).

Added a new function ext2fs_set_dir_block which sets the block of a
dblist entry, given the directory inode and blockcnt.

Added a new function ext2fs_get_library_version() which returns the
current library version, and ext2fs_parse_version_string() which
returns a version number based on a e2fsprogs version string.

The icount functions will return EINVAL if the passed in inode number
is out of bounds.

E2fsprogs 1.07 (March 9, 1997)
==============================

E2fsck is now uses much less memory when checking really large
filesystems (or rather, filesystems with a large number of inodes).
Previously a filesystem with 1 million inodes required 4 megabytes of
memory to store inode count statistics; that storage requirement has
now been reduced to roughly half a megabyte.

E2fsck can now properly deal with bad blocks appearing inside the
inode table.  Instead of trying to relocate the inode table (which
often failed because there wasn't enough space), the inodes in the bad
block are marked as in use.

E2fsck will automatically try to use the backup superblocks if the
primary superblocks have a bad magic number or have missing meta-data
blocks (or meta-data blocks which are out of range).

E2fsck's pass 3 has been made more efficient; most noticeable on
filesystems with a very large number of directories.

Completely revamped e2fsck's system of printing problem reports.  It
is now table driven, to make them more easily customizeable and
extendable.  Error messages which can be printed out during preen mode
are now one line long.

Fixed e2fsck's filesystem swapping code so that it won't try to swap
fast symbolic links or deleted files.

Fixed e2fsck core dumping when fixing a filesystem which has no
directories (not even a root directory).

Added a check to e2fsck to make sure that the length of every
directory entry is a multiple of 4 (since the kernel complains if it
isn't).

Added a check to e2fsck to make sure that a directory entry isn't a
link to the root directory, since that isn't allowed.

Added a check to e2fsk to now make sure the '.' and '..' directory
entries are null terminated, since the 2.0 kernel requires it.

Added check to write_bitmaps() to make sure the superblock doesn't get
trashed if the inode or block bitmap is marked as being block zero.

Added checking of the new feature set fields in the superblock, to
avoid dealing with new filesystem features that this package wasn't
set up to handle.

Fixed a fencepost error in ext2fs_new_block() which would occasionally
try to allocate a block beyond the end of a filesystem.

When the UUID library picks a random IEEE 802 address (because it
can't find one from a network card), it sets the multicast bit, to
avoid conflicting with a legitimate IEEE 802 address.

Mke2fs now sets the root directory's owner to be the real uid of the
user running mke2fs.  If the real uid is non-zero, it also sets
the group ownership of the root directory to be the real group-id of
the user running mke2fs.

Mke2fs now has more intelligent error checking when it is given a
non-existent device.

When badblocks is given the -vv option, it now updates the block that
it is currently testing on every block.

Fixed a bug in fsck where it wouldn't modify the PATH envirnoment
currently correctly if PATH wasn't already set.

Shared libraries now built with dependencies.  This allows the shared
library files to be used with dlopen(); it also makes the transition
to libc 6 easier, since ld.so can tell which libc a particular shared
library expects to use.

Programmer's notes:
-------------------

Added new abstraction (defined in dblist.c) for maintaining a list of
blocks which belongs to directories.  This is used in e2fsck and other
programs which need to iterate over all directories.

Added new functions which test to see if a contiguous range of blocks
(or inodes) are available.  (ext2fs_*_bitmap_range).

Added new function (ext2_inode_has_valid_blocks) which returns true if
an inode has valid blocks.  (moved from e2fsck code).

Added new function (ext2fs_allocate_tables) which allocates the
meta-data blocks as part of initializing a filesystem.  (moved from
mke2fs code).

Added a new I/O manager for testing purposes.  It will either allow a
program to intercept I/O requests, or print debugging messages to
trace the activity of a program using the I/O manager.

The badblocks_list functions now store the bad blocks in a sorted
order, and use a binary search to speed up badblocks_list_test.

The inode scan function ext2fs_get_next_inode() may now return a soft
error returns: MISSING_INODE_TABLE and BAD_BLOCK_IN_INODE_TABLE in
those cases where part of an inode table is missing or there is a bad
block in the inode table.  

Added a new function (ext2fs_block_iterate2) which adds new arguments to
the callback function to return a pointer (block and offset) to the
reference of the block.

Added new function (ext2fs_inode_scan_goto_blockgroup) which allows an
application to jump to a particular block group while doing an inode
scan.

The badblocks list functions were renamed from badblocks_* to
ext2fs_badblocks_*.  Backwards compatibility functions are available
for now, but programs should be modified to use the new interface.

Some of the library functions were reorganized into separate files to
reduce the size of some programs which statically link against the
ext2 library.

Put in some miscellaneous fixes for the Alpha platform.


E2fsprogs 1.06 (October 7, 1996)
================================

Fixed serious bug in e2fsck: if the block descriptors are bad, don't
smash the backup copies in ext2fs_close().  (The problem was that when
e2fsck -p discovered the problem, while it was closing the filesystem
and exiting, it was also blowing away the backup superblocks on the
disk, which was less than friendly.)  We now make it the case that we
only write out the backup superblock and the back block descriptors if
the filesystem is completely free from problems.

Fixed a bug in block_interate in the lib/ext2fs library which caused
e2fsck to fail on GNU Hurd-created filesystems.

Add support for Linux/FT's bootloader, which actually uses
EXT2_BOOT_LOADER, and sets its mode bits which caused e2fsck to want
to clear the inode.

Add support for the "A" (no atime update) attribute.  (Note: this
attribute is not yet in production kernels.)

The test suite is not automatically run when doing a "make all" from
the top level directory.  Users should manually run "make check" if
they wish to run the test suite.

Upon a preenhalt(), make the printed message more explicit that
running e2fsck "MANAULLY" means without the -p or -a options.

In e2fsck, if a disconnected inode is zero-length, offer to clear it
instead of offering to connect it to lost+found.

In e2fsck, if a filesystem was just unmounted uncleanly, and needs
e2fsck to be run over it, change e2fsck to explicitly display this
fact.

For dumpe2fs and e2fsck, cause the -V option to print out which
version of the ext2fs library is actually getting used.  (This will
help detect mismatches of using a 1.06 utility with a 1.05 library,
etc.)

Programmers' notes:
-------------------

EXT2_SWAP_BYTES was changed to EXT2_FLAG_SWAP_BYTES, which better fits
the naming convention.

In ext2fs_initialize(), make sure the description for the inode bitmap
is correctly initialize.

Fixed minor type typo in ext2fs_allocate_generic_bitmap();

E2fsprogs 1.05 (September 7, 1996)
==================================

Add support for new fields in the ext2 superblock --- volume name,
volume UUID, and last mounted field.  Dumpe2fs displays these fields,
tune2fs and mke2fs allows you to set them.  E2fsck will automatically
generate a UUID for those volumes that don't have them.  

Put in support for e2fsck to recognize HURD specific ext2 features ---
most notably, the translator block.  The e2fsprogs tools will now use
the creator_os field in the superblock to correctly handle different
OS-specific variants of the ext2 filesystem.

E2fsck now fixes inodes which have a the deletion time set, but which
have a non-zero i_link_count field by offering to clear the deletion
time.  Previously e2fsck assumed that the inode was deleted (per 0.3c
ext2 kernel behavior) and offered to unlink the file.

If e2fsck sets the clean bit, but nothing else, set the exit code
FSCK_NONDESTRUCT.  After all, e2fsck did fix a filesystem error --- it
set the filesystem valid bit when it was previously cleared.  :-) This
was needed to make the HURD fsck driver happy.

If the  user  refuses to attach an  unattached  inode, e2fsck  will no
longer set the inode's link count.  Otherwise, the  inode would end up
getting marked as unused, which might cause loss of data later.

Make the message issued by e2fsck when the superblock is corrupt less
confusing for users.  It now mentions that another reason for the
"corrupt superblock" message might be that the partition might not be
an ext2 filesystem at all (it might swap, msdos filesystem, ufs, etc.)

Make the libext2 library more robuest so that e2fsck won't coredump on
an illegal superblock where the blocksize is zero.  (f_crashdisk is
the test case).

By default, create filesystems where the default checkinterval is 6
months (180 days).  Linux servers can be robust enough that 20 reboots
can be a long, long time.

Added configure flag --enable-old-bitops, which forces the bitops to
use the old (native) bitmask operations.  By default on the sparc
platform, the standard ext2 bit ordering is now used.

Added a new feature to e2fsck to byte-swap filesystems; this can be
used to convert old m68k filesystems to use the standard byte-order
storage for the superblock, inodes, and directory blocks.  This
function is invoked by using the '-s' option to e2fsck.

Debugfs's "dump" command has been enhanced so that it writes out the
exact size of the file so that the nulls at the end of the file are
eliminated.  The command also accept a new "-p" option which will
attempt preserve to preserve the ownernship, permissions, and
file modification/access times.

Debugfs has two new options, -f and -R.  The -R option allows the user
to execute a single debugfs command from the command line.  The -f
option allows the user to specify a "command file" containing debugfs
commands which will get executed.

Dumpe2fs now pretty prints the check interval, instead of just
printing the check interval as a number of seconds.

Fix bugs in debugfs: the params command when no filesystem is opened
no longer causes a core dump.  It is now possible to unlink a file
when a pathame containing a '/' is specified.

Tune2fs has a new -C option which sets the number of times the
filesystem has been mounted.

Fix the chattr '-v' option so that it actually works.  Chattr was
being buggy about the -v option parsing.

Programmers' notes:
-------------------

The directory lib/uuid contains a set of library routines to generate
DCE compatible UUIDs.  

Extended ext2fs_namei() to handle symbolic links.  Added new function
ext2fs_nami_follow() which will follow last symbolic link in the case
where the pathname points to a sym link.

The ext2fs_block_iterate function will now return the HURD translator
block, if present.  The new flag BLOCK_FLAG_DATA_ONLY will cause the
iterator to return data blocks only.  The ext2fs.h file now defines
constants BLOCK_COUNT_IND, BLOCK_COUNT_DIND, BLOCK_COUNT_TIND, and
BLOCK_COUNT_TRANSLATOR, which are the magic values passed in the block
count field of the iterator callback function.

The test script driver now takes an optional second argument, which is
the test case to be run.  This allows you to run a test case without
needing to run the entire test suite.

On Linux ELF systems, install the .so files in the correct places
(/usr/lib).  The .so files must be stored in the same directory as the
.a files.

Fixed miscellaneous HURD compilation issues with header file being
included in the right order.

Fixed debugfs so that it resets optind to zero, not one, since setting
optind to zero is more correct.


E2fsprogs 1.04 (May 16, 1996)
=============================

First "official" (1.03 was a limited release only) to support building
e2fsprogs under Linux 2.0 kernels (as well as late model 1.3 and 1.99
kernels).

This package includes a RPM specs file, that it can be built using the
RedHat Package Manager.

E2fsck now prints a hint that if there are lots of incorrectly located
inode bitmaps, block bitmaps, and inode table blocks, the user might
want to try using e2fsck -b 8193 first, to see if that fares any
better.

For ext2 filesystem written with the hurd, debugfs will now print out
the translator field when printing an inode structure.

Lots of miscellaneous linking/installation cleanups:

  Libraries are now linked using a relative pathname, instead of
  relying on -L working correct.  It doesn't, in many cases, including
  current versions of GNU ld.  This guarantees that the build tree is
  linking with the right libraries, instead of the ones installed in
  /usr/lib.

  Header files, man pages, and the et/ss shell scripts are now
  generated using a custom substitution script, instead of relying on
  the configure script.  This prevents needless recompilation of
  files; in addition, the custom substitution script is much faster.

  e2fsck may now be linked dynamically, by using the
  --enable-dynamic-e2fsck flag to configure.  This is not recommended,
  since it increases e2fsck's dependence on other files, but some
  people need to save disk space, and other critical programs on their
  systems were being linked dynamically anyway.

  Programs such as fsck which didn't need to be linked against
  libext2fs (or mke2fs which didn't need to be linked against libe2p)
  only link against libraries they actually need.  Otherwise, those
  programs would require the presense of libraries that otherwise
  could be removed from a rescuse diskette.

  The ss include files are now installed correctly so they can
  actually be used by another package.

  If the profiling libraries are built, they are now installed on a
  "make install-libs".


E2fsprogs 1.03 (March 27, 1996)
===============================

Change the m68k bit numbering for bitmasks to match the bit numbering
used by all other ext2 implementations.  (This change was requested by
the m68k kernel development team.)

Support (in-development) filesystem format revision which supports
(among other things) dynamically sized inodes.

Fixed a bug in the ext2 library so that an intelligent error is
returned if mke2fs is run with a ridiculously small number of blocks
for a partition.

Fixed a bug in the ext2 library which required that the device be
openable in read/write mode in order to determine its size.  This
caused e2fsck -n to require read/write access when it was not
previously necessary.

Fixed a bug in e2fsck which casued it to occasionally fail the test
suite depending on which version of the floating point library it was
using.

Fixed a bug in e2fsck so that it now halts with a fatal error when
certain superblock consistency checks fail.  Previously it continued
running e2fsck, with some potential confusing/damaging consequences.

Added new flag to fsck which allows the root to be checked in parallel
with other filesytems.  This is not the safest thing in the world to
do, but some system administrators really wanted it.

Fixed -Wall flames in lib/ss.


E2fsprogs 1.02 (January 16, 1996)
=================================

Fix to allow e2fsprogs to be compiled on recent 1.3 (pl45+) kernels.

Change e2fsck to print statistics of how many non-contiguous files are
on the system.  Note that a file which is larger than 8k blocks, it is
guaranteed to be non-contiguous.

In mke2fs, print a warning message if a user tries to format a whole
disk (/dev/hda versus /dev/hda1).  If a user really wants to format a
whole disk, the -F (force) option forces mke2fs to format a whole disk
as a filesytem.

Fix a bug in fsck where in some cases it might start checking
partitions in the next pass before it finishes checking partitions in
the current pass.  This still won't cause two partitions on the same
disk will be checked, so it's rarely a problem in real life.

Patch lsattr so that it won't hang when checking a named pipe.

Minor compilation fixes:
	* Fix the order of libraries that were linked in debugfs.
	* Allow the sources to be compiled with -ansi turned on.
