E2fsprogs 1.12 (February 20, 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.)

Added support for the EXT2_FEATURE_INCOMPAT_DIRNAME_SIZE 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.

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.
