E2fsprogs 1.41.14 (December 22, 2010)
=====================================

Fix spurious complaint in mke2fs where it would complain if the file
system type "default" is not defined in mke2fs.conf.

The resize2fs program will no longer clear the resize_inode feature
when the number reserved group descriptor blocks reaches zero.  This
allows for subsequent shrinks of the file system to work cleanly for
flex_bg file systems.

The resize2fs program now handles devices which are exactly 16T;
previously it would give an error saying that the file system was too
big.

E2fsck (and the libext2fs library) will not use the extended rec_len
encoding for file systems whose block size is less than 64k, for
consistency with the kernel.

Programming notes
-----------------

E2fsprogs 1.41.13 would not compile on big-endian systems.  This has
been fixed.  (Addresses Sourceforge Bug: #3138115)

The ext2fs_block_iterator2() function passed an incorrect ref_offset
to its callback function in the case of sparse files.  (Addresses
Sourceforge Bug: #3081087)
    
Fix some type-punning warnings generated by newer versions of gcc.


E2fsprogs 1.41.13 (December 13, 2010)
=====================================

E2fsck now supports the extended option "-E journal_only", which
causes it to only do a journal replay.  This is useful for scripts
that want to first replay the journal and then check to see if it
contains errors.

E2fsck will now support UUID= and LABEL= specifiers for the -j option
(which specifies where to find the external journal).  (Addresses
Debian Bug #559315)

E2fsck now has support for the problems/<problem code>/force_no
configuration option in e2fsck.conf, which forces a problem to not be
fixed.

Dumpe2fs will now avoid printing large negative offsets for the bitmap
blocks and instead print a message which is a bit more helpful for
flex_bg file systems.

Mke2fs will now check the file system type (specified with the -t
option) to make sure it is defined in the mke2fs.conf file; if it is
not, it will print an error and abort.  If the usage type (specified
with the -T option) is not defined in mke2fs.conf, mke2fs will print a
warning but will continue.  (Addresses Debian Bug #594609)

Clarified error message from resize2fs clarifying that on-line
shrinking is not supported at all.  (Addresses Debian Bug #599786)
    
Fix an e2fsck bug that could cause a PROGRAMMING BUG error to be
displayed.  (Addresses Debian Bug #555456)

E2fsck will open the external journal in exclusive mode, to prevent
the journal from getting truncated while it is in use due to a user
accidentally trying to run e2fsck on a snapshotted file system volume.
(Addresses Debian Bug #587531)

Fix a bug in e2fsck so it has the correct test for the EOFBLOCKS_FL
flag.

The tune2fs program can now set the uninit_bg feature without
requiring an fsck.

The tune2fs, dumpe2fs, and debugfs programs now support the new ext4
default mount options settings which were added in 2.6.35.

The e2fsck and dumpe2fs programs now support the new ext4 superblock
fields which track where and when the first and most recent file
system errors occurred.  These fields are displayed by dumpe2fs and
cleared by e2fsck.  These new superblock fields were added in 2.6.36.

Debugfs now uses a more concicse format for listing extents in its
stat command.  This format also includes the interior extent tree
blocks, which previously was missing from stat's output for
extent-based files.

Debugfs has a new option, -D, which will request Direct I/O access of
the file system.

Mke2fs will skip initializing the inode table if a device supports
discard and the discard operation will result in zero'ed blocks.

Badblocks will now correctly backspace over UTF-8 characters when
displaying its progress bar.  (Addresses Gentoo Bug #309909; Addresses
Debian Bugs #583782 and #587834)

E2freefrag will now display the total number of free extents.

Resize2fs -P no longer requires a freshly checked filesystem before
printing the minimum resize size.

Fixed a floating point precision error in a binary tree search routine
that can lead to seg fault in e2fsck and resize2fs.

Fixed a bug in e2fsck where if both the original and backup superblock
are invalid in some way, e2fsck will fail going back to the original
superblock because it didn't close the backup superblock first, and
the exclusive open prevented the file system from being reopened.

Fixed a big in e2freefrag which caused getopt parsing to fail on
architectures with unsigned chars.  (Addresses Gentoo Bug: #299386)

Clarified an mke2fs error message so a missed common in an -E option
(i.e., mke2fs -t ext4 -E stride=128 stripe-width=512 /dev/sda1")
results in a more understandable explanation to the user.

Mke2fs now displays the correct valid inode ratio range when
complaining about an invalid inode ratio specified by the user.

Mke2fs now understands the extended option "discard" and "nodiscard",
and the older option -K is deprecated.  The default of whether
discards are enabled by default can be controled by the mke2fs.conf
file.

Mke2fs's handling of logical and physical sector sizes has been
improved to reflect the fact that there will be some SSD's with 8k and
16k physical sectors arriving soon.  Mke2fs will no longer force block
size to be the physical sector size, since there will be devices where
the physical sector size is larger than the system's page size, and
hence larger than the maximal supported block size.  In addition, if
the minimal and optimal io size are not exported by the device, and
the physical sector size is larger than the block size, the physical
sector size will be used to set the Raid I/O optimization hints in the
superblock.

E2fsck will now display a better, more specific error message when the
user enters a typo'ed device name, instead of blathering on about
alternate superblocks.

Fixed various Debian Packaging Issues

Updated/clarified man pages (Addresses Debian Bugs: #580236, #594004,
#589345, #591083; Addresses Launchpad Bug: #505719)

Update the Chinese, Chzech, Dutch, French, Germany, Indonesian,
Polish, Swedish, and Vietnamese translations.


Programmer's Notes
------------------

Fix a dependency definition for the static and profiled blkid
libraries which could cause compile failures in some configurations.
(Addresses Debian Bug: #604629)
    
Add support for Direct I/O in the Unix I/O access layer.

Fixed a memory leak in the Unix I/O layer when changing block sizes.

Fixed minor memory leaks in mke2fs.

Added a new function to the ext2fs library, ext2fs_get_memalign().

The tst_super_size test program will check to make sure the superblock
fields are correctly aligned and will print them out so they can be
manually checked for correctness.

Fixed some makefile dependencies for test programs in lib/ext2fs.

Reserved the feature flags and superblock fields needed for the Next3
snapshot feature.

Reserved the feature flags for EXT4_FEATURE_INCOMPAT_DIRDATA and
EXT4_INCOMPAT_EA_INODE.


E2fsprogs 1.41.12 (May 17, 2010)
================================

Mke2fs now gives a correct error message if the external journal
device is not found.  (Addresses Red Hat Bug #572935)

Resize2fs -P will now refuse to print a minimum size if the file
system is not clean.  Previously it would go ahead and print a minimum
size anyway, which might not be correct, leading to user confusion.

E2fsck now tests for extents that begin at physical block 0 and
rejects them as invalid.  (Addresses Google Bug: #2573806)
    
Fixed a bug in e2fsck which could cause it to crash when trying to
remove an invalid extent and the block bitmaps hadn't yet been loaded.
(Addresses SourceForge Bug: #2971800)
    
E2fsck now will completely skip time-based checks if the system clock
looks insane or the option broken_system_clock is set in
/etc/e2fsck.conf.

E2fsck would previously report an i_blocks corruption for a 4T file
created using posix_fallocate; this bug has been fixed.

E2fsck will now correctly mark a sparse journal as invalid and will
delete and recreate the journal to address the problem.

E2fsck would previously incorrectly ask the user whether she would
like to abort the file system check after finding a problem --- and
then abort regardless of the user's answer.  This is annoying, and
has been fixed.

E2fsck can now continue even if it fails to recreate the resize
inode; previously it would just abort the file system check
altogether.

E2fsck could potentially remove directory entries for inodes found in
the unused region of the inode table; this would generally happen on
ext4 file systems that do not use journaling.  This bug has been fixed
by not clearing these directory entries once it has been established
that bg_unused_inodes may not be trustworthy; once pass #2 has been
completed, e2fsck will restart the file system check from the
beginning, and then it will be safe to delete any directory entries
pointing to inodes that appear to be deleted.  (Addresses Google Bug:
#2642165)
    
E2fsck will not try to set the block group checksums if the user
cancels the fsck with a control-C.  It's a bad idea to set the
checksums if e2fsck hasn't been completed, and it often results an the
error message, "Inode bitmap not loaded while setting block group
checksum info".  (Addresses Launchpad Bug: #582035)

The mke2fs program now queries the kernel for the physical as well as
the logical sector size, and will not allow a blocksize below the
logical, and will strongly encourage a blocksize at least as big as
the physical blocksize.  This is needed for 4k sector drives that
emulate 512 byte sector sizes.

Mke2fs will now allow a flex_bg size of 1.  This is unusual, and
rarely needed, but it is a legal value.

E2fsck will check for cases where the EOFBLOCKS_FL is set when it is
not needed, and offer to clear it; this is a sign of a kernel bug, but
more importantly, some released kernels may crash when this situation
is encountered on ext4 file systems.  (Addresses Google Bug: #2604224)
    
E2fsck will use the EOFBLOCKS_FL flag exclusively to check whether
i_size is correct.  (Kernels starting with 2.6.34 will set
EOFBLOCKS_FL.)

The com_err library will now only output ^M (a CR character) when the
tty is in raw mode.

Update the Czech, Chinese, Dutch, French, Germany, Indonesian, Polish,
and Vietnamese translations.

Fixed various Debian packaging issues --- see debian/changelog for
details.  (Addresses Debian Bugs: #571247, #563487)


Programmer's Notes
------------------

The regression test suite now uses its own mke2fs.conf file, so that
downstream distributions want change the mke2fs.conf file which is
distributed in the RPM or dpkg file, without worrying about screwing
up the regression test results.

Always build namei.o so that building with configure --disable-debugfs
works correctly.  Long-term, if we care about reduced e2fsprogs
builds, we need a more general solution for deciding what .o files are
needed for a particular build.  Given that install floppies are going
(gone?) the way the dodo bird, we probably don't care, though.
(Addresses Sourceforge Bug: #2911433)

Add configure options --enable-symlink-build and
--enable-symlink-install, which allow e2fsprogs be built using
symlinks instad of hard links, and to be installed using symlinks
instead of hard links, respectively.  It is useful when the file
system where the build is taking place, or the file system where
e2fsprogs is installed, can't handle hard links for some reason.
(Addresses Sourceforge Bug: #1436294)

Fixed compile warning in mke2fs.c.

    
E2fsprogs 1.41.11 (March 14, 2010)
==================================

E2fsck will no longer give a fatal error and abort if the physical
device has been resized beyond 2**32 blocks.  (Addresses Launchpad
Bug: #521648)

Debugfs has a bug fixed so that "logdump -b <blk>" now properly shows
the allocation status of the block <blk>.  (Addresses Debian Bug:
#564084)
    
E2fsck now prints a much more emphatic and hopefully scary message
when a file system is detected as mounted while doing a read/write
check of the filesystem.  Hopefully this will dissuade users from
thinking, "surely that message doesn't apply to *me*" :-(

E2fsck -n will now always open the file system read-only.  We now
disallow certain combination of options which previously were manual
exceptions; this is bad because it causes users to think they are
smarter than they really are.  So "-n -c", "-n -l", "-n -L", and "-n
-D" are no longer supported.  (Addresses Launchpad Bug: #537483)
    
In e2fsprogs 1.41.10, mke2fs would ask for confirmation to proceed if
it detected a badly aligned partition.  Unfortunately, this broke some
distribution installation scripts, so it now just prints the warning
message and proceeds.  (Addresses Red Hat Bug: #569021. Addresses
Launchpad Bug: #530071)
    
Mke2fs would take a long time to create very large journal files for
ext4.  This was caused by a bug in ext2fs_block_iterate2(), which is
now fixed.

E2fsck now understands the EOFBLOCKS_FL flag which will be used in
2.6.34 kernels to make e2fsck not complain about blocks deliberately
fallocated() beyond an inode's i_size.

E2fsprogs 1.41.10 introduced a regression (in commit b71e018) where
e2fsck -fD can corrupt non-indexed directories when are exists one or
more file names which alphabetically sort before ".".  This can happen
with ext2 filesystems or for small directories (take less than a lock)
which contain filenames that begin with a space or some other
punctuation mark.  (Addresses Debian Bug: #573923, Addresses Launchpad
Bug: #525114)


Programmer's Notes
------------------

Add new test, f_rehash_dir, which checks to make sure e2fsck -D works
correctly.

The libcom_err function now has support for Heimdal's com_right_r
function().  (Addresses Sourceforge Bug: #2963865, Addresses Debian
Bug: #558910)


E2fsprogs 1.41.10 (February 7, 2010)
====================================

Fix resize2fs bug which causes it to access invalid memory.

Add libss support for libreadline.so.6.
    
Fix e2fsck's check for extent-mapped directory with an incorrect file
type.

Add new e2fsck.conf configuration option, default/broken_system_clock
to support systems with broken CMOS hardware clocks.  Also, since too
many distributions seem to have broken virtualization scripts now,
e2fsck will by default accept dates which are off by up to 24 hours by
default.  (Addresses Debian Bugs: #559776, #557636)

Fix a bug where mke2fs may not use the best placement of the inode
table when there is only room for a single block group in the last
flex_bg.

E2fsck is now smarter when it needs to allocate blocks in the course
of fixing file system problems.  This reduces the number of spurious
differences found in pass #5.

E2fsck will no longer rehash directories which fit in a single
directory block.

E2fsck now correctly handles holes in extent-mapped directories (i.e.,
sparse directories which use extents).

Fix big-endian problems with ext2fs_bmap() and ext2fs_bmap2().

Fix a bug in filefrag where on platforms which can allow file systems
with 8k blocks, that it doesn't core dump when it sees a file system
with 8k block sizes.  (Thanks to Mikulas Patocka for pointing this
out.)

E2fsck will correctly fix directories that are have an inaccurate
i_size as well as other problems in a single pass, instead of
requiring two e2fsck runs before the file system is fully fixed.

Fix e2fsck so it will correctly find and detect duplicate directory
entries for non-indexed directories.  ( Addresses Sourceforge Bug:
#2862551)
    
Mke2fs will use BLKDISCARD to pre-discard all blocks on an SSD or
thinly-provisioned storage device.  This can be disabled using the -K
option.

Enhance libext2fs so it works around bug in Linux version 2.6.19
and earlier where the /proc/swaps file was missing the header on
the first line.

Fix bug in Linux version 2.6.19 and earlier where the /proc/swaps file
was missing the header on the first line.

Fix some big-endian bugs in e2fsck and libext2fs.

Fix resize2fs so it works correctly on file systems with external
journals instead of failing early with the error "Illegal inode
number".

Fix libss so that it does not seg fault when using a readline library
which does not supply a readline_shutdown() function.

Updated dumpe2fs's usage message so it correctly gives the right
arguments summary for "-o superblock=<num>" and "-o blocksize=<num>".
(Addresses Launchpad Bug: #448099)
   
Teach libext2fs to ignore the high 32 bits of the i_blocks field
when huge_file file system feature is set, but the inode does not
have the HUGE_FILE_FL flag set.

Fix e2fsck's handling of 64-bit i_blocks fields.

E2fsck will now print "Illegal indirect block", "Illegal
double-indirect block", etc., instead of "Illegal block #-1" or
"Illegal block #-2", etc.  This makes it easier for users to
understand what has gone wrong.  (Addresses SourceForge Bug: #2871782)

Mke2fs now will obtain get device topology information from blkid and
use it to populate the superblock stride and stripe sizes.  It will
also warn if the block device is misaligned

Fix file descriptor leaks in fsck and debugfs.  (Addresses Novell Bug:
##524526)

Fix the libext2fs library code to round up the bitmap size to a 4-byte
boundary, to prevent spurious seg faults caused by the x86
architecture.  This doesn't affect Linux systems, but was a major
problem on a number of *BSD systems.  (Addresses Sourceforge Bug:
#2328708)

Fix resize2fs's minimum size required for a file system so it doesn't
fail when "resize2fs -M" is run.  (Addresses RedHat Bugzilla: #519131)
    
Dumpe2fs now prints summary information about the contents of the
journal.
    
Avoid printing scary error messages when e2fsck starts running
problems on low-memory systems, as it tends to panic and mislead the
user.  (Addresses Debian Bug: #509529)

Fix blkid's modules.dep parser so it handles compressed (.ko.gz)
modules files.  (Address Red Hat Bug: #518572)
    
Fix tune2fs so it can add a journal when an extent-enabled file system
is mounted.  (Addresses Launchpad bug: #416648)

Update Czech, Indonesian, Polish and Vietnamese translations (from the
Translation Project).
    
Update/clarify man pages.  (Addresses Sourceforge Bug: #2822186)

Fixed various Debian packaging issues --- see debian/changelog for
details.  (Addresses Debian Bugs: #540111)

Programmer's Notes
------------------

The configure script supports the --with-cc, --with-ccopts, and
--with-ldopts options.  Instead, the more standard use of CC=,
CCFLAGS=, and LDFLAGS= in the configure command line is used instead.
Also, --with-ld, which never worked, was also removed.
(Addresses Sourceforge Bug: #2843248)

The in-tree header files are only used if the in-tree uuid or blkid
libraries are used.  Otherwise, use the system-provided uuid or blkid
header files if using the system-provided libraries.

Fix some build failures caused by --disable-* configure options.

Work around a bug in autoconf 2.64.


E2fsprogs 1.41.9 (August 22, 2009)
==================================

Fix a bug in e2fsck routines for reallocating an inode table which
could cause it to loop forever on an ext4 filesystem with the FLEX_BG
filesystem feature with a relatively rare (and specific) filesystem
corruption.  This fix causes e2fsck to try to find space for a new
portion of the inode table in the containing flex_bg, and if that
fails, the new portion of the inode table will be allocated in any
free space available in the filesystem.

Make e2fsck less annoying by only asking for permission to relocate a
block group's inode table once, instead of for every overlapping
block.  Similarly, only ask once to recompute the block group
checksums, instead of once for each corrupted block group's checksum.

Fix filefrag to avoid print the extent header if the FIEMAP ioctl is
not present, and it needs to fall back to using the FIBMAP ioctl.

Fix filefrag to correctly print the number of extents for zero-length
files.  (Addresses Debian Bug: #540376)

Filefrag now has a -B option which forces the use of the FIBMAP ioctl
to more easily debug the FIBMAP code.

Fixed filefrag for non-extent based files.

Add a new program, e2freefrag, which displays information about the
free space fragmentation in an ext2/3/4 filesystem.

Fix inode resizing via tune2fs -I so that it works correctly in the
face of non-empty bad blocks inodes, and if the filesystem was
formatted using the "mke2fs -E stride=N" option for RAID arrays.

Fix regression in ext2fs_extent_set_bmap() caused e2fsck -fD to fail
and corrupt large directories if the directory needs to shrink by more
than one block.  (Addresses Debian Bug: #537510)
    
Fix e2fsck's buggy_init_scritps=1 so that the if the last write and/or
last mount times are in the future, they are corrected even if
buggy_init_scripts is set.  This is needed because otherwise resize2fs
will refuse to resize the filesystem, even after running "e2fsck -f".
(Addresses Launchpad bug: #373409)

E2fsck will now print much fuller information when the last mount time
or last written time is in the future, since most people can't seem to
believe their distribution has buggy init scripts, or they have a
failed CMOS/RTS clock battery.

Enhance dumpe2fs to dump the extent information via the 'stat'
command, and more detailed extent information via the new command
'dump_extents'.
    
Update French, Polish, Czech, and Sweedish translation from the
Translation Project.

Fixed various Debian packaging issues --- see debian/changelog for
details.

Programmer's Notes
------------------

Fixed miscellaneous gcc -Wall warnings.

Fixed memory leak in error path in ext2fs_block_iterate2()

Fixed non-Linux build of the intl directory by adding support for the
E/Q/V macros.

The bitmap read/write functions now treat uninitialized bitmaps as
unallocated; this fixes a number of problems in all e2fsprogs for ext4
filesystems when there is a need to allocate new blocks or inodes, and
there aren't any free blocks or inodes in the already-used block
groups.

Improve ext2fs_extent_set_bmap() to avoid creating new extents which
get inserted into the extent tree when they are not needed.
    

E2fsprogs 1.41.8 (July 11, 2009)
================================

Fix resize2fs's online resizing, fixing a regression which in
e2fpsrogs 1.41.7.   (Addresses Debian Bug: #535452)

Fix potential filesystem corruptions caused by using resize2fs to
shrinking ext4 filesystems with extents enabled.  (Addresses Red Hat
Bug: #510379)

Optimize uuid_generate() to avoid running uuidd if it is not setuid or
setgid and the currently running program doesn't have write access to
the uuidd work directory.

Add safety checks (for non-Linux systems) so that uuidd isn't run with
file descriptors 0, 1, and 2 closed; and if they are closed, uuidd
will be careful not to close the file descriptor for its unix domain
socket when it detaches itself from the controlling tty.  Also add
safety checks so that if the unix domain socket between the uuid
library and uuidd program is closed for any reason, both the library
and the uuidd will return an appropriate error code instead of looping
in an infinite loop.

The e2croncheck script, which creates an LVM snapshot and then checks
the ext3/4 filesystem via the LVM snapshot, has been added to the
contrib directory.

Fix filefrag program for files that have more than 144 extents.

Update French, Polish, Czech, Indonsian, and Sweedish translation from
the Translation Project.

Fixed various Debian packaging issues --- see debian/changelog for
details.  (Addresses Debian Bug #535530)

Update/clarify man pages.

Programmer's Notes
------------------

Fix compilation problem when configured with --disable-uuid.

Don't build uuidgen if configured with --disable-uuid.

Add the new library function ext2fs_test_inode_bitmap_range(), and
optimized ext2fs_test_block_bitmap_range(), which will be needed for
future optimizations for e2fsck.

Fix makefile dependencies for libcom_err so that the Makefiles work
well on non-GNU make program.  (Addresses Sourceforge Patches: #2813809)

Enhance the build system so that the full set of commands executed by
the Makefiles are displayed, instead of the Linux kernel summary
output, if the build was configured with --enable-verbose-makecmds, or
if GNU make is in use and the V variable is non-null, i.e., via "make
V=1".


E2fsprogs 1.41.7 (June 29, 2009)
================================

Fix a bug in libext2fs which can cause e2fsck and resize2fs to write
uninitalized data into the portion of the inode beyond the first 128
bytes when operating on inodes mapped via extents; potentially
corrupting filesystems.

Fix memory leaks in e2fsprogs, including a very large memory leak
which can cause e2fsck to run out of memory when checking very large
filesystems using extents.

The logsave program will now filter out the ^A and ^B characters when
writing to the console.

Harden ext2fs_validate_entry() so that lsdel will not read beyond the
end of the block even if the directory block is corrupted.

Fix debugfs from core dumping if the logdump command fails to open the
output file.

Enhance badblocks to print the currently tested block number when
interrupted with ^C.

Fix lsattr to exit with a non-zero status when it encounters errors.
(Addresses RedHat Bugzilla #489841)

Fix e2fsprogs to use the same encoding for rec_len in 64k (and larger)
filesystems as the kernel when encoding rec_len >= 64k.  For 64k
filesystems (currently all that is supported by e2fsprogs, this is
only a minor corner case).

Resize2fs will now update the journal backup fileds in the sup0erblock
if the journal is moved; this avoids an unnecessary full fsck after
resizing the filesystem.  (Addresses RedHat Bugzilla: #505339)
    
Fix libext2fs to properly initialize i_extra_size when creating the
journal and resize inodes.

Change badblocks to allow block sizes larger than 4k.

Fix filefrag progam so it correctly checks for errors from the fiemap ioctl.

Update Chinese and Czech translation from the Translation Project.

Clean up various man pages.  (Addresses Debian Bug #531385 and #523063)


Programmer's Notes
------------------

Add --disable-libuuid option to configure which uses an in-system
installed version of libuuid; the private version is enabled by
default.

Add --valgrind-leakcheck option to the test_script program which runs
valgrind with the appropriate options to find memory leaks.


E2fsprogs 1.41.6 (May 30, 2009)
===============================

Fix a critical regression in e2fsck introduced version 1.41.5 which
can undo updates to the block group descriptors after a journal replay.

If e2fsck receives an I/O error while replaying the journal, prompt
the user whether they want to ignore the error or not; if e2fsck is
run in preen mode, force fsck to abort the preen pass.

Fix a bug which would cause e2fsck to core dump if the filesystem
contains a corrupt extent header, and the user declines to clear the
inode.  (Addresses Sourceforge Bug: #2791794)
    
Fix e2fsck to restart only once in the case of multiple block groups
which inodes in use that are in the uninitialized part of the block
group's inode table.

To reduce user confusion, if the /etc/mtab file is missing
ext2fs_check_mount_point and ext2fs_check_if_mounted will return a
new, explicit error code to indicate this case.  This will cause
e2fsck to give a clearer error message when the user is using buggy
rescue CD's that don't properly set up /etc/mtab.  (Addresses Debian
Bug: #527859)
    
Fix e2fsck so that if the primary group descriptors are corrupted, but
the backup superblock is entirely invalid, to go back to using (and
fixing) the priary group descriptors instead of completely giving up
on the filesystem.  (Addresses Debian Bug: #516820)
    
Change e2fsck to not abort a preen pass if an inode is found to have
i_file_acl_hi non-zero.  Ext3 filesystems don't care, and newer
kernels (post 2.6.29) will ignore this field.  So let's fix it
automatically during the preen pass instead of forcing the user to fix
this up manually.  (Addresses Debian Bug: #526524)
    
Add resource tracking for e2fsck passes 1b through 1d.

Speed up e2fsck by eliminating unnecessary journal checks if the
filesystem is already mounted and doesn't need recovery (since the
kernel would have run the journal when the filesystem was mounted.)
Also speed up e2fsck by avoiding unnecessary block group descriptor
updates in ext2fs_close().

Add support to chattr to migrate inodes from using direct/indirect
blocks to extents.

Avoid corrupting the filesystem if there is an attempt to shrink a
filesystem using resize2fs smaller than posible by making
ext2fs_set_bmap() more careful not to delete the old block until the
new block can be inserted.  In addition, fix a bug in how the minimum
size of the filesystem (plus a safety margin) is calculated, and
modify resize2fs to refuse to shrink the filesystem below that minimum
size without the force flag.

Teach blkid to try to figure out DM device names using take advantage
of information in sysfs when running on kernels (2.6.29 and later)
which provide this information in /sys/block/dm-<N>/dm/name; this is
much faster than scanning for the devncie number in /dev/mapper.

Fix blkid to prefer /dev/mapper/<name> device names instad of the
private /dev/dm-X names.

Add an -a option to debugfs's close_filesys command which writes any
changes to the superblock or block group descriptors to all of the
backup superblock locations.
    
Add support to the filefrag program to use the FIEMAP ioctl.

Update Chinese translation from the Translation Project.

Clean up various man pages.  (Addresses Red Hat Bugzilla: #502971 and
Launchpad Bug: #381854)

Fixed various Debian packaging issues --- see debian/changelog for
details.  (Addresses Debian Bug #506064)


Programmer's Notes
------------------

Add test code to make sure e2fsck's problem.c doesn't have two problem
codes assigned to duplicate values.

Avoid using a hard-coded path for /bin/rm in block's test_probe.in.
(Addresses Sourceforge Bug: #2780205)

Clean up e2fsck by removing #ifdef RESOURCE_TRACK by adding an empty
function declaration for init_resource_track() and
print_resource_track() when RESOURCE_TRACK is not defined.

The test code which is used to build the tst_csum progam has been
moved from from tst_csum.c into csum.c under an #ifdef DEBUG to to
avoid compile problems caused by not having a prototype for
ext2fs_group_desc_csum().  (Addresses Sourceforge Bug #2484331)

Update the config.guess and config.sub file to the latest from the
FSF, to allow e2fsprogs to build on the avr32 platform.  (Addresses
Debian Bug: #528330)

Add a new function, ext2fs_extent_open2(), which behaves like
pext2fs_extent_open(), but uses the user-supplied inode structure
when opening an extent instead of reading the inode from disk.


E2fsprogs 1.41.5 (April 23, 2009)
=================================

Fix a number of filesystem corruption bugs in resize2fs when growing
or shrinking ext4 filesystems off-line (i.e., when the ext4 filesystem
is not mounted).

Debugfs can now set i_file_acl_high via the set_inodes_field command,
and print a 64-bit file acl.  This is useful for debugging filesystem
corruptions where the high bits of i_file_acl_high are set.  E2fsck
will detect and fix non-zero i_file_acl_high on 32-bit filesystems
since some Linux kernel versions pay attention to this field even when
they shouldn't.

Speed up e2fsck when checking clean filesystems by avoiding
unnecessary block reads, and coalescing the block group descriptor
blocks so they are read using a single read operation.

The libuuid library will now close all file descriptors before running
uuidd.  This avoids problems when the calling program has open sockets
which then never get closed because uuidd is a long-running helper
daeomn.  (Addresses Launchpad bug: #305057)

In order to avoid unnecessary full filesystem checks by e2fsck after
an on-line resize, e2fsck will ignore the NEEDS_RECOVERY flag set on
the backup superblocks.  (Addresses Red Hat Bugzilla: #471925)

Mke2fs will avoid trying to create the journal when run in
superblock-only mode (mke2fs -S), since the left-over journal in the
inode table will cause mke2fs to fail.

Fix a bug in libext2fs functions that check to see if a particular
device or filesystem image is mounted, which would cause these
functions to report that a file identical to the (relative) pathname
used by a pseudo-filesystem was mounted when in fact it was not.

Update Czech translation from the Translation Project.

Add Chinese (simplified) translation from the Translation Project.

Fix support for external journals (which was broken in e2fsprogs
1.41.4).

Fix a regression in debugfs where the "stat" command when no
filesystem was open would cause debugfs to crash with a segmentation
violation.

Starting in the 2.6.29 linux kernel, the ext4 filesystem driver can be
used to support filesystems without a journal.  Update the blkid
library so it understands this.

The blkid library will remove an entry from the blkid cache
representing the entire disk if partitions are found, since presuambly
the device previously had no partition table, but has now transitioned
to using a partition table.

Add a check to mke2fs and tune2fs that the argument to the -m option
(which specifies the reserved ratio) must be greater than zero.
(Addresses Debian Bug: #517015)

Add support for tracking the number kilobytes written to the
filesystem via the superblock field s_kbytes_written.  It will be
updated by the kernel as well as by e2fsprogs programs which write to
the filesystem.  This is useful for tracking the wear to filesystems
on Solid Sstate Drives.

Fix compatibility issue in the libext2fs info file and makeinfo
version 4.12.  (Addresses Red Hat Bugzilla: #481620)

Update/clarify man pages.  (Addresses Debian Bug: #515693, #365619)

Fixed various Debian packaging issues --- see debian/changelog for
details. (Addresses Debian Bug: #506279)

Programmer's Notes
------------------

Fix Hurd compilation problem in e2fsck and tune2fs (Addresses Debian
Bug: #521602)

Fix various gcc compilation warnings and other programming cleanups.
(Addresses Red Hat Bugzilla: #486997)

Add support for building the blkid command statically.

Add support for disabling the built-in blkid library in favor of a
system-installed blkid implementation via the configure option
--disable-libblkid.


E2fsprogs 1.41.4 (January 27, 2009)
===================================

Fixed a bug which could sometimes cause blkid to return an exit value
of zero for a non-existent device (Addresses Debian Bug: #502541)

Blkid will now recognize ext3 filesystems that have the test_fs flag
set as ext3 filesystems.

The blkid library will now recognize btrfs filesystems and swap
devices currently used by user-level software suspend.

Tune2fs now updates the block group checksums when changing the UUID
to avoid causing e2fsck to complain vociferously at the next reboot.

Tune2fs's inode size resizing algorithms have been fixed so it is not
vastly inefficient for moderate-to-large filesystems, due to some
O(n**2) and O(n*m) algorithms that didn't scale well at all.

Fix tune2fs's inode resizing algorithm so it will not corrupt
filesystems laid out for RAID filesystems; in addition, tune2fs will
refuse to change the inode size for filesystems that have the flex_bg
feature enabled.  (This is a limitation in the current implementation
of tune2fs -I.)

E2fsprogs 1.41 broke debugfs's logdump command for normal ext3/4
filesystems with 32-bit block numbers, when the headers for 64-bit
block numbers was added.  This regression has been fixed.

Debugfs's ncheck command has been fixed to avoid printing garbage
characters at the end of file names.

Fix resize2fs for ext4 filesystems.  Some blocks that that need moving
when shrinking filesystems with uninit_bg feature would not be moved.
In addition, blocks and inode table blocks were not being correctly
freed when shrinking filesystems with the flex_bg feable, which caused
resize2fs -M to fail.  Finally, when blocks are moved, make sure the
uninitialized flag in extents is preserved.

Fix bug which caused dumpe2fs to abort with an error if run on a
filesystem that contained an external journal.

Some distributions used "mke3fs" as an alias for "mkfs.ext3"; check
for this in argv[0] to provide better legacy support for these
distributions.  This is a practice that should NOT be continued,
however.

Mke2fs now has a new option -U, which allows the user to specify the
UUID that should be used for the new filesystem.

Mke2fs will treat devices that are exactly 16TB as if they were 16TB
minus one block.  This allows users who have read that ext3 supports
up to 16TB filesystems and who create a 16TB LVM to not get confused,
since the true limit is really 16TB minus one block.

E2fsck will no longer abort an fsck run if block group has an errant
INODE_UNINIT flag.

E2fsck now distinguishes between fragmented directories and fragmented
files in verbose mode statistics and in the fragcheck report.

Fix a bug in e2fsck which casued it double count non-contiguous
extent-based inodes.

E2fsck will leave some slack space when repacking directories to allow
room for a few directory entries to be added without causing leaf
nodes to be split right away.

Fix a bug which caused e2fsck to crash when it comes across a
corrupted interior node in an extent tree with the error message:
"Error1: Corrupt extent header on inode XXXXXX"

E2fsck problem descriptions involving the journal are no longer
referred to as "ext3" problems, since ext4 filesystems also have
journals.

Fix a long-standing bug in e2fsck which would cause it to crash when
replying journals for filesystems with block sizes greater than 8k.

Update Catalan translation from the Translation Project.

Fixed various Debian packaging issues --- see debian/changelog for
details. (Addresses Debian Bugs: #503057, #502323, #511207)

Programmer's Notes
------------------

Fix build of e2fsck.profiled, and add support for building profiled
binaries in the misc directory if configured with --enable-profile.

The ext2fs_open() function now performs more sanity checks on the
superblock to avoid potential divide by zero errors by other parts of
library.

The ext2fs_read_inode_full() function now has a safety check to avoid
a segmentation fault on corrupted filesystems.

The ext2fs_new_inode() function now has a sanity check so that if the
s_first_inode field in the superblock is insane, it will return
EXT2_ET_INODE_ALLOC_FAIL instead of returning an invalid inode number.

To avoid segmentation faults, ext2fs_block_alloc_stats() and
ext2fs_inode_alloc_stats() now validates the passed inode or block
number to avoid overrunning an array boundary.

Various signed/unsigned errors for variables containing block numbers
have been fixed.

Accomodations for gcc's stupidity in not realizing that constant
strings that do not contain a '%' character are safe to use in format
strings have been made so that distributions that want to compile
e2fsprogs with -Werror=format-security have an easier time doing so.

Added a new 64-bit getsize interface, ext2fs_get_device_size2().

Added the utility make-sparse.c to the contrib directory.

The ext2fs_block_iterate2() function now reflects errors from
ext2fs_extent_set_bmap() to the caller, if the callback tries to
change a block on an extent-based file, and ext2fs_extent_set_bmap()
fails for some reason (for example, there isn't enough disk space to
split a node and expand the extent tree.

The ext2fs_block_iterate2() function will preserve the uninit flag in
extents when the callback function modifies a block in an extent-based
file.

E2fsck will now flag filesystems that have an insane s_first_ino field
in their superblock, and attempt to use a backup superblock to repair
the filesystem.


E2fsprogs 1.41.3 (October 12, 2008)
===================================

E2fsck has been fixed so it prints the correct inode number for
uinit_bg related problems.

E2fsck will now offer to clear the test_fs flag if the ext4 filesystem
is available on linux.  This can be disabled via a configuration
option in /etc/e2fsck.conf.

Fix a file descriptor leak in libblkid when checking to see if an ext4
or ext4dev module exists.

Fix a bug in e2fsck where in preen mode, if there are disk I/O errors
while trying to close a filesystem can lead to infinite loops.
(Addresses Red Hat Bugzilla #465679)
    
Fix a bug in resize2fs where passing in a bogus new size of 0 blocks
will cause resize2fs to drop into an infinite loop.  (Addresses Red
Hat Bugzilla: #465984)
    
Add a check in the Unix I/O functions in libext2fs so that when a
device is opened read/write, return an error if the device is
read-only using the BLKROGET ioctl.

Fix debugfs's ncheck command so that it prints all of the names of
hardlinks in the same directory.

Fix a bug in libblkid so it correctly detects whether the ext4 and
ext4dev filesystems are available, so that the ext4dev->ext4
fallback code works correctly.

Programmer's Notes
------------------

Fix a parallel build problem by making sure util/subst is built before
trying to build the lib/et directory.  (Addresses Sourceforge Bug:
#2143281)

Updated "make depend" information for crc16.o
    

E2fsprogs 1.41.2 (October 2, 2008)
==================================

Fix e2fsck's automatic blocksize detection.  This fixes a regression
from e2fsprogs 1.40.7 which caused e2fsck to fail if the user
specifies a block number using the -b option if the blocksize option
isn't also specified using -B.  Unfortunately, users very commonly
invoke e2fsck using "e2fsck -b 32768 /dev/hdXXX" to use the backup
superblock; in fack e2fsck will often suggest this kind of command
line.  Oops.

Enhance the debugfs's "ncheck" command so it will print all of the
pathnames for the specified inodes.  (Previously, in some cases ncheck
might not print a pathname for an inode at all if some of the other
inodes had multiple hard links.)

Enhance debugfs's "hash" command so the hash seed can be specified via
a command-line option.  In addition, allow the hash algorithm to be
specified by name instead of just by number.

Fix e2fsck so that we don't accidentally print the translation file's
header when asking the user a custom question so there is no prompt
defined for a particular problem record.  For example, the question
"Run journal anyway" will get the PO header tacked on because e2fsck
erroneously passed the null string to _().  (Addresses Launchpad Bug:
#246892)

Enhance badblocks so that it can test a normal file which is greater
than 2GB.

Enhance the badblocks command so that it displays the time and
percentage complete when in verbose mode.  (Addresses Debian Bug:
#429739)

Fix a potential memory leak in a error handling path in debugfs's
ncheck function.

Fix a potential memory corruption problem if a memory allocation fails
in resize2fs.

Fix the usage message for debugfs's logdump command to be consistent
with its man manpage.

Update Polish, French, Vietnamese, Dutch, Indonesian, German, Czech,
and Sweedish translation from the Translation Project.

Add documentation for the file I/O functions to the libext2fs.texinfo
file.  (Addresses Debian Bug: #484877)
    
Update and clarified various man pages.  (Addresses Launchpad Bug
#275272; Addresses Debian Bugs: #498100, #498101, #498102, #498103)

Fixed various Debian packaging issues --- see debian/changelog for
details. (Addresses Debian Bug: #497619)

Programmer's Notes
------------------

Fix a potential file descriptor leack in libcom_err by setting the
close-on-exec flag for a fd used for debugging.  (Addresses Red Hat
Bugzilla #464689)

Fix a potential race in libcom_err by using sem_post/sem_init.  SuSE
has been carrying a patch for a long time to prevent a largely
theoretical race condition if a multi-threaded application adds and
removes error tables in multiple threads.  Unfortunately SuSE's
approach breaks compatibility by forcing applications to link and
compile with the -pthread option; using pthread mutexes has
historically been problematic.  We fix this by using sem_post/sem_init
instead.

Fix e2fsprogs-libs build failure due to 'subs' target.  (Addresses
Sourceforge Bug: #2087502)

Avoid linking e2initrd_helper, debugfs, blkid, and fsck with unneeded
libraries when using ELF shared libraries.

Fix ELF shared library when building on systems that don't already
have the e2fsprogs shared libraries already installed.  (Addresses
Sourceforge Bug: #2088537)

Fix the pkg-config files so they work correctly when linking with
static libraries and fix the include directory so programs don't have
to use #include <ext2fs/ext2fs.h>, but can use #include <ext2fs.h>
instead.  (Addresses Sourceforge Bug: #2089537)
    
Make sure ext2fs_swab64() is compiled for all platforms, and not just
for x86.  (Addresses Debian Bug: #497515)
    
Remove the unused ext2fs_find_{first,ext}_bit_set() functions for all
non-x86 platforms.  (They had been removed for x86 earlier.)

Fix diet libc compilation support, which had bitrotted due to lack of
TLC.  Fixing this improves general portability.

When installing the link library when using ELF shared libraries,
avoid using absolute pathnames if the link library and the shared
library are installed in the same directory.  (Addresses Sourceforge
Bug: #1782913)

Fix gen-tarball so it will work even if the top-level directory has
been renamed to something other than "e2fsprogs".  Also make
gen-tarball print the size of the resulting tar.gz file.


E2fsprogs 1.41.1 (September 1, 2008)
====================================

Many people are forgetting to update their mke2fs.conf file, and this
causes ext3, ext4, and ext4dev filesystems won't get created with the
proper features enabled.  We address this in two ways.  First, mke2fs
will issue a warning if there is not definition for an ext3, ext4, or
ext4dev filesystem and the user is trying to create such a filesystem
type.  Secondly, when installing from a source build, "make install"
will provide basic configuration file handling for /etc/mke2fs.conf.
If it exists, and does not mention ext4dev, it will be moved aside to
/etc/mke2fs.conf.e2fpsrogs-old and the new /etc/mke2fs.conf file will
be installed.  If the existing /etc/mke2fs.conf file does mention
ext4dev, then "make install" will install official mke2fs.conf file as
/etc/mke2fs.conf.e2fsprogs-new and issue a message to the user that
they should look to see if any changes need to be merged.

The mke2fs program will now create the journal in the middle of the
filesystem, since this minimizes seek times on average for fsync-heavy
workloads.  In addition, mke2fs will now create journals using extents
for filesystems that support them.  This results in a more efficient
encoding for the journal since it eliminates the need for using
indirect blocks.

The mke2fs program will avoid allocating an extra block to the
journal.  (Addresses Sourceforge Bug: #1483791)

Mke2fs will correctly enforce the prohibition against features
(specifically read-only features) in revision 0 filesystems.  (Thanks
to Benno Schulenberg for noticing this problem.)

Mke2fs previously would occasionaly create some slightly non-optimally
placed inode tables; this bug has been fixed.

The mke2fs and tune2fs programs now print the correct usage message
describing the maximum journal size.  (Addresses Debian Bug: #491620)

Add support for setting the default hash algorithm used in b-tree
directories in tune2fs (from a command-line option) or mke2fs (via
mke2fs.conf).  In addition, change the default hash algorithm to
half_md4, since it is faster and better.

The blkid library will now recognize MacOS hfsx filesystems, and
correctly extract the label and uuid for hfs, hfsx, and hfsplus
filesystems.  (Addresses Sourceforge Feature Requests: #2060292)

The blkid library has improved detection of JFS and HPFS filesystems.
(Addresses Launchpad Bug: #255255)

The blkid library is now much more efficiently handling devicemapper
devices, mainly by no longer using the devicemapper library.  This can
speed up access for systems with a large number of device mapper
devices.

Blkid had a number of cache validation bugs in libblkid that have been
fixed.   (Addresses Debian Bug: #493216)

Resize2fs will now properly close out the "updating inode references"
progress bar so there is a newline printed before printing the final
"resize is successful" message.

Resize2fs will now correctly handle filesystems with extents and/o
uninitialized block groups correctly when file/directory blocks need
to relocated (i.e., when shrinking a filesystem or if the resize_inode
is not present).  To support this, the ext2fs library now supports
initializing inode and block bitmaps that are not yet initialized when
allocating them using ext2fs_new_block() and ext2fs_new_inode().  In
addition, e2fs_block_iterate2() can now support changing the location
of interior nodes of an extent tree, and ext2fs_extent_set_bmap() has
been optimized to avoid creating unnecessary new extents when updating
the location of blocks in the extent tree.  This will also help out
e2fsck's recovery of obscurely corrupted filesystems with extents,
when blocks are claimed by multiple inodes.

Add support for on-line resizing ext4 filesystem with the flex_bg
filesystem feature.  The method for doing so is not optimal, but to do
a better job will require kernel support.

E2fsprogs 1.41.0 intrduced a bug in libext2fs which casued e2image and
debugfs programs to not be able to read e2image files; the signed
vs. unsigned bug in the code which read bitmaps from the e2image has
been fixed.   (Addresses Debian Bug: #495830)

Resize2fs is now correctly managing the directory in-use counts when
shrinking filesystems and directory inodes needed to be moved from one
block group to another.  This bug has been around since e2fsprogs
1.26, and is largely harmless, but does cause a filesystem corruption
which will be flagged by e2fsck after the filesystem has been shrunk.
 
E2fsck will no longer issue spurious complaints about the inode size
caused by very large extent-based files, and by blocks reallocated
using fallocate() with the FALLOC_FL_KEEP_SIZE option.  (Addresses
Kernel Bugzilla: #11341)

Mke2fs will now set the creation timestamp on the lost+found directory
and the root directory.  (More generally, all new inodes created using
the ext2fs library will correctly set the creation timestamp.)

E2fsck now correctly calculates ind/dind/tind statistics in the
presence of extent-based files.  In addition, "e2fsck -v" will report
statistics of the depth of extent trees in the filesystem.  E2fsck can
also give an inode fragmentation report using "e2fsck -E fragcheck"
which can be useful when debugging the kernel block allocation
routines.

Fix support for empty directory blocks in ext4 filesystems with 64k
blocksize filesystems.

E2fsck will now print the depth of corrupt htree directories.

Debugfs's htree command now correctly understands extent-based
directories.  It will also print out the minor hash as well as the
major hash.

Debugfs has a new command which will print the supported features of
e2fsprogs, to enable scripts to know whether the installed version of
e2fsprogs can support a specific feature.

Debugfs will now write files using extents for filesystems that
support them.

The error message printed by "tune2fs -I" if the inode size was too
small was rather confusing, so it has been improved.  Also, we won't
try to create an undo log until we know that command-line-specified
parameters such as "tune2fs -I <inode size>" are valid.

Given some filesystems found "in the wild" that had non-zero block
group checksums even though the uninit_bg/gdt_sum feature was not
enabled, e2fsck would issue spurious error messages.  Teach
ext2fs_group_desc_csum_verify() to ignore the block group checksum
entirely if the feature flag is not set.  (Addresses Debian Bug:
#490637)

The blkid program will now print out a user-friendly listing of all of
the block devices in the system and what they contain when given the
-L option.  (Addresses Debian Bug: #490527)

The filefrag program now has a more accurate calculation for the
number of ideal extents.  (Addresses Debian Bug: #458306)

The test I/O manager is now enabled by default, but its overhead is
only incurred when it would be enabled via the TEST_IO_FLAGS or
TEST_IO_BLOCK environment variables.

Typographical errors in various program strings and usage messages
have been fixed; most of these were pointed out by the e2fsprogs
message catalog translators.  (Thanks, translators!)

Update and clarified various man pages, as well as some typographical
errors in the libext2fs texinfo file.

Fixed various Debian packaging issues --- see debian/changelog for
details.

Add Indonesian and update French, Polish, Dutch, German, Sweedish,
Czech, and Vietnamese Translations.  (Addresses Debian Bugs: #313697,
#401092)

Programmer's Notes
------------------

Fix portability problem with the badblocks group; for systems that
don't have nanosleep(), try using usleep() instead.

The "make check" target in the e2fsck directory now sets
LD_LIBRARY_PATH before running the various e2fsck internal library
regression tests.

The crc32 regression test in the e2fsck library is now portable to
greater varienty of environments, including big-endian systems and
when cross-building e2fsprogs for embedded systems.  (Addresses
Sourceforge Bug: #2019287)

The ext2fs_extent_set_bmap() had some bugs when setting the first
block in a file, or when replacing a single block extent.  Those cases
fortunately were came up relatively rarely when e2fsck was checking
files, but caused some problems when resize2fs was shrinking
extent-based files.

Fix a potential core-dumping bug in libe2p's iterate_on_dir()
function.

Various ext2fs library functions --- ext2fs_block_iterate2(),
ext2fs_initialize() and ext2fs_extent_open() --- now correctly free
allocated memory to avoid memory leaks in all of their error return
paths.

Ext2ed was failing to build because masix support had been removed in
the rest of e2fsprogs, so ext2ed no longer has masix support, either.

The configure script now respects the LDFLAGS environment variable if
it is set when configure is called.  (Addresses Sourceforge Feature
Request: #1937287)

Libuuid is now more portable to the Windows platform.  (Addresses
Sourceforge Feature Request: #1937287)

The configure script now uses AC_MSG_{RESULT,WARN,ERROR} instead of
bare echo commands so that configure flags such as --quiet work
correctly.  (Addresses Sourceforge Patches: #2058794)

A few uses of sprintf have been removed from the ext2fs library to
make life easier for bootloaders with a limited libc environment.
(Addresses Sourceforge Bug: #2049120)

The ext2fs_read_inode() checks the validity of the inode number passed
to it earlier, to avoid doing some needless work when it would fail
anyway.

The ext2fs_open() checks the validity of the blocksize parameter
passed to it earlier, to avoid doing some needless work when it would
fail anyway.

Disable a very annoying automatic "%.sh -> %" GNU make rule in the
top-level Makefile.  That automatic rule is used to better support
SCCS, but it caused problems for a particular niche distribution which
likes to use configure.sh files to store the configure options used to
build a package.  Unfortuntaely GNU make will use the configure.sh to
replace the configure script, resulting in a self-inflicted fork bomb
leading to an out-of-memory crash.

To support old GNU C compilers don't use C99/C++ comments, but only
K&R style comments, and don't try to use __builtin_expect if __GNUC__
is less than 3.  (__builtin_expect is only supported for gcc versions
2.96 and up, and it's tricky to check for gcc 2.95 vs gcc 2.96; since
this is an optimization, we only try to use __builtin_expect for gcc 3
and up.)

In e2fsck's crc routines, make sure we use WORDS_BIGENDIAN instead of
__LITTLE_ENDIAN, which are only defined by glibc's header files and
hence isn't portable.

For the convenience for some distributions that need a static tune2fs,
the Makefile for misc/ now has a tune2fs.static target.

The ext2fs_block_iterate2() function now supports BLOCK_FLAG_APPEND
for extent-based files

The ext2fs_bmap() function now supports BMAP_ALLOC for extent-based
files.

All source files no longer have any trailing white space.

The io_channel_read_blk64() and io_channel_write_blk64() functions are
now functions instead of C preprocessor macros to provide better
forward compatibility.

The e2fpsrogs translation template now expands the @x abbrevation.

Various namespace leackages in libblkid, libe2p, and libext2fs have
been fixed.

Fix a parallel build problem in e2fsprogs.

E2fsprogs is now more portable to Solaris.
  * blkid no longer assumes that the TIOCGSIZE and TIOCGWINSZ ioctl's
    are always present.
  * Scripts do not assume that /bin/true is always in /bin
  * Don't use __FUNCTION__ since Solaris's C99 doesn't support it.
  * Flush stdio handles before calling setbuf(), since Solaris will
    discard any pending output to the stream.
  * Define _XOPEN_SOURCE to 600 since Solaris's header files are very
    picky about which C compiler can beused for SUSv3 conformance.
    Use of C99 is not compatible with SUSv2 (_XOPEN_SOURCE=500),
    and C89 is not compatible with SUSv3 (_XOPEN_SOURCE=600).
    Since we need some SUSv3 functions, consistently use SUSv3 so
    that e2fsprogs will build on Solaris using c99.
  * Solaris C99 does not support varargs C preprocessor macros
  * Solaris header files pollute the C namespace if in/netinet.h
    is included, which conflicts with e2fsprogs' use of the kmem_cache_t
    typedef.
  * Solaris ships with a pathetically ancient shell in /bin/sh so we
    avoid the use of various more avanced shell constructs such as $().

The "make rpm" command will now take some extra configure optiosn from
the build environment without needing to patch the source tree.

The ext2fs_add_dir_block() function will now grow the dblist more
aggressively as an optimization to avoid copying the array too often.

The e2fsck_write_bitmaps() will write the block and inode bitmaps
together instead of in two passes.


E2fsprogs 1.41 (July 10, 2008)
==============================

Add support for ext4 filesystem features, in particular extents,
uninit_bg, flex_bg, huge_file, and dir_nlink features.  Also add
support for checking journal checksums.  Debugfs will print new
superblock and inode fields that were defined for ext4.  For example,
the nanosecond and i_version fields of an inode, and the
s_min_extra_isize and s_wanted_extra_isize fields from the superblock.
Note: Resize2fs doesn't currently support the combination of flex_bg
and !resize_inode.  (Addresses Debian Bug: #388452, #425477)

Tune2fs can support migrating a filesystem from using 128 byte inodes
to 256 byte inodes, so it can take advantage of the full features of
ext4.

Add support for "undo" support.  E2fsck and mke2fs can optionally
record an undo log which can replayed by the program e2undo.

E2fsck could damage a filesystem by trying to relocate inode tables
due to corrupted block group descriptors, where the attempted inode
table relocation would do far more harm than good.  E2fsck has been
fixed to detect this these sorts of corrupted block group descriptors
much earlier in e2fsck processing, so it can try to use the backup
superblock and block group descriptors first.  This should be a much
better strategy for recovering these types of corrupted filesystems.
(Addresses Sourceforge Bug: #1840291)

E2fsck will display a more understandable message when the last check
field in the superblock is in the future.  (Addresses Debian Bug:
#446005).

E2fsck now performs more extensive and careful checks of extended
attributes stored in the inode.

Enhance mke2fs to print a more explanatory error message when
ext2fs_get_device_size() returns EFBIG.  (Addresses Debian Bug:
#488663)

Fix mke2fs to use a default block size of 4k when formatting an
external journal device.  This is done by using a fixed filesystem
type list that consists only of the single filesystem type "journal"
when looking up configuration keys in /etc/mke2fs.conf.  (Addresses
Debian Bug: #488663)

Speed up how mke2fs writes the journal data blocks by writing the disk
blocks in larger chunks.

Fix blkid handling of stale devices.  Fix a bug which could cause a
core dump while garbage collecting the blkid cache, and assure that
blkid_find_dev_with_tag() never returns a non-existent device.  Also,
if a filesystem is found at a new /dev location, eliminate any
duplicate stale entries which can not be verified.
(Addresses Debian Bugs: #487758, #487783)
    
Add more paranoid checks for LVM volumes and swap partitions in
blkid's probe function, to reduce the chances of false positives.

The mke2fs program now has a much more sophisticated system for
controlling configuration parameters of a newly created filesystem
based on a split filesystem and usage type system.  The -t option to
mke2fs was a deprecated alias to -c; it now specifies a filesystem
type (ext2, ext3, ext4, etc.), while the -T option can now be a comma
separated usage list.  The filesystem type information and type
information is used to extract configuration parameters from the
/etc/mke2fs.conf file.

The mke2fs program will no longer complain and request the -f option
when the user tries to create a filesystem with greater than 2**31
blocks.

When creating a filesystem for the GNU Hurd use a fs-type of Hurd and
adjust the mke2fs.conf file so filesystems for the Hurd are created
with a blocksize of 4096 and inode size of 128, which is all it knows
how to handle.  (Addresses Debian Bug: #471977)
    
Mke2fs will always make sure that lost+found always has at least 2
blocks, even for filesystems with very large blocksizes (i.e., 64kb).

Resize2fs will now print the minimum needed filesystem size if given
the -P option, and will resize the filesystem to the smallest possible
size if given the -M option.

Fix resize2fs to clean up the resize_inode if all of the reserved gdt
blocks are consumed during an off-line resize.

The "ls" command in debugfs now supports the -p option, which causes
it to quote the filenames so that spaces or tabs in directory entries
are easily visible.  (Addresses Red Hat Bugzilla: #149480; Addresses
Sourceforge Feature Request: #1201667)

Fix a potential off-by-one buffer oveflow in the fs_device_name in an
e2image file.

The chattr program will return a non-zero exit code in case of
failures, and error messages can be suppressed with the -f option.
(Addresses Red Hat Bugzilla: #180596)

Fix a bug in badblocks which caused it to overrun an array and likely
crash if more than 8 test patterns are specified using the -t option.
(Addresses Debian Bug: #487298)
    
Add support to badblocks to limit how quickly it reads from the disk
drive (so it can be used for background scrubbing), and so it will
abort after finding a given number of errors.

Remove support for the legacy big-endian filesystem format which only
existed on extremely long-dead PowerPC kernels almost a decade ago.

Remove MASIX support from e2fsprogs.

Add I/O statistics reporting to e2fsck.

Update Vietnamese, Polish, French, Spanish, German, Catalan, Dutch,
Czech translations.

Fixed various Debian packaging issues --- see debian/changelog for
details.  (Addresses Debian Bugs: #487443, #487675, #490003)

Fixed spelling mistakes, typos, and otherwise clarified man pages.
(Addresses Debian Bugs: #393313, #487849, #440983, #440981)

Programmer's Notes
------------------

Factor out bitmap code in preparation for adding 64-bit new-style
bitmaps.

Fix gcc -Wall warnings

Fix the pkg-config files so that private librares are specified in
"Libs.private:".

Fix the libext2fs.texinfo manual so it builds with modern versions of
texinfo.

Silence the makefile from showing the awk command used to build the

Clean up the badblocks group so to make it more portable and robust.

Avoid using predictable filenames in /tmp in blkid's regression test
suite.  Also remove bashism's in the regression test script.

If the configure script is given --with-diet-libc, don't use thread
local storage, since diet libc doesn't support TLS.  (Addresses
Sourceforge Bug: #2000654)
    
Fix the blkid regression test suite to tolerate older versions of
mkswap that don't support the -U option.

A few library routines have been converted to support 64-bit block
numbers; in particular, the I/O manager functions, the test_io,
inode_io, and unix_io managers have all be converted to support 64-bit
operation.

Debugfs can now be extended for use by test programs.  See
lib/ext2fs/extents.c for an example for how it can be used.  The test
program links against the debugfs object files, and provides
additional commands by defining an auxiliary libss command table.

The lazy_bg filesystem feature, which was only used by developer's
testing, has been removed since it has been largely supplanted by
uninit_bg.  This also simplifies the code.


E2fsprogs 1.40.11 (June 17, 2008)
=================================

Mke2fs, tune2fs, and resize2fs now use floating point to calculate the
percentage of reserved blocks.  (Addresses Debian Bug: #452639)

Updated Spanish and Catalan translations.

Fixed various Debian packaging issues --- see debian/changelog for
details.  (Addresses Debian Bugs: #483962, #483023)

Add detection for ZFS volumes to the libblkid library.

Fixed spelling mistakes, typos, and otherwise clarified man pages.
(Addresses Debian Bug: #486463)

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

Fix marginal C code in probe_lvm2() function to the blkid library more
portable for older compilers.

Fix build problems on MacOS X.  (Addresses Sourceforge Bug: #1972473)

Fix ext2fs_swap{16,32,64} functions so they can be used by external
applications on big-endian machines.  (Addresses Debian Bug: #484879)
    

E2fsprogs 1.40.10 (May 21, 2008)
================================

When deciding whether or not to revalidate a blkid cache entry, if the
device's mtime is newer than the last time the cached entry was
validated, force a revalidation.

Fix a potential data corruption bug in e2fsck in the journal replay.
The chances of this is happening is extremely remote, especially the
default data=ordered or data=writeback modes.  However, if a block
which has been journalled starts with the first four bytes 0xc03b3998,
when e2fsck replays the journal, those four bytes will be replaced
with zero's.  Fortunately, it is highly, highly unlikely for e2fsck
metadata to begin with those fatal 4 byte sequence, and unless
data=ordered mode is in use, data blocks are never journaled.

Updated German, Dutch, Sweedish, and Vietnamese translations.

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

Fixed various Debian packaging issues --- see debian/changelog for
details.

Remove default sizes of types when cross compiling, since autoconf
2.50 can figure this out automatically now.


E2fsprogs 1.40.9 (April 27, 2008)
=================================

SuSE's security team audited uuidd and came up with a few minor
issues.  None of them are serious given that uuidd runs setuid as a
unprivileged user which has no special access other than libuuid
directory, but it's good to get them fixed.

One additional fix in ext2fs_swap_inode_full() needed for resize2fs to
work correctly with in-inode extended attributes.

Updated German, Czech, Dutch, French, Polish, Sweedish, and Vietnamese
translations.

Debugfs will avoid using a pager if the standard output is not a tty.

Fix debugfs and tune2fs to correctly handle daylight savings time when
parsing a time string.

Fixed spelling mistakes, typos, and otherwise clarified man pages.

Fix fsck completion bars when multiple filesystems were being checked
in parallel.  (Addresses Debian Bug: #432865, Addresses Launchpad Bug:
#203323, Addresses Sourceforge Bug: #1926023)

Fix fsck so that progress information is sent back correctly when
multiple filesystems are being check and the output of fsck is being
redirected to a file descriptor.  Also, include the device name (w/o
spaces) in the progress information sent back via a file descriptor.
(Addresses Launchpad Bug: #203323, Addresses Sourceforge Bug:
#1926023)

Teach fsck to treat "ext4" and "ext4dev" as ext* filesystems.

If logsave receives a SIGTERM or SIGINT signal, it will now pass that
signal to its child process.

Fix mke2fs's creation of are resize inode when there is a non-standard
s_first_data_block setting.

Fix bug in blkid when run by an unprivileged user; most devices were
not reported correctly.  9Addresses Launchpad Bug: #220275)

Mke2fs will not allow the logically incorect combination of
resize_inode and meta_bg, which had previously caused mke2fs to create
a corrupt fileystem.

Fix fsck in German locales so that a 'j' means yes.
(Addresses Sourceforge Bug: #1947683)


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

Fixed various Debian packaging issues --- see debian/changelog for
details.

Update valgrind options in test_script to work with valgrind 3.2.3

Update texinfo.tex to a much newer version from the FSF.

Remove bashism for configure script and from the lib/ss Makefile.
Addresses Sourceforge Bug: 1921969

Fix some silently broken tests: m_no_opt, m_meta_bg, and m_raid_opt.

Fix build system so that if texinfo is not installed, it won't print a
(harmless) error message.


E2fsprogs 1.40.8 (March 13, 2008)
=================================

Fixed e2image -I so it works on image files which are larger than 2GB.

Fixed e2fsck's handling of directory inodes with a corrupt size field.  If
the size is larger than the number of blocks found in the inode, don't
try to allocate extra empty blocks at the end of the directory to make
up the difference; there's no point to doing that.  In addition, if
the size is not a multiple of a blocksize, always fix it.

E2fsck handled a pass 2 "should never happen error" by not giving
enough information and then core dumping.  Unfortunately, it was all
too easy to trigger the "should never happen" situation if a
directory's inode size was not correct.  This has been fixed, but
e2fsck has also been taught how to handle this situation more
gracefully, by simply removing the inode hash tree information, so
that it can be rebuilt again after e2fsck's pass 3.  (Addresses
Launchpad Bug: #129395)

Resize2fs had a bug resizing large inodes with extended attributes
that was fixed in 1.40.6; unfortunately, it turned out it wasn't fixed
completely on big-endian systems such as PowerPC.  The bug should be
completely fixed now.  Yay for regression test suites.  (Addresses Red
Hat Bugzilla: #434893)
    
Updated German, Czech, Dutch, Polish, Sweedish, and Vietnamese
translations.  Many thanks to Philipp Thomas from Novell for stepping
up to become the new German translation maintainer!  (Addresses Debian
Bugs: #302512, #370247, #401092, #412882).

When e2fsck is clearing a corrupt inode's HTREE directory information,
make it clear that it is just clearing the HTREE information, not the
entire inode.

Fixed spelling mistakes, typos, and otherwise clarified man pages.  

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

Add new functions, ext2fs_dblist_get_last() and
ext2fs_dblist_drop_last(), which allows the caller to examine the last
directory block entry added to the list, and to drop if it necessary.

Fixed a portability problem in libblkid with DJGPP.

Fix an obvious typo in an "internal error" message in e2fsck.  Thanks
to Philipp Thomas for pointing this out.

If the info files are not built, change "make install" so it doesn't
fail with an error code.


E2fsprogs 1.40.7 (February 28, 2008)
====================================

Remove support for clearing the SPARSE_SUPER feature from tune2fs, and
depreciate the -s option, since it can result in filesystems which
e2fsck can't fix easily.  There are very good reasons for wanting to
disable sparse_super; users who wants to turn off sparse_super can use
debugfs.  (Addresses Sourceforge Bug: #1840286)
    
Add missing options to mke2fs's usage message.  (Addresses Sourceforge
Bug: #1751393)
    
Fix bug in resize2fs when large (greater than 128 byte) inodes are
moved when a filesystem is shrunk; it was only moving the first 128
bytes, so extended attributes were not getting moved.  (Addresses Red
Hat Bugzilla: #434893)

E2fsck now prints an explicit message when the bad block inode is
updated, to avoid confusion about why the filesystem was modified.
(Addresses Sourceforge Bug: #756460)
    
Allow mke2fs and tune2fs manipulate the large_file feature.
Previously we just let the kernel and e2fsck do this automatically,
but e2fsck will no longer automatically clear the large_file feature.
It still isn't really necessary to worry about this feature flag
explicitly, but some users seem to care.  (Addresses Red Hat Bugzilla:
#258381)
    
Suppress message about an old-style fstab if the fstab file is empty.
(Addresses Debian Bug: #468176)
    
Fix (really minor) bug in debugfs's find_free_block so it avoids
reporting a free block more than once if there are too few free blocks
in the filesystem.  (Addresses Sourceforge Bug: #1096315)
    
Change e2fsck to no longer clear the LARGE_FILES feature flag
automatically, when there are no more > 2GB files in the filesystem.
It's been almost a decade since there have been kernels that don't
support this flag, and e2fsck clears it quietly without telling the
user why the filesystem has been changed.
    
Fix bug which could cause libblkid to seg fault if a device mapper
volume disappears while it is being probed.  (Addresses RedHat
Bugzilla: #433857)
    
Inhance e2fsck's reporting of unsupported filesystem feature flags.
(Addresses Sourceforge Feature Request: #1175808)
    
Fix option syntax in dumpe2fs for explicit superblock and blocksize
parameters.  What was currently documented in the man page has been
broken for some time, due to getopt() implementation changes.  The
option sytax has been changed to one which is can be more portable
supported and which is consistent with the format for extended options
in mke2fs and tune2fs.  (Addresses Sourceforge Bug: #1830994)
    
Add support to tune2fs to clear the resize_inode feature.  This
requires an fsck afterwards.  (Addresses Red Hat Bugzilla: #167816)

Teach blkid to detect LVM2 physical volumes.  (Addresses Red Hat
Bugzilla: #409321)

Add support for setting RAID stride and stripe-width via mke2fs and
tune2fs.  Teach dumpe2fs to print the RAID parameters.

Add support for setting new superblock fields to debugfs's
set_super_value.

Add support for printing "mostly-printable" extended attributes in
Debugfs.

Add support for the -M option to fsck, which causes it to ignore
mounted filesystem.

Fix uuidd so that it creates the pid file with the correct pid number.
(Addresses Sourceforge Bug: #1893244)

Fix various gcc -Wall warnings.

Update Czech, Dutch, Polish, Sweedish, and Vietnamese translations

Fixed spelling mistakes, typos, and otherwise clarified man pages.  
(Addresses Sourceforge Patch: #1399325)


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

Fixed various Debian packaging issues --- see debian/changelog for
details.  (Addresses Debian Bug: #466929)

Add new flag EXT2_FLAG_NONFREE_ON_ERROR ext2fs_open2() which returns a
partially filled-in filesystem object on an error, so that e2fsck can
print more intelligent error messages.
    
Add a new function e2p_edit_feature2() which allows the caller to
specify which feature flags are OK to set or clear, and which returns
more specific information about feature flags which are not allowed to
be set/cleared.
    
Set the C locale in the test_script driver since it uses [A-Za-z].
(Addresses Sourceforge Bug: #1890526)

Use fcntl locking instead of lockf in libuuid since Cygwin doesn't
support lockf().

Change configure.in to avoid using the 'dc' command unless it is
absolutely needed. (i.e., when using parsing a WIP-style version
number)  (Addresses Sourceforge Bug: #1893024)

Add portability checks to support compilation under DJGPP.

Update to the latest samba tdb code before the LGPLv3 change, which
fixes a realloc() leak on failure.

Fix memory leak in ext2fs_alloc_block().

Fix makefile dependency issues for various install targets.
(Addresses-Sourceforge-Patches: #1903484, #1903466, #1903456)
    
Improve descriptions for the r_move_itable and r_resize_inode tests.


E2fsprogs 1.40.6 (February 9, 2008)
===================================

Add support for returning labels for UDF filesystems in the blkid
library.

Fix bug in the blkid library where cached filesystems was not being
flushed when opening USB devices returned the error ENOMEDIUM.
(Addresses Debian Bug: #463787)

Added logic to the blkid library to automatically choose whether a
filesystem should be mounted as ext4 or ext4dev, as appropriate.

Allow tune2fs to set and clear the test_fs flag on ext4 filesystems.

Fix a bug in e2fsck which caused it to core dump if e2fsprogs had been
configured with --enable-jbd-debug.

Document the BLKID_FILE environment variable in the libblkid man page

Programmer's Notes:
-------------------

Update e2fsprogs translation template and Vietnamese and Czech translations

Fixed various Debian packaging issues --- see debian/changelog for
details.  (Addresses Debian Bugs: #436058)

Don't try to create $DESTDIR/etc/init.d as part of make install as we
don't install the init.d script (and it's not the recommended way to
start uuidd anyway).  (Addresses Sourceforge Bug: #1885085)

Use thread local storage to fix a theoretical race condition if two
threads try to format an unknown error code at the same time in the
com_err library.


E2fsprogs 1.40.5 (January 27, 2008)
===================================

Fix a potential overflow big in e2image if the device name is too
long.

Mke2fs will now create new filesystems with 256 byte inodes and the
ext_attr feature flag by default.  This allows for much better future
compatibity with ext4 and speeds up extended attributes even on ext3
filesystems.

Teach e2fsck to ignore certain "safe" filesystem features which are
set automatically by the kernel.  Having the kernel set features
automagically behind the user's back is a bad idea, and we should try
to break the kernel of this habit, especially for the newer ext4
feature flags.  But for now, we will try to avoid needless full checks
which can annoy users who are doing fresh installs.

Add support in tune2fs and mke2fs for making a filesystem as being "ok
to be used with test kernel code".  This will be needed for using test
filesystems with the latest ext4 kernel code.

Change e2fsck -fD so that it sorts non-htree directories by inode
numbers instead of by name, since that optimizes performances much
more significantly.  (Addresses-Sourceforge-Feature-Request: #532439)

If e2image fills the disk, fix it so it exits right away instead of
spewing large numbers of error messages.
(Addresses-Sourceforge-Feature-Request: #606508)

If ftruncate64() is not available for resize2fs, let it use ftrucate()
instead, but have it check to see if the size would get truncated, and
skip calling ftruncate in that case.

Add support for detecting HFS+ filesystems in the blkid library.

Add supprt in the blkid library for ext4/ext4dev filesystems.

Fix a bug in blkid where it could die on a floating point exception
when presented with a corrupt reiserfs image.

Fix blkid's handling of ntfs UUID's so that leading zeros are printed
such that UUID string is a fixed length.

Add sample python bindings for the uuid library to the contrib
directory.  (Addresses-Sourceforge-Patches: #778817)

Fix debugfs's 'lsdel' command so it uses ext2fs_block_iterate2 so it
will work with large files.  (Addresses Sourceforge Feature Request:
#1257500 and Sourceforge Support Request: #1253511)
    
Allow the debugfs 'undel' command to undelete an inode without linking
it to a specific destination directory, since this might require
allocating blocks that could overwrite some yet-to-be-recovered
deleted files.  (Addresses-Sourceforge-Feature-Request: #967141)

Update Swedish translations from the Translation Project.

Programmer's Notes:
-------------------

Fix configure handling of --sbindir (which should rarely be used, but
someone did complain, so let's fix it).  (Addresses Sourceforge Bug:
#498381)

Updated e2fsprogs.spec file to include a new uuidd package

Use pkg-config to determine where to find the devmapper library so we
can find out where it is located on different distributions.

Fix Makefile race so that "make -j3 distclean" works correctly

Fix portability problems on non-Linux/non-Hurd/non-Masix systems,
especially on MacOS X systems.  (Addresses Sourceforge Bugs: #1861633,
#1819034, #1863819)

Fixed spelling mistakes, typos, and otherwise clarified man pages.

Fixed various Debian packaging issues --- see debian/changelog for
details.  (Addresses Debian Bugs: #459403, #459475, #459614)

Remove the --enable-dynamic-static configure option, and build e2fsck
dynamically by default.  If the user wants e2fsck.static, he/she will
need to build it via "make -C e2fsck e2fsck.static"

Fix various build warnings due to missing prototypes.
(Addresses Sourceforge Patch: #1861663, #1861659)


E2fsprogs 1.40.4 (December 31, 2007)
====================================

Improve time-based UUID generation.  A new daemon uuidd, is started
automatically by libuuid if necessary.  This daemon is setuid to allow
updates to /var/lib/libuuid, so the clock sequence number can be
stored and so if the clock is set backwards, it can be detected.
(Addresses Sourceforge Bug: #1529672, Addresses Red Hat Bugzilla:
#233471)

Filter out the NEEDS_RECOVERY feature flag when writing out the backup
superblocks.  This avoids e2fsck from concluding that a full
filesystem check is required before backing up the superblock due to
changes in the feature flags.  (Addresses Debian Bug: #454926)

Fix fsck to only treat the '#' character as a comment at the beginning
of the line in /etc/fstab.  Otherwise fstabs for the fuse filesystem
will cause fsck to issue an bogus warning message.
(Addresses Gentoo bug: #195405, Addresses Sourceforge bug: #1826147)

Format control characters and characters with the high eighth bit set
when printing the contents of the blkid cache, to prevent filesystems
with garbage labels from sending escape sequences to the user's screen
that might, for example place it in graphics mode.  (Addresses Ubuntu
Bug: #78087)

Fix sign-extension problem on 64-bit systems in in the com_err
library.  (Addresses Sourceforge Bug: #1809658)

Avoid division by zero error when probing an invalid FAT filesystem in
the blkid library.  (Addresses Sourceforge Bug: #1831627)

Update Dutch, Polish, and Vietnamese translations from the Translation
Project.  Remove the Rwandan translation upon advice of the
Translation Project.

Programmer's Notes:
-------------------

Fix the libss "make check" regression test so that it works if the
current directory is not in the user's path or if the libss shared
library is not installed.  (Addresses Sourceforge Bug: #1848974)

Fixed spelling mistakes, typos, and otherwise clarified man pages.
(Addresses Debian Bugs: #444883, #441872)

Fixed various Debian packaging issues --- see debian/changelog for
details.  (Addresses Debian Bugs: #437720, #451172, #458017)

Fix build failure on non-Linux/non-Hurd/non-Masix systems.
(Addresses Sourceforge Bug: #1859778)

Fix Hurd portability issues.  (Addresses Debian Bug: #437720)


E2fsprogs 1.40.3 (December 5, 2007)
===================================

Fix a potential security vulnerability where an untrusted filesystem
can be corrupted in such a way that a program using libext2fs will
allocate a buffer which is far too small.  This can lead to either a
crash or potentially a heap-based buffer overflow crash.  No known
exploits exist, but main concern is where an untrusted user who
possesses privileged access in a guest Xen environment could corrupt a
filesystem which is then accessed by the pygrub program, running as
root in the dom0 host environment, thus allowing the untrusted user to
gain privileged access in the host OS.  Thanks to the McAfee AVERT
Research group for reporting this issue.  (Addresses CVE-2007-5497.)

Fix hueristics in blkid which could cause a disk without partitions to
be incorrectly skipped when a loopback device is present.  (Addresses
Red Hat Bugzilla #400321.)

Fix e2image so that in raw mode it does not create an image file which
is one byte too large.

Change mke2fs's usage message so it recommends the preferred -E option
instead of the deprecated -R option.

Enhance the blkid library so it will recognize squashfs filesystems.
(Addresses Red Hat Bugzilla #305151.)

Enhance e2fsck so it will force the backup superblocks to be backed up
if the filesystem is consistent and key constants have been changed
(i.e., by an on-line resize) or by e2fsck in the course of its
operations.

Enhance blkid's detection of FAT filesystems; so that USB disks with
only a single bootable partition will not get missed.

E2fsck will no longer mark a filesystem as invalid if it has time
errors (i.e., if superblock mount time or last write time is in the
future) and the user refuses to fix the problem.

The Ubuntu init scripts don't properly set the system time correctly
from hardware clock if the hardware clock is configured to tick local
time instead of GMT time.  Work around this as best as we can by
providing an option, buggy_init_scripts, in /etc/e2fsck.conf which can
be set on Ubuntu systems.  (Addresses Debian Bug #441093, and Ubuntu
Bug #131201.)

Fix fsck to ignore /etc/fstab entries for bind mounts.  (Addresses Red
Hat Bugzilla #151533.)

Fix e2fsck so that if the superblock is corrupt, but still looks
vaguely like an ext2/3/4 superblock, that it automatically tries to
fall back to the backup superblock, instead of failing with a hard
error.

Make the e2fsprogs program more robust so that they will not crash
when opening a corrupt filesystem where s_inode_size is zero.

Change e2fsck so it uses sscanf() instead of atoi() so it non-numeric
arguments are detected as such and the parse error is reported to the
user.   (Addresses Debian Bug #435381.)

Change e2fsck so it will not complain if a file has blocks reallocated
up to the next multiple of a system's page size.

Fix bug in ext2fs_check_desc() which will cause e2fsck to complain
about (valid) filesystems where the inode table extends to the last
block of the block group.  (Addresses Red Hat Bugzilla #214765.)

Fix a bug in ext2fs_initialize() which causes mke2fs to fail while
allocating inode tables for some relatively rare odd disk sizes.
(Addresses Red Hat Bugzilla #241767.)

Add Catalan translation and update Dutch and Swedish translations
from the Translation Project.

Fix big-endian byte-swapping bug in ext2fs_swap_inode_full().  We
still had an issue when trying to figure out whether we need to
byte-swap fast symlinks that contained extended attributes.

Fixed spelling mistakes, typos, and otherwise clarified man pages.
(Addresses SourceForge Bug #1821333.)


Programmer's Notes:
-------------------

Fix mke2fs tests to avoid needing any significant ^M (CR) characters

Add "make check" to the RPM spec file

Fix "make install" and 'make unstall" in misc/Makefile.in so that it
works correctly when the prefix is not the root directory.

Fix the resize2fs tests, r_move_itable and r_resize_inode, so they
clena up after themselves by deleting the test.img temporary file
after completing the test.

Fixed a corner case bug ext2fs_unlink() when trying to delete the
first directory entry in a directory block and the last directory
entry in the previous directory block is not in use.  Fortunately
ext2fs_unlink() is only used by debugfs and e2fsck, and in e2fsck in
places where it is extremely unlikely to run into this corner case.

Fix missing dependency which would cuase parallel builds to fail.
(Addresses Sourceforge Bug #1842331.)

Fix a build error on newer gcc caused by lib/ext2fs/ismounted.c
calling open(O_CREATE) with a missing mode parameter.

Fix the test_ss.c in lib/ss so it can be used as an example
application program for the library as well as a regression test
suite.

Fix ext2fs_dblist_dir_iterate() so that error codes and abort codes
are properly passed back up through the call stack.

E2fsprogs 1.40.2 (July 12, 2007)
================================

A recent change to e2fsck_add_dir_info() to use tdb files to check
filesystems with a very large number of filesystems had a typo which
caused us to resize the wrong data structure.  This would cause a
array overrun leading to malloc pointer corruptions and segfaults.
Since we normally can very accurately predict how big the the dirinfo
array needs to be, this bug only got triggered on very badly corrupted
filesystems.

Fix a bug in e2fsck which caused it to incorrectly salvange
directories when the last entry's rec_len is bogusly too big.  This
resulted in a nonsense filesystem corruption to be reported, and
required a second run of e2fsck to fully fix up the directory.

Update tune2fs man page to include more discussion of reserved blocks
(Addresses Launchpad bug #47817)

Update Turkish, Polish, Dutch, and Vietnamese PO files from the
Translation Project
    

E2fsprogs 1.40.1 (July 7, 2007)
===============================

Fix bug which could cause libblkid to loop forever.  When revalidating
a partition where there is obsolete information in /etc/blkid.tab, we
end up freeing a the type tag without clearing dev->bid_type, causing
blkid_verify() to loop forever.  (Addresses Debian Bug: #432052)
    
The Turkish translation has a bug in it where it has the translation
of "E@e '%Dn' in %p (%i)" to "E@E".  This causes @E to be expanded at
@E, recursively, forever, until the stack fills up and e2fsck core
dumps.  We fix this by making e2fsck stop @-expansions after a
recursive depth of 10, which is far more than we need.
(Addresses Sourceforge Bug: #1646081)
    
Compile the default mke2fs.conf into mke2fs program.  People are
getting surprised by mke2fs creating filesystems with different
defaults than earlier versions of mke2fs if mke2fs.conf is not
present.  So we now create a built in version of mke2fs.conf file
which is used by mke2fs if the /etc/mke2fs.conf is not present.
(Addresses SourceforgeBug: #1745818)

Improve the config/parse_types.sh helper script.  Fix a potential
security problem if e2fsprogs is built as root (as Gentoo does!).  In
addition fix the script and how it is called from the configure script
so that it does the right thing when cross-compiling.  (Fixes Gentoo
bug: #146903)
    
Update Vietnamese, French, and Dutch PO files from the Translation
Project.  Also created a new e2fsprogs.pot file for translator.
    
Fix bogus strip permission errors when building under Debian.  When
building the e2fsprogs dpkg's, the dh_strip command emits a large
number of error messages caused by the permissions not being right.
So run dh_fixperms before running dh_strip.

Programmer's Notes:
-------------------

Add new function: profile_set_default().  This function sets the value
of the pseudo file "<default>".  If the file "<default>" had
previously been passed to profile_init(), then def_string parameter
will be parsed and used as the profile information for the "<default>"
file.
    
Fix mk_cmds's error reporting so that it is unambiguous that it is the
mk_cmds script which is generating the error.  (Obviates Gentoo patch:
e2fsprogs-1.32-mk_cmds-cosmetic.patch)
    
Fix the test suite to use LC_ALL instead of LANG.  LC_ALL is the "high
priority" environment variable that overrides all others, where as
LANG is the lowest priorty environment variable.  If LC_ALL is set, it
doesn't matter whether LANG, LANGUAGE, LC_COLLATE, LC_MESSAGES, and
the all the rest are set.  This will assure that the locale when
running the test suites is the "C" locale.  (Obviates Gentoo patch:
e2fsprogs-1.38-tests-locale.patch)
    

E2fsprogs 1.40 (June 29, 2007)
==============================

Fix divide by zero error in blkid's NTFS probing logic.

Add new blkid -g option which causes the blkid cache to be garbage
collected.

Fix a bug in libblkid which could cause the internal field bid_type to
become corrupted.  Fortunately bid_type isn't used much, and bid_label
and bid_uuid is only used by debugging code, so the impact of this bug
was very minor.

Mke2fs will now store the RAID stride value when a filesystem is
created with a requested RAID stride, and then use it automatically in
resize2fs.

Mke2fs has a sanity check added to make sure (inode_size * num_inodes)
isn't too big.  In some cases Lustre users have tried specifying an
inode size of 4096 bytes, while keeping an inode ratio of one inode
per 4096 bytes.  

Improve sanity check in e2fsck's algorithm for finding a backup
superblock, so that it won't accidentally find a superblock that was
located in the journal, and then later reject it as being not a valid
backup superblock.

Fix e2fsck get_size logic so that it will work with the Linux floppy
driver.  The Linux floppy driver is a bit different from the other
block device drivers, in that if the device has been opened with
O_EXCL, it disallows another open(), even if the second open() does
not have the O_EXCL flag.  (Addresses Debian Bug: #410569)

Fix error checking of badblock's last-block and start-block arguments.
(Addresses Debian Bug: #416477)

Fix e2fsck so that it doesn't overwrite the backup superblocks when
recovering a journal until the master superblock has been confirmed as
being sane.

Change the blkid library to be much more paranoid about concluding
that a partition contains an NTFS filesystem, and fetch the UUID and
LABEL information from NTFS filesystems.  (Addresses Launchpad Bug:
#110138)

Factor out the code which sets the default journal size and move it
into libext2fs.

Enhance e2fsck so it will recreate the ext3 journal if the original
journal inode was cleared to due it being corrupt after finishing the
filesystem check.

Fix e2fsck so that it updates the journal inode if it is corrupted and
the backup journal information from the superblock was successfully
used to recover the filesystem.

Fix e2fsck so that it checks all of the blocks in the journal inode
for validity.  The original code only checked the direct blocks to
make sure the journal inode was sane.  Unfortunately, if some or all
of the indirect or doubly indirect blocks were corrupted, this would
not be caught.

Add support in blkid to detect LUKS encrypted partitions.

Add extra sanity checks for extended attributes in the case where the
size is zero but the offset is very large.

Fix byte-swapping issues for large inodes in ext2fs_read_inode_full()
and ext2fs_get_next_inode_full().

Clarify the copyright licenses used by the various libraries in
the top-level COPYING  file (Red Hat Bugzilla: 166058)

Make mke2fs's defaults when /etc/mke2fs.conf doesn't exist more sane.

Fix mke2fs and debugfs to support large (> 16 bit) uid's and gid's.

Remove check in e2fsck which requires EA's in inodes to be sorted;
they don't need to be sorted, and e2fsck was previously wrongly
clearing unsorted EA's stored in the inode structure.

Allow mke2fs or tune2fs to create a substantially larger journal (up
to 10,240,000 blocks).

Fix MD superblock detection, and make sure the correct UUID is
reported from the MD superblock.

Fix a signed vs. unsigned bug in debugfs.

Enhance debugfs's date parser so that it accepts integer values.

Fix e2fsck's pass1c accounting so it doesn't terminate too early if a
file with multiply claimed blocks is hard linked. or not at all if the
root directory contains shared blocks

Enhance debugfs so it can modify the block group descriptors using the
command set_block_group_descriptor.

Improve e2fsck's reporting of I/O errors so it's clearer what it was
trying to do when an error happens

Fix a bug in in how e2fsprogs byte swaps inodes containing fast
symlinks that have extended attributes.  (Addresses Red Hat Bugzilla:
#232663 and LTC Bugzilla: #27634)

Fix potential file descriptor leak in ext2fs_get_device_size() in an
error case.

Add libreadline.so.5 support to libss.

Impove badblocks -n/-w exclusive usage message.

Fix dump_unused segfault in debugfs when a filesystem is not open

Fix memory leak in blkid library.  (Addresses Debian Bug: #413661)

Allow the debugfs lcd command to work w/o a filesystem being open.
(Addresses LTC Bugzilla #27513)

Fix e2fsck to clear i_size for special devices with a bogus i_blocks
field on the first pass.

Fix e2fsck to set the file type of the '..' entry when connecting
a directory to lost+found.  (Addresses Lustre Bug: #11645)

Enhance e2fsck to recover directories whose modes field were corrupted
to look like special files.  This is probably only useful in
artificial test cases, but it will be useful if we ever do the "inodes
in directory" idea for ext4.

Allow debugfs to dump (and rdump) > 2GB files.  (Addresses Debian Bug:
#412614)

Fix resize2fs parsing of size parameter (in sector units).  This was
actually a bug in libe2p's parse_num_blocks() function.  When handling
the 's' suffix, it was ignoring the blocksize information passed in
from the caller and always interpreting the number in terms of a 1k
blocksize.  (Addresses Debian Bug: #408298)

There was a floating point precision error which could cause e2fsck to
loop forever on really big filesystems with a large inode count.
(Addresses Debian Bug: #411838)

Fix memory leak in ext2fs_write_new_inode()

Add support for using a scratch files directory to reduce e2fsck's
emory utilization on really big filesystems.  This uses the TDB
library.  See the [scratch_files] section of the e2fsck.conf man page
for more details.

Fixed type-punning bug which caused dumpe2fs to crash on the Arm
platform (Addresses Debian Bug: #397044)

Add explanatory message to badblocks that -n and -w are mutually exclusive
(Addresses Debian Bug: #371869)

Allow debugfs and dumpe2fs to support fs features under development.

Add support for the new flag EXT2_FLAG_SOFTSUPP_FEATURES flag to
ext2fs_open() , which allows application to open filesystes with features
which are currently only partially supported by e2fsprogs.

Allow unix_io to support offsets greater than 2G (Addresses
SourceForge Bug: #1547922)

Fixed overflow and signed/unsigned problems caused by the number of
blocks or inodes exceeding 2**31 or being close to 2**32-1.

Add support for unsigned directory hash calculations with hints in the
superblock to fix cross-architectural portability for htree
directories with filenames where the high 8th bit is set.  (Addresses
Debian: #389772)

Fix resize2fs so that it gives user-intelligible error messages if the
filesystem or the kernel does not support on-line resizing.
(Addresses Debian Bug: #380548)

Require mke2fs -F -F for really dangerous operations, since -F is
needed for less dangerous operations such as creating filesystems
images in regular files, or creating filesystems on whole block
devices.  These relatively innocuous usages should NOT be confused
with running mke2fs on an apparently-mounted or in-use filesystem.

Allow the default inode size to be specified into the mke2fs.conf
file.

Make the smallest default journal size is big enough so that on-line
resizing should always work.

Fix silly spelling error in e2fsck.  (Addresses SourceForge bug:
#1531372)

Fix debugfs coredump when lsdel is run without an open filesystem
(Addresses Debian Bug: #378335)

Fix debugfs display bug us that bytes that have the high bit set are
displayed as "ec" instead of "ffffffec".

Add support in lsattr so it will display the EXT4_EXTENTS_FL flag.

Device mapper scanning wasn't working in the blkid library because the
pathnames had an extra "/dev" when they were being probed.

Add GFS/GFS2 support to the blkid library.

Fix blkid support of empty FAT filesystem labels.

Avoid recursing forever (or for a long time) when the blkid library
searches for a device and there are symlinks to directories in /dev.

Avoid unaligned halfword access in blkid when accessing FAT
superblocks, as this will cause Sparc/Solaris systems to throw a
SIGBUS error.

The latest devmapper libraries requires pthreads, add -lpthreads to
the static link libraries for e2fsck.static if devmapper is enabled.
(Addresses Debian bug: #388718)

Improve the (non-installed, for experts only) findsuper program by
printing the uuid and label from the superblocks, as well as the
starting and ending offsets of the filesystem given the information in
the superblock.  Omit by default printing superblocks that are likely
found in located in an ext3 journal unless an explicit -j option is
given.

Updated Spanish, French and Dutch translations and added Catalan
translation.  (Addresses Debian bug: #411562)

Use FreeBSD's DIOCGMEDIASIZE and DIOCGDINFO ioctls if available when
determining a partition's size, since binary searching to determine
the device doesn't work on FreeBSD.

Documentation about UUID's is available in enough places, and it's
awkward to deal with debian-legal's insanities.  So I'm caving in the
"more-lunatic-than-RMS" wing of Debian by removing RFC-4122 so we
don't have do the dfsg tarball.  Also remove the rule that only tried
to install RFC-4122 on Ubuntu, since Ubuntu seems to want to fetch
e2fsprogs exclusively from Debian.  (Addresses Debian Bug: #407107)

Fix the info-dir line so that the menu name does not contain a .info
prefix.  First of all, it's ugly, secondly, it causes the install-info
command to fail to remove the com_err info file from the
/usr/share/info/dir file when the comerr-dev package is removed and
purged.  (Addresses Debian Bug: #401711)

Fixed spelling mistakes, typos, and otherwise clarified man pages.
(Addresses Debian Bug: #369761, #373004, #379695)

Fixed various Debian packaging issues --- see debian/changelog for
details.  (Addresses Debian Bugs #389554, #390664, #413208, #419605,
#408352, #415560, #399155)


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

E2fsck now supports the %It expansion when printing a problem report.
It will print the type of the inode in the problem context.

Fix misc/Makefile.in so that it builds even if e2fsck hasn't been built yet
(Addresses Sourceforge Bug: #1565561)

Remove unused variables and other lint/gcc -Wall cleanups

Add check to ext2fs_get_device_size() so it will return EFBIG for for
filesystems contained in regular files where the filesystem image size
is returned by stat64().

Set local environment variables to C so mk_cmds and compile_et always
work.  (Addresses SourceForge Bug: #1532177)

Added the 64-bit byte swapping function ext2fs_swab64().

Added two new helper functions to prevent 2**31/2**32-1 overflow
problems: ext2fs_div_ceil() and e2p_percent().

Create new ext2fs library inline functions ext2fs_group_first_block()
and ext2fs_group_last_block() in order to calculate the starting and
ending blocks in a block group.

Create the generated files read-only to remind developers not to edit them.

Add support for autoconf 2.60 (with backwards compatibility for older
versions of autoconf).

Added an "make rpm" target to top-level Makefile

Added various FreeBSD portability fixes.

Exclude mercurial files from the RPM build tree to speed up copy/build.

Use root_sysconfdir to define the locations of mke2fs.conf and
e2fsck.conf instead of using a hard-coded /etc pathname.

Prevent e2fsck.h and ext2_ext_attr.h from getting included multiple times.

Fixed "make clean" in blkid's Makefile.in file from removing tst_*.c files.

If diff -u is supported, use it to report test failures.

Updates/improvements to RPM spec file

Add on-disk format definitions for the following new features:
EXT4_FEATURE_RO_COMPAT_HUGE_FILE, EXT4_FEATURE_RO_COMPAT_GDT_CSUM,
EXT4_FEATURE_RO_COMPAT_DIR_NLINK, EXT4_FEATURE_INCOMPAT_64BIT,
EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE

Add a new make target "checked-failed" in the tests directory which
reruns any failed tests

Update draft-leach-uuids-guids-01.txt with rfc4122.txt

Fix miscellaneous bugs reported by Coverity: Dead code, potential nul
pointer dereferences, memory leaks, etc.  None were security-criticial
problems.

Fix up usage and decrement error messages in the test_icount program

Add debugging code to the com_err library; if the environment variable
COMERR_DEBUG is set to 1, print out debugging messages as error tables
are added and removed from the com_err library.  If the
COMERR_DEBUG_FILE environment variable is set (and the process is not
setuid) the debugging messages may be redirected to a file.

Change all of the e2fsprogs programs to use the newer add_error_table()
and remove_error_table() interfaces instead of the much older
initialize_*_error_table() function.

Add TDB support into the ext2fs library.  This allows us to have a
guaranteed library we can count on always being present so we can
store data in an on-disk database.

Add support for using TDB to store the icount data, so we don't run out
of memory when checking really large filesystems.

Change the regression test suite so that it skips empty test directories.

Define the l_i_iversion field in ext2_inode.  The l_i_version field is
now defined from the old l_i_reserved1 field in the ext2 inode.  This
field will be used to store high 32 bits of the 64-bit inode version
number.

Add Makefile production rule for e2fsprogs.spec in case it gets
deleted.

Add new function profile_get_uint() to allow for a clean way to fetch
unsigned integers from the context.

Add test to make sure the ext2 superblock structure is 1024 bytes.

Fix typo in name of f_dup4 regression test

Add new function blkid_gc_cache() which performs a garbage collection
pass on the /etc/blkid.tab file.

The ext2fs_open() function now sets EXT2_FLAG_MASTER_SB_ONLY.  In
general, only e2fsck (after the filesystem is clean), tune2fs, and
resize2fs should change the backup superblocks by default.  Most
callers of ext2fs_open() should not be touching any superblock fields
which require the backups to be touched.

Add new function to libext2fs, ext2fs_default_journal_size(), which
returns the default journal size.


E2fsprogs 1.39 (May 29, 2006) 
=============================

Fix 32-bit cleanliness in e2fsprogs so that we can support filesystems
between 2**31 and 2**32 blocks.

Change mke2fs to use /etc/mke2fs.conf as a configuration file to
configure the filesystem features, blocksize, and inode_ratio for
different filesystem types.

Mke2fs will now create filesystems hash trees and on-line resizing
enabled by default, based on the new /etc/mke2fs.conf file.

The e2fsprogs tools (resize2fs, e2fsck, mke2fs) will open the
filesystem device node in exclusive mode to prevent accidents by
system administrators.  In the case of resize2fs and mke2fs, it will
only use exclusive mode if the filesystem is not mounted.

Fixed a bug in mke2fs which caused it to to fail when creating the
resize inode for large filesystems.  (Addresses Debian Bug #346580)

When allocating space for the RAID filesystems with the stride
parameter, mke2fs will now place each portion of the group's inode
table right up after the superblock (if present) in order to minimize
fragmentation of the freespace.

Speed up mke2fs and e2fsck by writing inode and block bitmaps more
efficiently by writing the inode and block bitmaps in one pass, thus
reducing the number of disk seeks required.

Add support for on-line resizing to resize2fs.

Fix blkid library so that logic to determine whether or not a device's
cached information in /etc/blkid.tab needs to be verified or not
doesn't get confused by a system clock which is insane (for example,
if the battery is dead on a Macintosh running PPC Linux.  (Addresses
Red Hat Bug: #182188)

The blkid library will now store the UUID of the external journal used
by ext3 filesystems, so that in the future, the userspace mount binary
can use this to find the location of the external journal and pass
this information to the kernel.

E2fsck will now consult a configuration file, /etc/e2fsck.conf to
control how various options should be handled.  See the e2fsck.conf
man page for more details.   (Addresses Debian Bug: #150295)

E2fsck now prints an explanatory message when delaying a filesystem
check when the system is running on battery.  (Addresses Debian Bug:
#350306)

E2fsck will detect if the superblock's last mount field or last write
field is in the future, and offer to fix if so.  (Addresses Debian Bug
#327580) These problems will be fixed automatically in preen mode
since Debian's boot sequence bogusly doesn't set the time correctly
until potentially very late in the bootup process, and this can cause
false positives which will cause users' systems to fail to boot.
(Addresses Debian Bugs #343662 and #343645)

E2fsck now checks to see if the superblock hint for the location of
the external journal is incorrect, and if so, offer to update it.
(Addresses Debian Bug: #355644)

Fix e2fsck from segfaulting on disconnected inodes that contain one or
more extended attributes.  (Addresses Debian Bug: #316736, #318463)

E2fsck will stop and print a warning if the user tries running a
read/write badblocks test on a read-only mounted root filesystem.

Fix a memory leak in e2fsck's error paths.  (Thanks to Michael
C. Thompson for pointing these out; they were originally found using
Coverity.)

When resizing a file containing a filesystem, resize2fs will expand or
truncate a file as necessary.  (Addresses Debian Bug: #271607)

Resize2fs will now automatically determine the RAID stride parameter that
had been used to create the filesystem, and use that for newly created
block groups.   The RAID stride parameter may also be manually specified
on the command line using the new -S option to resize2fs.

Fix mke2fs so that it correctly creates external journals on
big-endian machines (such as a S/390).  

Fix a bug in the e2p library which could cause dumpe2fs to (rarely)
fail to print out the journal or hash seed UUID.  (Thanks to Guillaume
Chambraud for pointing this out.)

Dumpe2fs will now print the size of the journal (if present).

Fix debugfs's set_inode_field command so it can properly set the frag,
fsize, uid_high, gid_high, and author fields in the inode instead of
silently failing, and so that setting the i_size actually sets i_size
correctly.

Add a new debugfs command, set_current_time, which sets fs->now so
that regression test suites can repeatedly modify the filesystem's
last_write fields.

Fix a bug in debugfs's icheck which would incorrectly report the owner
of an extended attribute block.

Fix the debugfs commands htree_dump, dx_hash, and list_dir so they print a
print a usage message when an illegal option character is given.

Fix debugfs's dump_unsued command on filesystems with a 64k blocksize
so it won't core dump.  (Addresses SourceForge bug #1424311)

Fix mklost+found so that it creates a full-sized directory on
filesystems with larger block sizes.

Fix a file descriptor leak in blkid library.

Fix a display bug in "badblocks -sv" so that the done message properly
clears the block number at the end of the test.  (Addresses Debian Bug
#322231)

Allow fractional percentages to the -m option in mke2fs and tune2fs
(Addresses Debian Bug: #80205)

Use fstat/fstat64 in getsize.c if the the target is a regular file,
instead of attempting to do a binary search.  Fix some fd leaks in
error cases.

Add support for device mapper library to the blkid library to ensure
that the "best" (i.e., leaf) device is probed by the blkid library.

Fix the blkid library so that it notices when an ext2 filesystem is
upgraded to ext3.

Improve the blkid's library VFAT/FAT detection; it now understands
labels stored in the root directory, and is more paranoid about
checking the FAT superblock values.

Fixed a fd leak in the uuid library which was causing problems for the
LVM tools.  (Addresses Debian Bug: #345832)

Add support for the reiser4 and software suspend partitions to the
blkid library.  Also add support for extract the label from iso9660
filesystems.

Fix a compile_et bug which miscount the number of error messages if
continuations are used in the .et file.

Add extra sanity checks to protect users from unusual cirucmstances
where /etc/mtab may not be sane, by checking to see if the device is
reported busy (works on Linux 2.6) kernels.  (Addresses Debian Bug
#319002)

Updated French, Dutch, Polish, and Swedish translations.  (Addresses Debian
Bug: #343149, #341911, #300871, #316604, #316782, #330789)

Fix use-after-free bug in e2fsck when finishing up the use of the
e2fsck context structure.

Fixed spelling mistakes, typos, and otherwise clarified man pages and
documentation.  (Addresses Debian Bugs: #329859, #322188, #316811,
#312515, #351268, #357951, #347295, #316040, #368392, #368393, #368394,
#368179)

Fixed various Debian packaging issues --- see debian/changelog for
details.  (Addresses Debian Bugs #317862, #320389, #290429, #310950,
#310428, #330737, #330736, #329074, #356293, #360046, #366017, #364516,
#362544, #362970)


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

Update config.guess and config.sub to latest version (2006-02-23) from
FSF.

Fix asm_types.h type conflicts on AMD 64 platforms.  (Addresses Debian
Bugs: #360661, #360317)

Fixed the Makefile so that they work correctly on newer versions of
GNU make (i.e., 3.81).

Add valgrind support to the regression test suites, and eliminate
false positives from valgrind.

Add a regression test suite for the blkid library.

Fix a fencepost error in resize2fs caught by valgrind.  

Fix compiler warnings about missing memcpy prototypes.

We no longer have the sparc assembly code in the header file any more,
so we shouldn't set _EXT2_HAVE_HAS_BITOPS_ for the sparc.  This would
break compiles on the sparc architectures when using gcc.

In the libext2fs library, add the new field fs->now which if non-zero
is used instead of the system time when setting various filesystem
fields (last modified time, last write time, etc.)

Fix gcc 4.01 complaints by adding a missing #include <string.h> to
ext2fs.h which is needed since the inline functions use memcpy().
(Addresses Sourceforge Bug #1251062)

Use BUILD_CFLAGS and BUILD_LDFLAGS instead of CFLAGS and LDFLAGS in
the build system when building files in the util directory which are
needed during the build process.  This avoids potential problems when
cross-compiling and some of the options specified in CFLAGS or LDFLAGS
are not recognized as valid by the host compiler.  (Addresses
Sourceforge Bug #1261547)

Clean up the blkid library by making the superblock and generic i/o
functions to be more generic.  Clean up interface to the probe
function, and fix memory leak.  Finallly, remove an unneeded reference
to probe.h in the lib/blkid/resolve.c

Add an ext2fs_read_bb_FILE regression test to confirm proper detection
of invalid block #'s.

The x86 asm constraints for ext2fs_{set/clear}_bit have been fixed to
indicate that the the function read/writes the memory location.

Fix various gcc -Wall complaints.

Add a dependency to make sure that the subdirectories are created
before creating all of the object files, in order to address parallel
build problem in the library Makefiles.  (Addresses Sourceforge Bug:
#1261553)

Add $(LDFLAGS) to the command line argument when generating an ELF or
Solaris shared library, to allow cross-compile and other builds that
might need to specify -L paths to needed libraries.  (Addresses
Sourceforge Bug #1261549)

Add a new feature, EXT2_FEATURE_COMPAT_LAZY_BG, which is initially
intended for testing purposes.  It allows an ext2/ext3 developer to
create very large filesystems using sparse files where most of the
block groups are not initialized and so do not require much disk
space.  Eventually it could be used as a way of speeding up mke2fs and
e2fsck for large filesystem, but that would be best done by adding an
RO_COMPAT extension to the filesystem to allow the inode table to be
lazily initialized on a per-block basis, instead of being entirely
initialized or entirely unused on a per-blockgroup basis.

Fix backwards compatibility so e2fsprogs will better compile on Linux
2.0.35 systems.

Make test scripts more robust against locale-related environment variables

Fix type warning problem with sizeof() in ext2fs_open2().

Fix type warning problem with time_t in debugfs.


E2fsprogs 1.38 (June 30, 2005)
==============================

Fix blkid's test programs (built with "make check") compile correctly
even without "configure --enable-blkid-debug".

Fix ia64 core dump bug caused by e2fsprogs running afoul of C99 strict
type aliasing rules on newer gcc compilers.  (Addresses Red Hat
Bugzilla ##161183.)

Fix com_err library to make it more compatible with recent changes
made to the com_err library in MIT Kerberos V5 version 1.4.
(Addresses Sourcefroge Bug #1150146)

General cleanup of messages printed by e2fsprogs programs for grammar,
consistency, and to make life easier for translators.  Fixed a few
strings containing English that had not been marked as needing
translations.  Removed strings that do not need to be translated, to
make life easier for translators.

Mke2fs and badblocks will take advantage of a feature in Linux 2.6 to
test to see if a device appears to be in use instead of just relying
on /proc/mounts and /etc/mtab.  (Addresses Debian Bug #308594).

Fix portability problem in the filefrag program affecting platforms
where the size of an integer is smaller than the size of a long.
(Addresses Debian Bug #309655)

Mke2fs will now use a larger journal by default for filesystems
greater than 4GB.  (128 MB instead of 32MB).

Mke2fs will refuse to create filesystems greater than 2**31-1 blocks,
unless forced.  This is to avoid signed vs. unsigned kernel bugs in
block numbers that still need to be fixed.

The blkid program has a new option which will more efficiently search
for device when it is known (or expected) that only one matching
device will be found in the system, such as when doing a lookup by
UUID.

Debian's e2fsprogs-specific initrd fragment will avoid including
unnecessary libraries into the initrd ramdisk by unsetting LD_PRELOAD
and LD_LIBRARY_PATH, and filtering out libraries found in
/etc/ld.so.preload.  (Addresses Debian Bug: #304003)

Fixed a potential portability issue in the blkid programs for
architectures where the char type is unsigned.  (Addresses Sourceforge
Bug: #1180585)

Fix a bug in filefrag so that it doesn't falsely count an extra
discontinuity when the first block found is an indirect block.
(Addresses Debian Bug #307607).

Fix blkid's recognition of cramfs filesystems, and enhance it to be
able to handle cramfs labels.

Fix debugfs's stat command to not core dump when a filesystem is not
open.

Fix e2fsck's handling of error conditions caused by the resize inode
claiming blocks that are also used by other inodes, a filesystem
corruption which was commonly caused by a bug in Fedora Core 3's
resize2fs program.

Fixed bug in filefrag which caused it to fail on non-ext2/3
filesystems.  (Addresses Debian Bug: #303509)

If the superblock last mount time indicates that the system clock may
not be accurate, then e2fsck will omit checking inodes' deletion time
field for indications of a potential corrupted orphaned inode list.
(Previously e2fsck only ommited these LOW_DTIME checks when the
superblock's last write time looked insane.)

Fixed a IA64 core dump bug in the e2p library which affected dumpe2fs.
(Addresses Debian bug #302200)

Make the blkid library more paranoid about being run from setgid
programs, and to use __secure_getenv() from libc if it is available.

Fixed spelling mistakes, typos, and otherwise clarified man pages.
(Addresses Debian Bugs: #304591, #304592, #304594, #304597, #304593
and Sourceforge Bug: #1189803)

Updated and fixed translations.

Fixed various Debian packaging issues --- see debian/changelog for
details.

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

Ext2fs_set_bit(), ext2fs_clear_bit(), and ext2fs_test_bit( have been
changed to take an unsigned int for the bit number.  Negative bit
numbers were never allowed (and didn't make any sense), so this should
be a safe change.  This is needed to allow safe use of block numbers
greater than or equal to 2**31.

The compile_et program will avoid recreating generated foo_err.c and
foo_err.h files if no changes are necessary.  The compile_et program
will also atomically replace these files to avoid a potential parallel
build race problem on SMP systems.  (Addresses Sourceforge Bug:
#1157933)

Added a new function to the blkid library, blkid_probe_all_new(),
which only probes newly added disk devices, and change
blkid_find_dev_with_tag() to use this function so that when a
requested tag is not found, devices that were previously not checked
are searched before searching all devices in the system.

Added new functions to the blkid library, blkid_dev_set_search() and
blkid_dev_has_tag().

E2fsck's problem strings can now use @m and @n as abbrevations for
"multiply-claimed" and "invalid", respectively.

The e2fsprog.pot file now has an explanation of how the @-expansion
and %-expansion works, and strings in e2fsck/problem.c which contain @
characters now have comments in e2fsprogs.pot with the @-expansion to
make life easier for translators.

Fixed missing return values in the ext2fs library which could cause it
to return random garbage in certain error conditions.

Allow the current time to be overriden via the E2FSCK_TIME environment
variable for use in regression tests.

The test scrpit driver program now exits with a non-zero status if
there any of its test that it ran failed.

Fixed problems with parabuilds on SMP systems.  (Addresses Sourceforge
Bug: #1157933)

Fixed "make check" so that it compiles correctly even when e2fsprogs'
header files have not be installed in the system include directories.
(Addresses Sourceforge Bug: #1180572)

Fixed gcc -Wall nits.


E2fsprogs 1.37 (March 21, 2005)
===============================

Add support for checking the validity of Extended Attributes stored in
inodes to e2fsck.

Add support for dumping the contents of large inodes to debugfs,
including the extended attributes stored in inodes.

Fix mke2fs, e2fsck, debugfs, and the ext2fs_mkdir function so that
when we create a new inode we make sure that the extra information in
the inode (any extra fields in a large inode and any ea-in-inode
information) is initialized correctly.  This can take place when
mke2fs creates the root and lost+found directory, when e2fsck creates
a new root inode or a new lost+found directory, and when the user uses
the debugfs write, mknod, or mkdir commands.  Otherwise, the newly
create inode could inherit garbage (or old EA information) from a
previously deleted inode.

Fixed a bug in e2fsck so it would notice if a file with an extended
attribute block was exactly 2**32 blocks, such that i_blocks wrapped
to zero.

Added support to filefrag to detect files which are using the new
experimental file extents format, and use the non-ext2 algorithm in
that case.  Fixed a bug to avoid reporting a false discontinuity if
there is one or more unallocated blocks at the beginning of a file.

Duplicated a check for noticing whether or not the number of blocks
(given a certain blocksize) is greater than 2**32 when the
BLKGETSIZE64 ioctl is not available to ext2fs_get_device_size().  This
allows mke2fs to automatically use a larger blocksize when creating a
filesystem on a very large device when run on systems that do not
support BLKGETSIZE64.

Fix the I18N build which was broken in e2fsprogs 1.36 because the
build system had been switched to treat the .gmo files as shipped
files (for backwards compatibility with systems that have older GNU
I18N tools installed), but the gen_tarball.in script was still
removing the .gmo files from the official source distribution.

Fixed various Debian packaging issues --- see debian/changelog for
details.  (Addresses Debian Bugs ##296769, #299341)

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

Added new functions to the e2p library which convert between a string
and os_type: e2p_os2string() and e2p_string2os(), and used them to
make the generated binaries more compact.

Fixed a compile-time error on Darwin systems.

Cleaned up the lib/ext2fs Makefile slightly.


E2fsprogs 1.36 (February 4, 2005)
=================================

All of the patches that were applied to Fedore Core 3's
e2fsprogs-1.35-11.2 have been integrated, although sometimes with a
lot of bug fixes first.  Users of Fedora Core 3 are strongly
encouraged to upgrade to e2fsprogs 1.36 as soon as possible.

Add support for filesystem with the online resizing via resize inode
feature.  Fixed numerous bugs from the Fedora patches.  The Fedora
patches also didn't bother to do any consistency checking on the
resize inode, or add any tests to the regression test suite.  The "-R
resize=4g" option to mke2fs was a no-op in the Fedora patches, despite
being listed in mke2fs's usage message.  All of these shortcomings
have been corrected.

E2fsck can also also fix filesystems trashed by Fedora's resize2fs
program.  In order to do this, the user must run the commands:

	debugfs -w /dev/hdXXX -R "features ^resize_inode"
        e2fsck -f /dev/hdXXX

Optionally, the ext2prepare command can be used to re-enable online
resizing after the filesystem has been fixed.

The fsck program will now accept an optional filedescriptor argument
to the -C option.  (The Fedora version of this patch would sometimes
cause fsck to ignore a parameter on fsck's command line in some rare
cases, sigh.)

Make sure e2fsprogs doesn't write garbage into the reserved portion of
large inodes.

Make sure resize2fs releases the blocks belonging to the old inode
table blocks when moving the inode table.  (Addresses Debian Bug:
#290894)

Skip the r_resize_inode test if resize2fs is not compiled (due to
configure --disable-resizer)

E2fsck now checks the summary filesystem accounting information, and
if any of the information is obviously wrong, it will force a full
filesystem check.  (Addresses Debian Bug #291571)

Fix e2fsck to not complain when the resize_inode feature is enabled,
s_reserved_gdt_blocks is zero, and there is no DIND block allocated in
the resize inode.

Fix e2fsck to note delete symlinks that contain an extended attribute
after the ext_attr feature flag has been cleared.  (Addresses Red Hat
Bugzilla #146284).

Add new utility program, copy_sparse.c, which is very useful
for dealing with large sparse files (such as e2image files).

Add support for jnl_blocks[] for debugfs's set_super_value.

Fix filefrag so that it works correctly with sparse files.

Filefrag -v will print first and last blocks.

Add interpretation of OS Creator values for FreeBSD and Lites in mke2fs
and dumpe2fs.

Add mke2fs support so that it can support filesystems larger than 4TB
automatically, by retrying with a 4k blocksize if the device size is
too big to be expressed using a 1k blocksize.  (Addresses Sourceforge
bug #1106631)

Change blkid to test for NTFS first because Windows sometimes doesn't
clear enough of the parition to confuse the probing routines into
thinking the old filesystem type is still valid.  (Addresses Debian
Bug #291990)

Add support for swap partition label and uuid's in the blkid library.

Add support to the blkid library to recognize Oracle ASM volumes.

Make blkid -t display all devices that match the specified criteria,
not just the first one, and work more consistently when the blkid
cache file is not available or set to /dev/null.  (Addresses Debian
Bug #290530 and #292425)

Badblocks will now correctly display block numbers greater than
999,999,999 in its progress display.

The tune2fs program will not allow the user from setting a ridiculous
number of reserved blocks which would cause e2fsck to assume the
superblock was corrupt.  E2fsck's standards for what is a ridiculous
number of reserved block has also been relaxed to 50% of the blocks in
the filesystem.

The blkid library will return vfat in preference to msdos, and ext3 in
preference to ext2 (if the journalling flag is set) so that mount will
do the right thing.  (Addresses Debian bug #287455)
  
Mke2fs will now use the -E option for extended options; the old -R
(raid options) option is still accepted for backwards compatibility.
Fix a double-free problem in resize2fs.  (Red Hat Bugzilla #132707)

Mke2fs will now accept a size in megabytes, gigabytes, and other units
(via "32m" or "4g" on the command line) if the user finds this more
convenient than specifying a block count.

Fix an obscure, hard-to find bug in "e2fsck -S" caused by an inode
cache conherency problem.

Debugfs now supports a new command, set_inode_field, which allows a
user to manually set a specific inode field more conveniently, as well
as set entries in the indirect block map.

Debugfs's set_super_value command has been enhanced so that the user
can set most superblock fields, including the date/time fields and
some of the more newsly added superblock fields.

E2fsprogs programs now accept an offset to be passed to the file
specifiers, via the syntax: "/tmp/test.img?offset=1024".

E2fsprogs programs will now accept blocksizes up to 65536; kernel
support on the x86 doesn't exist for now, but it can be useful on
other architectures with page sizes greater than 4k.  There are 2.6
kernel patches out there which enable this, but they are of this
writing still experimental.

The e2image command now takes the -s option which will scramble
directory entries for raw image files.

Fix a file descriptor leak in the filefrag program.

Make sure e2fsck doesn't crash when /proc/acpi/ac_adapter is not
present.

Fix bug in debugfs where kill_file would lead to errors when deleting
devices and symlinks.  (Sourceforge Bugs #954741 and #957244)

Fix bug in the blkid library when detecting the ocfs1 filesystem 

Remove obsolete EVMS 1.x and a.out DLL support.

E2fsck will attempt to recover from a journal containing illegal blocks.

Fixed two potential ordering constraint problems in e2fsck which might
cause the filesystem to be corrupted if e2fsck is interrupted during a
(extremely narrow) race window.  Thanks to Junfeng Yang from the
Stanford Metacompilation group for pointing this out.

Fixed bug in e2fsck where it would not accurately detect whether or
not the system is running on adaptor if the ACPI device representing
the AC adapter didn't correspond to the what was used on IBM
Thinkpads.

Change e2fsck to accept directories greater than 32MB.

Fix e2fsck so that a checkinterval of zero disables a time-based check
of the filesystem.

Debugfs will check the DEBUGFS_PAGER enviroment variable in preference
to the PAGER environment variable.  (Addresses Debian Bug #239547)

Tune2fs will not mark rewrite the superblock if the feature bitmasks 
are not modified.

The debugfs program will set the filetype information when creating a
link.

Add debugfs -d option to use a separate source of data blocks when
reading from an e2image file.

Add e2image -I option which allows the e2image metadata to be
installed into a filesystem.

Fixed bug in the badblocks program which caused "done" to always
appear in english even when a translation was available.  (Addresses
Debian Bug #252836)

The blkid program has a new option -o which controls the output format
of the blkid program; this is makes blkid more convenient to use in
shell scripts.

Fix a minor bug in uuid library, which was not using the full 14 bits
of clock sequence when generating UUID's.

Fix a Y8.8888K problem in the uuid library.

Logsave now creates a new session id for itself to avoid getting
killed by init whan transitioning between init levels.

Change the licensing of the UUID library to be the 3-clause BSD-style
license; this allows Apple to use the uuid library in Darwin.

Add ocfs and ocfs2 probe support into the blkid library.

Fix a memory and file descriptor leak in the blkid library.

The blkid library will revalidate the device if the system time is
earlier than last verification time of the device, since that
indicates that the system time is probably nottrustworthy.

The blkid library will override the default location of the blkid.tab
file by the BLKID_FILE environment variable, if it is available.

Change the getsize functions to use the BLKGETSIZE64 ioctl on Linux 2.6.

Add various portability fixes for lame new versions of glibc, Darwin
and GNU/KFreeBSD, as well as removing XSI:ism's.  (Addresses Debian
Bugs #239934, #264630, #269044, #255589, #289133)

Add support for Windows 9x/NT under Cygwin.

Updated and clarified various man pages.  (Addresses Debian Bugs #236383,
	#241940, #238741, #242995, #256669, #268148, #256760, #273679)

Updated and fixed translations.   (Addresses Debian bugs #244105, #262836)

Update the rpm spec files so that it works better with Fedora core 2
and RH9.

Fixed various Debian packaging issues (see debian/changelog).  In
particular, fixed the Debian initrd scripts.  (#241183, #248050,
#253595, #247775)


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

Fixed various gcc -Wall warnings.

The uuid library now has new functions uuid_unparse_upper() and
uuid_unparse_lower() which forces the case of the hex digits to be
upper case, or lower case.

The build process has been speeded up by enhancing the subst program
to update the modtime on the generated files even when the generated
file hasn't changed.

The uuid library now uses C99 stdint.h types instead of custom types.

Updated config.guess and config.sub with newer versions from the FSF.

Removed out of date .cvsignore files from the source distribution.

The ext2fs_unlink() function will return an error if both the name and
inode number are unspecified, to avoid doing something surprising
(such as unconditionally deleting the first directory entry).
Directory entries are now deleted by coalescing them with the previous
directory entry if possible, to avoid directory fragmentation.  This
is not an issue with the e2fsprogs suite, but may be a problem for
some of the users of libext2fs, such as e2tools.

Add support for version numbers of the form "1.36-rc1".

Fix build of mke2fs.static.

Add basic ext2fs library support for large (EA in inode) inodes.

The test_io mechanism can now abort after n reads or writes to a
particular block.  The block is specified by TEST_IO_BLOCK environment
variable, and the read/write count by the TEST_IO_READ_ABORT and
TEST_IO_WRITE_ABORT environment variables.  The block data is now only
dumped if the 0x10 bit is set in TEST_IO_FLAGS.

UUID_DEFINE() in the uuid library now creates a static variable, with
__attribute__ ((unused)) if we are using GCC, so that UUID_DEFINE can
be used in header files.

Add support for the install-strip and install-shlibs-strip targets, as
suggested by the GNU coding guielines.  "make install" no longer
strips the binaries which are installed.

Remove support for the --enable-old-bitops configure option which was
only for very old sparc systems.

Remove support for --enable-clear-htree; this was only needed during
the early development of the htree patch.

Use Linux-kernel-style makefile output so it is easier to see compiler
warnings.

Update gettext files to version 0.14.1.

Update to use autoconf 2.5x.

Improved support for compiling e2fsprogs under dietlibc.

Make e2fsprogs portable to Solaris and FreeBSD systems.

Add blkid_verify(), blkid_get_library_version(), and
blkid_parse_version_string() functions to the blkid library.

Add pkg-config files for e2fsprogs's libraries.

Fix "make uninstall" to so that it removes everything that is installed.

Add a configure --enable-maintainer-mode option which enables the
makefile rules to rebuild the configure script from configure.in, and
to reubuild the .gmo files in po directory.

Drop the sparc assembly bitwise operations; it's less efficient
than the GCC 3.4 compile code and triggers compiler warnings on
sparc64.  Thanks to Matthias Andree for his analysis and suggestions.
(Addresses Debian Bug #232326)


E2fsprogs 1.35 (February 28, 2004) 
==================================

E2fsck has a new -k option, which in conjunction with the -c options,
preserves the existing badblocks list.

Cleaned up e2fsck's preen-mode messages during the passes 1b, 1c, and 1d.

E2fsprogs will now deal correctly with symlinks that contain
extended attribute information, which can be created using SE Linux.
(Addresses Debian Bug #232328)
                                                                               
Remove a double longjump into an invalid stack frame bug in e2fsck.
(This was during an abort sequence, which normally worked on Linux and
caused a core dump on other operating systems.)

Fix NLS bug in e2fsck, by avoiding trying to expand an empty string
(the NLS library will replace "" with the .po header information).
 
Fix a bug in mke2fs which caused -T largefile or -T largefile4 to core
dump due to a division by zero error.  (Addresses Debian bug #207082)

Fixed a bug in e2fsck which caused it to incorrectly fix a filesystem
when reconnecting a directory requires creating a lost+found
directory.  (Addresses Debian bug #219640).

Fixed a bug where e2fsck would bomb out if a journal needed to be
replayed when using an alternate superblock.
 
E2fsck will give an extra grace period before actually forcing a check
if the laptop is running on battery.  The next time fsck runs while
the system is on the AC mains, or after the grace period is exceeded,
the filesystem will be checked.  (Addresses Debian bug #205177)

E2fsck will inform the user when there are 5 or fewer mounts before a
filesystem check will be forced.  (Addresses Debian bug #157194)

Fix e2fsck's handling of corrupted indirect blocks in the bad block.
We now correctly handle the case where there is an overlap between a
block group descriptor or a superblock and a bad block indirect block.
In the case where the indirect block is corrupted, we now suggest
"e2fsck -c".

Fix byte swap bugs in e2fsck that caused the journal backup location 
in the superblock and symlinks created by SE Linux to be cleared
by e2fsck on big-endian machines.  (Addresses Debian bug #228723)

E2fsck -c now replaces the current list of bad blocks with the ones
found by badblocks.

Fix bugs in e2fsck and tune2fs which could cause a core dump if a
non-existent LABEL or UUID specifier is to e2fsck or tune2fs.

Fix a potential bug in e2fsck which could cause it to core dump when
trying to print the location of the backup superblock.

Protect against a potential core dump in e2fsck when printing a
message about backup superblocks.

Add support for backing up the journal inode location in the
superblock.  E2fsck will automatically save the journal information in
the superblock if it is not there already, and will use it if the
journal inode appears to be corrupted.  ext2fs_add_journal_inode()
will also save the backup information, so that new filesystems created
by mke2fs and filesystems that have journals added via tune2fs will
also have journal location written to the superblock as well.
Debugfs's logdump command has been enhanced so that it can use the
journal information in the superblock.

E2fsck will now update all superblocks when moving the journal inode.
  
Shrink the size of the e2fsck executable by moving some initialized
variables to the BSS segment.

E2fsck will avoid printing the ^A and ^B characters which bracket the
progress bar when stdout and stdin are a tty device instead of a pipe
to another program.  (Addresses Debian bug #204137)

Debugfs's mkdir command will automatically expand the directory if
necessary.  (Addresses Debian Bug: #217892)
 
Fixed a bug in debugfs so that copying a file from /dev/null uses the
correct mode bits.  (Addresses Debian Bug: #217456)
 
If the environment variables DEBUFS_PAGER and PAGER are not set,
debugfs now searches for the appropriate pager to use, beginning with
/usr/bin/pager, and then falling back to 'more' and 'less'.
(Addresses Debian bug #221977)

Debugfs will now support 2.6 device numbers where the major or minor
number may be larger than 255.  (Addresses Sourceforge bug #865289)
 
Fix debugging printf in resize2fs.  (Addresses Debian Bug #271605)

Chattr now stops processing options when it sees '--'.  (Addresses
Debian bug #225188)

Fix regression tests so they work correctly when e2fsprogs is compiled
with configure --disable-htree.

Fix bug in uuid library when there is no network card and the library
is generating a time-based uuid.  The random MAC address was not
correctly generated to be a multicast address.
 
Add compile_et extensions from Heimdall that were missed the first time
around.

Fix bug in badblocks when using O_DIRECT; we need to make sure that
we're reading from an offset which is page aligned.  For read-only and
read-write tests, we try to recover after an error so that we can
continue reading on page-aligned boundaries.  (Addresses Debian Bug
#203713)
  
Badblocks now checks 64 blocks at a time instead of 16.  (Addresses
Debian bug #232240)
 
Updated and clarified various man pages.  (Addresses Debian Bug
#206845, #222606, #214920, #232406)

Updated and fixed translations.   (Addresses Debian bugs #200086, #214633)

Fixed various Debian packaging issues (see debian/changelog).

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

Fixed a build problem so that e2fsprogs would compile with the
--enable-profile option to configure selected.  (Addresses Sourceforge
bug #811408)
 
Fixed C++ problems with the ext2fs.h header.  (Addresses Red Hat
Bugzilla Bug #112448)
                                                                               
Centralize code which calculates the location of the superblock
and block group descriptors so that it is in a single library routine.

Added two new functions, ext2fs_file_open2() and
ext2fs_inode_io_intern2() which take a pointer to an inode structure.

Fix compile_et to output the correct prototype for
initialize_xxx_err_table_r() in the header file.  (Addresses Debian
bug #204332)

In the lib/et makefile, make sure com_err.info is deleted on "make clean".
  
Fix 64-bit warnings in e2fsprogs pass1b by using inttypes.h if
present.  This is for when we try stuffing an int into void * pointer.

Fix type-punning which can cause gcc 3.x to miscompile code by getting
confused about pointer aliasing.  ext2fs_getmem(), ext2fs_free_mem(),
and ext2fs_resize_mem() all now take a 'void *' instead of a 'void
**'.  The EVMS code uses an ugly union approach since we don't want to
modify the EVMS interfaces. 

Make sure all Makefiles use $(MAKE) rather than hardcoded "make", to
aid build process on systems can use invoke GNU make as "gmake".

Added regression testing for mke2fs.

Fixed gcc -Wall nitpicks.

Fixed various compiler warnings.

Add portability fixes for FreeBSD and for using fsctl under Darwin to
support ext2 ioctl's.


E2fsprogs 1.34 (July 25, 2003)
===============================

Fixed a bug introduced in E2fsprogs 1.30 which caused fsck to spin in
a tight loop while waiting for a child fsck to exit in some cases.
This burns CPU times which slows down the low-level filesystem check.

Added code to mke2fs to assure that the default block size for a
filesystem is at least as big as the sector size of the device, if it
can be determined.

Changed mke2fs and resize2fs to round the default size of a filesystem
to be an even multiple of the VM pagesize in order to avoid a Linux
kernel bug introduced when the storage of the buffer cache was moved
into the page cache.

Mke2fs will warn the user when creating a filesystem with journaling
and a blocksize greater than 4096.  (Addresses Debian bug #193773)

Fixed a bug in resize2fs which caused it to fail on filesystems with a
non-empty bad block list.  Resize2fs now discards any blocks on the
badblock list which are no longer part of the filesystem as the result
of a filesystem shrink.  (Note: this means that shrinking and then
enlarging a filesystem is no longer a reversible operation;
information about bad blocks in the part of the filesystem which is to
be chopped off will be lost.)

Changed resize2fs so the user can use prefixes to specify the units of
the new filesystem size (sectors, kilobytes, megabytes, or gigabytes),
and to make the error and informational messages explicitly display
the blocksize used by the filesystem, in order to avoid confusion.
(Addresses Debian bug: #189814)

Added a new debugfs command, dump_unused, which dumps the contents of
all unused blocks to stdout.  (Useful as an emergency try-to-find
deleted data command.)

Added a new debugfs command, imap, which prints the location of a
specified inode in the inode table.

Fixed a bug in the badblocks program which caused it to use one bit of
randomness in its non-destructive read/write test, instead of using a
full 8 bits of randomness.

Added a new option (-t) to badblocks, which allows the user to control
the test pattern(s) used when checking a disk.

The blkid probe function now more correctly detects UDF filesystems.

Fixed a bug in the blkid library which caused it to not update its
cache if a filesystem changes from having a label to not having a
label.

Fixed a bug in the blkid library wihch could avoid an infinite loop
in blkid_find_dev_with_tag() if /proc is not mounted and there the
/etc/blkid.tab file has not yet been created.

Fixed the badblocks program so that the destructive read/write test
honors the -c option, and to use O_DIRECT when possible to avoid
thrashing the system block buffer cache.

Fixed various NLS issues.
 - Added Czech and Swedish translations
 - Removed testing NYC translation
 - Fixed NLS support for message abbrevations in e2fsck
 - Remove de-utf.po, since we shouldn't have two versions using different
	charset encodings.
 - Used ngettext() (abbreivated with the macro P_(str1, str2, n)) to 
	simplify the statistics reporting in e2fsck.

Changed configure.in so that its defaults for *BSD systems no longer
build an fsck wrapper, and not to install in /usr/local by default.

Fixed some minor spelling errors/typo's in e2fsck and the configure
script.

Fixed various Debian packaging issues (see debian/changelog). 

Updated and clarified man pages.  (Addresses Debian Bug #195616)

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

Fix gcc -Wall nitpicks.

Updated gettext implementation used by e2fsprogs to 0.11.5, and enable
NLS support by default.  (Added partial workaround for gettext/Darwin
incompatibility problems.)

Added full MIT KRB5 and Himdall compaibility support to the com_err
library and the compile_et program.  (Addresses Debian bug #191900)

Added the blkid_known_fstype() function to the blkid library, which
returns true if it is passed a filesystem type which is recognized by
the blkid probing functions.

Improved the documentation for the blkid library.

Added the ext2fs_get_device_sectsize() function the the ext2fs library, which
returns the hardware sector size of a device, if it is available.

Added a dependency in the blkid library's .so file to the uuid
library, since the former uses the latter.  (Addresses Debian bug
#194094)

Added --with-diet-libc and --disable-evms to the configure script.

Fixed a minor memory leak in the badblocks program.

Fixed a portability problem in tune2fs --- not all systems have strptime().

Fixed a portability problem in debugfs with the use of getopt() more
than once.  Old-style BSD, new-style BSD, and Linux C libraries all do
things differently.

Add support Windows support to ext2fs_get_device_size().

Added (normally disabled) debugging code to the Unix I/O manager which
causes it to disable all userspace caching if the NO_IO_CACHE is
defined.

Changed the test I/O manager so it can always be linked into e2fsck,
mke2fs, and tune2fs if enabled via --enable-test-io-debug to the
configure script.  The test I/O manager will only print any debugging
information if the TEST_IO_FLAGS or TEST_IO_BLOCK environment
variables are set, which specifies which I/O operations are logged and
a block number to watch, respectively.  The log messages are sent to
stderr by default, unless a filename is specified via the
TEST_IO_LOGFILE environment variable.


E2fsprogs 1.33 (April 21, 2003)
===============================

Added a new utility program, logsave, which captures the output of a
command in a log file, even if the containing directory hasn't been
mounted yet (in which case the it saves the output in memory until it
can write out the logfile).  This is useful for capturing the
output of fsck during the boot sequence.

Fixed some portability problems that were causing problems under
the Cygwin32 environment.

Mke2fs now interprets a negative number to the -b option as a minimum
block size.

Fixed a bug in mke2fs which was incorrectly checking the argument to
the -g option if the default block size was used.  (Addresses Debian
bug #188319)

Fsck now explicitly ignores tmpfs and devpts, and it will complain if
it can not find filesystem checkers for jfs, reseirfs, and xfs.

E2fsck now updates the global free block and inode counters from the
block group specific counters quietly.  This is needed for an
experimental patch which eliminates locking the entire filesystem when
allocating blocks or inodes; if the filesystem is not unmounted
cleanly, the global counts may not be accurate.

Imported bug fixes to the EVMS plugin from the EVMS 2.0 tree.  (EVMS
2.0 is not yet supported; this only pulled in the bug fixes: fixed
possible hangs caused by bugs in calling waitpid, and not setting the
pipe to non-blocking mode; also fixed a file descriptor leak; made
sure all functions call log entry/exit functions.)

Badblocks now flushes its output file as bad blocks are discovered.

The uuid library is now more paranoid about assuming the correctness
of the /dev/random device; it mixes in a stream of bytes from
random/srandom, just in case.

Update Debian files to reflect the fact that I am now the Debian
maintainer of e2fsprogs.  Other various Debian-specific packaging
cleanups.

Move the source tarball generation functions from the top-level
makefile to the util/gen-tarball script.  

Updated the Turkish .po translation file.

Added Heimdal and MIT krb5 extensions to the com_err library to make
it more compatible with com_err libraries from those distributions.

Changed dumpe2fs to always display the superblock fields relating to
the journalling and/or directory indexing feature even if those
features are not enabled.

Updated and clarify copyright statement vis-a-vis alpha releases of
e2fsprogs.

The ss library will now try to dynamically link to the readline
library and use it if it is present in the system.  This means that
the debugfs program now has line editing and history features.  The
SS_READLINE_PATH environment variable is used to find a readline or
readline-compatible library.

E2fsck now finds most duplicate filenames (all when rebuilding all
directories via the -D option) and offers to delete or rename
duplicate filenames/directory entries.  (Addresses Debian Bug #176814).

Fix bug in e2image.  When writing out a raw image file, include data
blocks from symlinks that do not store the symlink within the inode.

Fix bug in resize2fs which incorrectly moved the block and inode
bitmaps for sparse superblock filesystems and incorrectly marked
blocks as in use.  (Addresses Debian bug #174766)
 
Added a new shared library, the blkid library, which efficiently
allows fsck, mke2fs, e2fsck, and tune2fs to be able to look up LABEL
and UUID filesystem specifiers without needing to search all of the
devices in the system.  Instead, the device is looked up in a cache
file, and then verified to make sure the blkid cache is correct.

Tune2fs and e2label will accept LABEL=xxx and UID=yyy specifiers for
the device name, using the blkid library.  (Addresses Debian bugs
#166048, #179671)

Fsck now supports backslash escapes in /etc/fstab so that \040 can be
used for spaces in device labels.

Removed 32-bit limitations for debugfs's dump command.

If the user specifies a large number of inodes, Mke2fs will
automatically adjust the number of blocks per group to find a valid
set of filesystem parameters.

Add workaround to detect broken MD devices where when some of the
underlying devices are marked read-only, writes to the MD device are
silently dropped.  E2fsck will detect if there is an attempt to run
the journal twice, and abort with an error if this is the case.
(Addresses IBM Bugzilla bug #1226)

E2fsck will print an error if more than one of the -p/-a, -n or -y
options are specified.

E2fsck will fix HTREE corruptions in preen mode, without stopping the
boot process.  This is needed because the 2.4 ext2 filesystem
accidentally had the INDEX_FL backwards compatibility code removed.

Mke2fs no longer creates filesystems with the dir_index flag set by
default; the user has to specifically request it.

Update and clarified various man pages. (Addresses Debian bugs
#173612, #175233, #175113, and #170497, #185945, #188318)

Created man page for the mk_cmds program (from the libss library).

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

Fix various gcc -Wall nits.

Fixed a lot of portability problems that caused e2fsprogs not to build
successfully under Solaris and Apple/Darwin.

Fixed a Makefile dependency to allow building e2fsprogs using parallel
make jobs.

Changes to create a subset distribution which consists only of the
et, ss, uuid, and blkid libraries.  The configure script and top-level
makefile were changed to support working with a subset distribution.

Removed EXT2_FEATURE_RO_COMPAT_BTREE_DIR mention of since it's not
actually used, and might people who are looking for
EXT2_FEATURE_COMPAT_DIR_INDEX, which is in use.

Updated debian files to fix a number of Lintian warnings.

Updated config.guess and config.sub with newer versions from the FSF.

Removed unnecessary libraries from being linked into the fsck, lsattr, 
chattr, and blkid executables.

E2fsprogs 1.32 (Nomvember 9, 2002)
==================================

Fixed a bug in the Unix I/O routines which caused needless writebacks
of clean blocks from the unix_io cache (they were erroneously marked
as being dirty, so they were getting written back to disk before
getting evicted from the disk cache).  This was harmless, but it
significantly slowed down e2fsck.

Made some other minor optimizations to the Unix I/O routines to save a
small amount of CPU time.

Updated internationalization files.


E2fsprogs 1.31 (Nomvember 8, 2002)
==================================

Update EVMS ext2fsim plugin with EVMS 1.2.  (We still support
compiling the fsim plugin with EVMS 1.0 and 1.1.)  Add better error
handling for child process that die unexpectly.  Add a hack to force
mkfs to create filesystems that won't cause problems with hardware
that has 2k or 4k minimum blocksize requirements.  Read from child
processes in non-blocking mode, so that the GUI continues to update.

Fix e2fsck so that it returns the appropriate exit code when the root
filesystem has been changed, so that system's rc scripts will be told that 
the system needs to be rebooted.

Fix a bug in ext2fs_flush/ext2fs_close; when the MASTER_SB_ONLY flag
was set, some of the descriptor blocks that should have been written
out were getting skipped.

Changed e2fsck to force out changes to the backup copies of the
superblock and block group descriptors when important changes are made
to those data structures.

Fix a bug where e2fsck could erroneously mark a filesystem as being
clean if a check of dirty filesystem is interrupted with a ^C.  (Bug
introduced in e2fsprogs 1.28.)

If journal debuging is enabled using --enable-jbd-debug, the debugging
level is now set via the E2FSCK_JBD_DEBUG environment variable.

If byteswapping support is disabled using configure --disable-swapfs,
skip the tests which depend on byte-swapping, so that "make check"
won't bomb out.

Lshattr will now display the indexed directory flag.  Also, some of
the more esoteric compression flags are supressed unless compression
support has been enabled.

Update man pages.


E2fsprogs 1.30 (October 31, 2002)
=================================

When resizing a filesystem, and inodes need to moved, resize2fs will
update the inode's ctime field, and the mtime field of the containing
directories, so that incremental backups using dump/restore will work
correctly.

In order to avoid spurious errors, e2fsck wil check the last
superblock write time to determine whether or not it can safely use
the LOW_DTIME checks to determine if there are inodes on the orphan
inode linked list that had somehow gotten disconnected.  (Addresses
Sourceforge bug #620980)

Partition in /proc/partitions that being with the string "lvm" are
considered real partitions even if they do not end with a number.

Fixed a bug in the the uuid generation function, where if /dev/urandom
is not present, but /dev/random is, and there isn't sufficient
entropy, the get_random_byte function could spin a loop forever.

E2fsck, mke2fs, etc. will now reliably notice when image files are
mounted using the loopback interface.  (Addresses Sourceforge bug
#619119)

When flushing buffers (as is done by badblocks, for example) check to
see if the BLKFLSBUF ioctl succeeds, and if so, avoid using the
FDFLUSH ioctl which causes the MD device driver which causes confusing
syslog messages about obselete ioctl messages.  (Addresses Sourceforge
bug #545832).

Debugfs's write command now checks to see if the destination filename
exists before creating it.  (Addresses Sourceforge bug #478195.)

When installing man pages, search for compressed man pages using all
commonly used compression extensions (i.e., .Z, .gz, .bz2, etc.)

Fixed a bug in fsck where multiple filesystems specified on the
command were not being checked in parallel due to a logic bug
introduced to support the FSCK_MAX_INST environment variable.

We have added a new superblock field, s_mkfs_time, which indicates
when a filesystem was created.  It is set via mke2fs, and printed out
by dumpe2fs, but is not actually touched by the kernel.

Dumpe2fs has been made more robust by not aborting if there is an
error reading the block/inode bitmaps; instead it will still print out
the location of the block/inode bitmaps and inode table.

Add support for the an alternative block group descriptor layout which
allows for on-line resizing without needing to prepare the filesystem
in advance.  (This is the incomat feature flag meta_bg.)

Add support for storing default mount options in the superblock, so
that the filesystem can be mounted with specific mount options without
needing to specify them on the mount command line or in the /etc/fstab
file.

Add support for a new inode flag, which is to be used for indicating
the top of directory hierarchies for the Orlov block allocator.

Fix e2fsck so that if it creates the lost+found directory, it does so
with the more apporpriate permissions of 0700.  Also change
mklost+found so that it also creates the directory 0700.

Fixed format bug in e2fsck if NLS is in use.
  
Add a German translation for e2fsprogs's NLS support.

Fixed e2fsck so that it more handles BAD_BLOCK_IN_INODE_TABLE even at
the beginning of the inode table.  This won't matter much, since if
there is a bad block at the beginning of the inode table, the root
directory won't be available.  But at least e2fsck won't crash in this
case.

Fixed endian problems in the htree code for e2fsck and debugfs.
  
When byte-swapping a filesystem on a PPC architecture, byte-swap the
bitmaps since the historical big-endian ext2 variant had byte-swapped
bitmaps, and the ext2fs library assumes this.  This fixes the
regression test suite on PPC machines.

Fix e2image so that it handles a bad block in the inode table
appropriately.

E2fsck now uses a more sophisticated algorithm to salvage corrupted
directories that recovers more information in the corrupted directory
block.

E2fsck now performs additional consistency checks on indexed (HTREE)
directories.

Fix bug where efsck might get confused about whether a completely
empty directory block is an empty leaf block or an interior htree
node.  This could cause e2fsck to get confused into think that a valid
indexed directory was corrupted.

E2fsck no longer creates an empty directory entry at the end of a
directory block when optimizing a directory.  This would cause some
earlier versions of the dxdir kernel code to corrupt the directory
when attempting to split a node containing an empty directory entry.

E2fsck could sometimes in rare circumstances leave the indexed flag
set after a small directory was optimized by compressing it instead of
indexing it.  (This should never happen in real life, since
directories that small wouldn't have been indexed, but better safe
than sorry.)

E2fsck now only updates the master superblock in all cases.  This
slightly shortens its run time.

Ext2ed can deal with directory entries of length 0; previously it
would get stuck in an infinite loop.

Fsck now has support for reiserfs volumes when parsing LABEL= and UUID=
specifiers.  (Sourceforge patch #613447)

Badblocks will now work correctly on read-only devices such as
CD-ROM's.  (Sourceforge patch #600451)

Updated and clarified man pages.  (Addresses Debian bug #167108)


E2fsprogs 1.29 (September 24, 2002)
===================================

Fixed a bug in e2fsck which could corrupt a directory when optimizing
it (via the -D option) or rebuiliding the hash tree index with a 1 in
512 probability, due to a fence post error.

Fixed a bug in the LVM support code which caused LABEL='xxx' not to
work correctly.

Mke2fs now enables the directory indexing flag by default.  (Since
this is a compatible feature flag, it's safe to do so.)

Tune2fs will support setting the directory indexing feature flag.  It
will automatically set up the default hash algorithm and hash seed
fields in the superblock.

If the bone-headed user enters the root filesystem twice in
/etc/fstab, the -R option which skips the root filesystem will skip
all of them.  (Addresses Debian bug #159423).  Note!  This is not a
precedent for dealing intelligently with any other kind of doubled
entry in /etc/fstab!


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

Removed perror declaration in lib/et/internal.h.  All modern systems
can be expected to define perror() these days.  Besides, the lib/et
code wasn't using perror at all anyway.  :-)


E2fsprogs 1.28 (August 31, 2002)
================================

Add support for the Hashed-Tree Directory Indexing to e2fsck.  Support
for setting the htree flag is not included yet, although it can be
manually turned on via the debugfs program.

Clarified e2fsck error message which is printed when it cannot find
sufficient contiguous block when relcating filesystem metadata.

Added support for building an EVMS plugin module for ext2/3.  This
module is substantially the same as the EVMS module shipping with EVMS
1.1, with one or two bugfixes.  E2fsprogs can also build this plugin
for use with EVMS 1.0 (which did not include the ext2 plugin module),
if the configure --enable-old-evms flag is given.

Fsck will search through EVMS volumes when trying to resolve
filesystem specifications such as LABEL=xxx or UUID=xxx.
  
Added a new utility program, /sbin/findfs, which will return
filesystem specifications such as LABEL=xxx or UUID=xxx, and prints
the device name.

Update and clarified various man pages. (addresses Debian Bug #145044,
#146437, #131350, #151990, #144621, #141938)

If there are no filesystems specified on fsck's command line, fsck now
treat that as if the -As options were given.  Previously it would
simply do nothing.  (Addresses Debian Bug #153102)

Mke2fs no longer treats a failure to be able to clear the MD signature
at the end of the filesystem as a fatal error.  (Addresses Debian Bug
#155007)

The e2p library functions (which are used by lsattr and chattr) now
double check to make sure the file is a regular file or directory
before attempting to use the ext2 ioctls.  Some device drivers
unfortunately respond to the ext2 ioctl's with unknown behaviour.
(Addresses Debian Bug #152029).

The extended attribute handling has been updated to correspond with
the latest V2 bestbits ACL code.

Fixed bug in e2fsck which caused it to not clear the dtime field when
processing truncated inodes on the orphan list.  This could cause data
loss(!) if a filesystem is rebooted before a truncate has been
committed.

E2fsck now uses red/black trees in pass1b, which removes some O(n**2)
algorithms.  This makes e2fsck much faster in the case of severely
corrupted filesystems where a large number of blocks are claimed by a
large number of inodes.  (Thanks to the 2.5 IDE device driver for
inspiring this work.)

Resize2fs has been significantly sped up when shrinking and expanding
a filesystem by a very small number of blocks (for example, when EVMS
is converting a partition to be an EVMS legacy volume).

Added a new option to e2fsck, -D, which will optimize or compress all
of the directories in the filesystem.

E2fsck now catches SIGINT and SIGTERM to make sure it will can
properly clean up and only exit at safe points.  Fsck will pass
SIGINT/SIGTERM to its child processes, and wait until they have all
exited before it exits.

The uuid parsing code in the uuid library now properly complains when
an illegally formated uuid is presented to it.  (Addresses Debian bug
#152891)

Restrict use of the 2.4 setrlimit ABI f*ckup to kernels between 2.4.10
and 2.4.17, since the workaround can cause problems when using a 2.4
kernel with an old version of glibc built with the 2.2 headers.

Fixed a bug in mke2fs where it wasn't properly clearing the initial
superblock used by other filesystems.  (Addresses Debian bug #147256.)

Added support for the synchronous directory feature written by Andrew
Morton.

The debugfs program can delete directories using the rmdir command.

Add support for 8k and 16k filesystems (for systems with page sizes
that are greater or equal to 8k or 16k, respectively).  Note that
these filesystems can not be mounted on x86 systems, or other systems
with only 4k page sizes, due to limitations in the current Linux VM
code.

Resize2fs requires that the filesystem state be valid and have no
errors; otherwise, e2fsck -f must be run first.  (Previously it simply
required that the last fsck time be greater than the last mount time.)

Configure now defaults the man pages directory to /usr/share/man on
Linux systems.

E2fsck now offers to truncate inodes which contain too many blocks (so
that i_blocks would overflow.  Also fixed handling of large sparse
files.

E2fsck now more completely checks for symlink validity, including
requiring NULL termination and length checks.

E2fsck will offer to try forcing a disk write to remap a bad block
after finding a read error when reading a filesystem metadata block.

Fixed a bug in debugfs which caused the -b and -s options to crash
debugfs, as well as breaking the testb, setb, and clearb functions.

Added a bmap command to debugfs which calculates the logical to
physical block mapping for a particular inode.

Fixed a bug in code which checked to see if a device was mounted which
sometimes (rarely) failed in the case of a plain file.

Fixed a bug in resize2fs where when it reported an error, it would
print a message erroneously indicating that the filesystem had been
resized before it aborted.

When resizing a plain file which is smaller than the requested size,
resize2fs will attempt to extended the file so that programs like
e2fsck will not complain that the file is too small.

Resize2fs will print the actual new size of the filesystem when it is
finished resizing.

Fixed a bug in debugfs where "ls -l" would report incorrectl file type
information on big-endian systems.


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

Fixed collisions with C++ reserved words.

Added portability fixes for building e2fsprogs on the HURD and AIX.

Added the ext2ed program for creation of test cases.  (ext2ed has many
limitations and bugs which make it unsuitable for production use.)

The ext2fs_read_dir_block2 and ext2fs_write_dir_block now take a new
flag, EXT2_DIRBLOCK_V2_STRUCT, which will will reverse when the
name_len field is byte swampped on big-endian machines, since in the
V2 structure, name_len is a char field which is doesn't need to be
byte swapped --- except if an old-style kernel had byte-swapped the
name_len field as part of the V1 structure.
  

E2fsprogs 1.27 (March 8, 2002)
==============================

The warning messages for mke2fs now go to standard error.

Fixed to make sure "make check" runs all of the test programs with
LD_LIBRARY_PATH set, so that we test the libraries in the build tree.

The mke2fs program checks the boot sector for the BSD disk label, and
avoids erasing it if it is there.

Fixed a bug in e2fsck which caused it to core dump if the journal
inode was missing when it was supposed to be there.

E2fsck now prints ranges in pass 5 when printing deltas for the block
and inode bitmaps.

Debugfs's "ls -l" command now will print out the file type information
in the directory entry.

Create man pages and hard links for fsck.ext3 and mkfs.ext3.  If
mke2fs is invoked as mkfs.ext3, create the filesystem with a journal.

Debugfs can now examine the experimental directory indexing
information.

Fixed bug in debugfs which caused it to core dump if modify_inode is
called without an open filesystem.

The debugfs lsdel command now runs its output through a pager first.

When installing manual pages, remove the compressed manual pages first.

Synchronized with Debian's packaging information for e2fsprogs-1.26-1.

Fix the 2.4 resource limitation workaround introduced in 1.26 which
actually broke things on mips32, sparc32, and Alpha platforms.

Updated the I18N code so that calls to setlocate(LC_CTYPE, 0) are made
(which is required by the newer libintl libraries).

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

Fixed various gcc -Wall complaints.

Fixed a few memory leaks in the e2fsck journaling code, and in the
ismounted code checking for a swap device.

Add new inode I/O abstraction interface which exports an inode as
an I/O object.
  
Exported ext2_file_flush as a public interface.
  
In ext2_file_write, we now mark the buffer void * argument as a const, since ext2_file_write doesn't modify the buffer.

Lots of small random portability fixes to make e2fsprogs build under
AIX --- even without the 5L compatibility toolkit, and even using the
uber-crippled AIX native C compiler.


E2fsprogs 1.26 (February 3, 2002)
=================================

Dumpe2fs will keep going now if the bad block inode can't be read.
(Previously it stopped with a fatal error.)

E2fsck will now give an opportunity to run the journal even if the
recovery flag is not set.  This is the default behaviour if e2fsck is
using a backup superblock, since the needs_recovery flag will never be
set in the backup superblock copies.

E2fsck now automatically finds the backup superblock/group descriptors
even when the primary superblock is completely destroyed for 2k and 4k
filesystems.  (Previously it just guessed/assumed that we were dealing
with a 1k filesystem in that case, and users had to manually specify
the backup superblock number.)

Fixed a bug in e2fsck where it dereferences a null pointer when there
is a problem opening a filesystem in preen mode.

E2fsck now handles external journals correctly; previously it trashed
the external journal device if the journal needed to be replayed.

Work around ulimit incompatibility problem caused by recent 2.4
kernels; the unix IO module will automatically try to set any resource
limits to be infinite on startup.

Fixed a bug in e2fsck where it wasn't allocating a new block or inode
bitmap if it wasn't present and the blocksize was 2k or 4k.
 (Addresses Debian Bug #116975)

E2fsck will check and fix botched ext3 V1 to V2 superblock updates by
clearing the new V2 fields if they do not make sense or if the ext3
superblock is version 1 superblock.

E2fsck will automatically relocate the ext3 journal from a visible
file (i.e., /.journal) to an hidden inode if the filesystem has been
opened read/write.  This allows the users to add a journal while the
filesystem is mounted, but the next time the system is rebooted, the
journal file will disappear.  This avoids problems with backups,
stupid operators with superuser bits, etc.

Fix a bug in fsck where it would not support a filesystem type of
"auto" if the device was specified in terms of LABEL=xxx or UUID=xxx.

Fsck now supports fstab entries of the form "ext3,ext2".  It will also
automatically identify reiserfs filesystems.

The number of processes spawned by fsck can now be limited using the
FSCK_MAX_INST environment variable.

Fsck now searchs the LVM proc hierarchy to find logical volumes which
should be searched for  UUID and label information.

Work around a bug in 2.4.10+ kernels by trying to unset the filesize
limit if at all possible, when opening a block device.  (The filesize
limit shouldn't be applied against writes to a block device.)

In mke2fs and e2fsck, specifying the -c option twice will now do
a read/write test on the disk.  Update the man pages to encourage
using the -c option, and to discouraging running badblocks separately,
since users tend to forget to set the blocksize when running 
badblocks.

Mke2fs now automatically clears the immutable attribute on a
pre-existing .journal file left over from a previous failed attempt to
add a journal to an alreadyy-mounted filesystem.

Fixed mke2fs's exit codes to consistently indicate when the mke2fs
operation failed.

Mke2fs now creates the lost+found directory with permissions of 0700,
so that files that had previously lived in protected directory are
safe if they get dropped in lost+found and the system administrator
doesn't deal with immediately.  (Addresses Debian #bug 118443)

Mke2fs and e2fsck (and all programs that use the
ext2fs_check_if_mounted function) will now properly identify that a
device is mounted, even in cases where devfs has confused things with
multiple devices names with the same identity, or if a dim-witted
system administrator has done something stupid like creating device
file aliases in their home directory.  Also now checks for swap devices
by using /proc/swaps.  (Addresses Debian bug #106622)

Added a new option (-T) to tune2fs which sets the time a filesystem
was last checked.

Speed up e2image when creating sparse raw image files by optimizing
away excess lseek() system calls.

Fix support of large (> 2GB) files when used as a filesystem in
mke2fs, tune2fs, debugfs, and findsuper.

Debugfs's stat and icheck commands now properly deals with large (>
2GB) files.

Debugfs's set_super_value command now prints out the list of valid
superblock fields which can be set using the command.

Debugfs's rm and kill_file command now updates the superblock free block
and inode counts, thus keeping the filesystem consistent.

Debugfs's lsdel command now takes an optional argument which allows
the user to only see the most recently deleted files.

A new command (undel) was added to debugfs which automates
undeleting a deleted inode and linking it back to a directory.

Debugfs's ls command now takes a new option, -d, which lists 
deleted directory entries.

Debugfs's testb, freeb, setb, and find_free_block commands now take an
optional count argument.

Add support for a new ext2 file attribute, EXT2_NOTAIL_FL, which will
be used to signal that a particular inode should not be eligible for
tail-merging --- this is needed for programs like LILO.

The findsuper (an unreleased, uninstalled utility program) has been
improved to add extra validity checks and to add a progress meter.
(It is still an unsupported program; the officially supported way to
recover from a trashed partition table is to use gpart; findsuper is
for wizards only.  :-)

Debugfs was fixed to compile with "configure --disable-swapfs".

Cleaned up various manual pages.   (Addresses Debian bug #119624, #120171)

Added new translation file for Turkish.

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

Fix general gcc -Wall complaints.

E2fsprogs (mostly) works with the dietlibc.

The programming texinfo file has been expanded to include description
of additional libext2fs functions.  (Still not compeltely done, but a
lot of the more important functions have been documented.)

Added a umask structure to struct_ext2_filsys, which currently only
modifies the behaviour of ext2fs_mkdir(), but if we add any file
creation functions to libext2fs, we should also make sure they respect
the umask setting.

The build-rpm script was fixed to be a bit more safe.

The tests' Makefile now has a way of automating test case creation 
for e2fsck, using "make testnew".

Created a new function, ext2fs_dir_iterate2 which passes more
information to the callback function (identical to the one used by
ext2fs_dblist_dir_iterate).  The directory iterator functions take a
new flag, DIRENT_FLAG_INCLUDE_REMOVED, which will return deleted
directory entries.  If the directory entry is deleted, the callback
function will be called with the entry paraemter set to
DIRENT_DELETED_FILE.
  
Added new functions, ext2fs_inode_alloc_stats and
ext2fs_block_alloc_stats, which takes updates block/inode allocation
statistics in the bitmaps, block group descriptors, and superblock
when inodes or blocks are allocated or deallocated.


E2fsprogs 1.25 (September 20, 2001)
===================================

This is primarily a bug-fix release; no new features were added, but
there are a number of embarassing bug fixes and cleanups applied.

Fix a bug mke2fs which causes stack garbage to be written to disk when
zapping disk sectors.  (This bug could cause mke2fs to core dump for
some kernels, I suspect with security enhancement patches.)

Remove unneeded #include of <linux/config.h> which was breaking
building e2fsprogs on the Hurd.  (Addresses Debian bug #112414.)

Updated tune2fs man page to reflect the fact that adding or removing a
journal doesn't require running e2fsck.

Remove use of AC_REQUIRE from autoconf which had been used to prevent
AC_CANONICAL_HOST from being called twice; unfortunately this causes
recent autoconf to bomb out since they don't allow AC_REQUIRE to be
used outside of autoconf macros.  Fortunately, it doesn't seem to be
necessary any more, anyway.

E2fsck will now not fall back to an alternate superblock if the user
specifies the superblock location explicitly on the command-line.
This allows easier recovery from a situation where the primary
superblock and block groups are slightly corrupted, but the backup
superblocks are completely broken.  

Fix problem which caused compile_et and mk_cmds to blow up if
e2fsprogs was in a directory with a pathname that contained spaces.

We are now more paranoid about checking the entry in /etc/mtab to make
sure the filesystem is really mounted, since some broken distributions
(read: Slackware) don't initialize /etc/mtab before checking non-root
filesystems.  (Slackware also doesn't check the root filesystem
separately, and reboot if the root filesystem had changes applied to
it, which is dangerous and broken, but there's nothing I can do about
that.)

Make UUID library C++ friendly by adding appropriate extern "C"
declarations and using const in the function declarations.

Fix up the com_err texinfo file so that it can product a valid info
file (previously, it could only be used to generate paper
documentation using texinfo.tex).


E2fsprogs 1.24a (September 2, 2001)
===================================

Fix brown-paper bug in mke2fs which caused it to segfault when
printing the version string.


E2fsprogs 1.24 (August 30, 2001)
================================

Revert the BLKGETSIZE64 support, since for some distributions, this
ioctl has been used by an unofficial kernel patch to update the last
sector on the disk, and this was causing disk corruption problems as a
result.

Mke2fs is now more careful about zapping swap space signatures and
other filesystem/raid superblock magic values so that programs like
mount who try to use hueristics to determine the filesystem type of a
partition are less likely to be confused.

E2fsck will no longer complain if the the mode of EXT2_RESIZE_INO is a
regular file (since Andreas Dilger's on-line resizing tools will set
its mode bits).

Fixed some minor texinfo, man pages nits for spelling errors,
texinfo warnings, etc.  (Addresses Debian bug #110621.)

E2fsprogs program no longer print the filesystem version number
(i.e. 0.5b), since it only confuses people and doesn't serve any real
purpose.

E2fsck will once again compile under libc5, since it will supply its
own version of strnlen if necesssary.

mke2fs and tune2fs will allow the use of UUID= or LABEL= specifiers
when specifying the external journal device.  tune2fs will also search
devices looking for the externla journal debice when removing.  

E2fsprogs 1.23 (August 15, 2001)
================================

Add initial support for extended attributes (EA); e2fsck will
correctly handle a filesystem with EA's and check the EA blocks for
corruptions.

E2fsck's symlink sanity checking has been cleaned up.  It now checks
the i_size value of fast symlinks, and checks for immutable flags
being set of symlinks, etc.

E2fsck now offers to clear inodes which are special files that have a
non-zero i_blocks or i_size field.  (The i_size field check was in the
previous version of the code, but due to a bug it didn't offer to
clear the inode unless i_size and i_size_high were both non-zero.)

E2image can now create "raw" image files, which only contain the
filesystem metadata placed in a spare file so that e2fsck, dumpe2fs,
debugfs, etc., can be run directly on the raw image file.

Add support for the 64-bit block device patches.

Fixed bugs in creating external journals with a 1k blocksize.

Add initial support for external journals (so long as the external
journal only supports a single filesystem) in e2fsck.

Remove requirement for needing to run fsck on a filesystem after
removing a journal (either internal or external).

The man pages now document how to create and manage external journals.

Speed up the check of an ext3 filesystems by avoiding a needless flush
of all of the superblock and block group descriptors.

Speed up creating an internal journal using tune2fs in the case where
the filesystem has a lot blocks already allocated.

Tune2fs has been fixed to make sure that only error messages go to
stderr, and normal message go to stdout. (Addresses Debian bug #108555)

Fixed a minor bug in mke2fs; if -O none is passed to mke2fs, it will
now not set the sparse_super feature.  (Addresses Debian bug #108165)

Add support in fsck for the filesystem type "auto".

Fsck -A will not try to interpret device names for filesystems which
have a pass number is 0.  (Addresses Debian bug #106696).

Fsck prints a warning message if now valid filesystems are passed to
it.  (Addresses Debian Bug #107458.)

E2fsck now gives an explicit warning if there filesystem still has
errors at the end of the run. (Addresses Debian bug #104502)

E2fsck will set the EXT2_ERROR_FS flag if the journal superblock
reflects an error.  E2fsck will also not run the orphan list if the
filesystem contains errors, since the orphan list might be corrupted.

E2fsck now prints the number of large files when given the -v option.

Fixed minor memory leaks in e2fsck.

Some minor man pages updates. (Addresses Debian bug #30833, #108174)


E2fsprogs 1.22 (June 22, 2001)
==============================

Fixed a bug in e2fsck's handling of orphan inodes which are special
files (i.e., block/character device files, named FIFO's, etc.).

Fixed a bug accidentally introduced in e2fsprogs 1.21 which caused
tune2fs to fail at adding a journal to a mounted filesystem.

Fixed a few big-endian bugs in e2fsprogs
	* The directory block functions were accidentally reporting
		some directories as corrupted when they weren't.
	* If e2fsprogs is compiled --disable-swapfs, the C language 
		equivalents weren't being included for big-endian platforms.
		(Fixes Debian bug #101686).

Fixed a Hurd compilation problem.  (Addresses Debian bug #101361)

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

Use platform independent method of defining the BLKFLSBUF and FDFLUSH
ioctls, and allow them to be defined for non-i386 platforms.

The uuid.h header file is now protected against multiple inclusions.

E2fsprogs is now being developed using BitKeeper.  Changed the test
scripts to deal with BK's stripping CR characgters from text files,
and changed the top-level Makefile.in to avoid including BitKeeper
files when generating the source tarball.


E2fsprogs 1.21 (June 15, 2001)
==============================

Added new configure flags which allow a subset e2fsprogs to be built;
this is most useful for boot floopies, since the resulting shared
libraries and programs are slimmed down by removing features that
aren't necessary for a boot floppy.  The new flags that were added
are: --disable-swapfs, which removes support for byte swapping old
legacy PPC/68k filesystems, --disable-debugfs, which removes support
for debugfs from the libext2fs library, --disable-imager, which
removes support for the e2image program, and --disable-resizer, which
removes support for resize2fs.

E2fsck now prints the number of mounts or days elapsed since the last
check when e2fsck is forced to check an otherwise clean filesystem.

Tune2fs now prints an informative message about how often a filesystem
will be checked when adding a journal to the filesystem, to remind the
user that he/she may want to adjust those parameters using tune2fs
-c/-i.

Worked around hurd brain-damage which causes e2fsck to sometimes
believe a filesystem is the root filesystem based on device numbers
(since Hurd doesn't have dev_t's, which is arguably a POSIX.1
violation).

Fixed a bug introduced in 1.20 which caused e2fsck to abort with an
erroneous error with the -F option was specified.

Fixed a ext3 recovery bug in the revoke handling; synchronized with
ext3 0.7a.

Fixed two bugs in e2fsck's handling of dup block handling, dealing
with relatively uncommon edge cases: a directory with an indirect
block which is claimed by another file, and when the last inode in the
filesystem has blocks claimed by another file.

E2fsck now checks to see if the i_size field of a fast symlink is too
big, and offers to clear the symlink if so.

E2fsck now checks to see if i_size_high of special files is non-zero,
and offers to clear i_size_high.

Fix e2fsck's handling of incompatible journal flags so that the user
has chance to abort, and then has the option to clear out the journal
entirely.  (Addresses Debian bug #98527.)

Fixed a bug in fsck which could cause it to core dump if a mix of
standard and non-standard device names are used in /etc/fstab.
(Debian bug #100559)

Fixed a bug in debugfs which caused read errors when copying a file to
not be noticed.

The debugfs set_super_value command can now modify the s_lastcheck field.

Fixed a bug in lsattr and chattr which was accidentally introduced in
1.20 to support > 2GB files; both lsattr and chattr wasn't reading
directories correctly because the change modified the layout of struct
dirent to be incompatible with the libe2p shared library.

Cleaned up the mke2fs manual page and included a discussion about why
it's good to periodically check the filesystem even when journaling is
enabled.

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

Fix general gcc -Wall complaints.

The types needed by the ext2 header files are now provided by
lib/ext2fs/ext2_types.h, instead of include/asm/types.h.

Integers are now preferred to longs when trying to find a 32-bit type
in ext2_types.h.  Also, if linux/types.h has already been defined,
don't try to redefine the types.

Fixed make depend script so that it automatically corrects the
pathname cleanups performed by make -M, so I don't have to fix them up
by hand.

Fixed the d_loaddump test case to be more robust, and not depend on
bash'isms.

Removed debugfs's dependence on pread(), which was accidentally
intrudced in e2fsprogs 1.20

Fixed a performance bug in the libext2fs's icount routine; the size
estimate of the icount array was incorrectly being calculated.

Removed use of the badblocks compatibility functions in the e2fsprogs
programs.

Added paranoia code which protects against strange cases where /etc
isn't on the root filesystem, or if /etc/mtab doesn't exist.

The header file ext2_types.h is now installed.

Autoconf is used to determine when we are on big-endian machines,
instead of doing run-time tests, to save a few bytes of code.

The ext2fs_mark_generic_bitmap and ext2fs_unmark_generic_bitmap
functions are no longer inline functions, which saves space and
doesn't really cost any real performance.

The ext2fs library no longer depends on the e2p library.  (What need
there was of it --- namely, fsetflags, was coded in-line).

Fixed the makefile so that lib/ext2fs/ext2_types.h is generated even
when the user is stupid and tries compiling the package using "make
install" as root.

Miscellaneous code cleanups:
	* Added missing files from Makefile.in's SRCS file, so that 
		their dependencies would be properly calculated.
	* Removed redundant code
	* Fixed comments in code
	* Removed no-longer unneeded argsused #pragma.


E2fsprogs 1.20 (May 20, 2001)
=============================

Add support for replaying the ext3 journal purely in user mode,
including handling the orphaned inode list.  Used code contributed by
Andreas Dilger, with bug fixes and the orphaned inode handling done
by Theodore Ts'o.

The mke2fs and tune2fs programs can create or modify a filesystem to
include an ext3 journal.  Tune2fs also can be used to remove an ext3
journal from a filesystem.

E2fsck will now check for the existence of a linked list of orphan
inodes in the superblock, and clear those inodes before starting the
rest of the filesystem check (but after the journal playback).

E2fsck now validates the file descriptor passed to the -C option,
which saves against the completion bar getting written to an
unexpected location, such as the disk being checked.  (Debian
bug/wishlist #55220)

E2fsck will now bump the filesystem revision number from zero to one
if any of the compatibility bits are set.

Fixed a bug where a badly corrupted directory on a big endian system
could cause e2fsck to die with a bus error.  The
ext2fs_read_dir_block() and ext2fs_process_dir_block() functions in
the ext2 library now does alignment sanity checks on the rec_len field
of the directory entry before using it.

The ext2 library has been enhanced to make tune2fs safe to run on
mounted filesystems.  (Users could usually get away with using tune2fs
on mounted filesystems before, but with the advent of ext3 and
journaling, it became important to make tune2fs was *really* safe for
use even when the filesystem being modified is mounted.)  E2label is
now implemented by tune2fs using an argv[0] dispatch, so that e2label
is also now safe for use on mounted filesystems.

Added a new program, e2image, which creates a backup of critical ext2
filesystem data structures.  The generated image file can be examined
using dumpe2fs and debugfs.  In the future, e2fsck will be able to use
the image file to help recover very badly damaged filesystems.

Fixed a number of LFS bugs in e2fsck; very, very large (> 2**42) files
no longer cause e2fsck to bomb out.  Also treat files > 2GB as being
large file when deciding whether or not the filesystem has large files.

Fixed lsattr and chattr so that they work correctly on large files.
(Fixes Debian bug #72690.)

Removed limitation in get_device_size() which imposed a one terrabyte
filesystem limitation.  (Most 2.2 kernels still have a signed int
problem which cause 1 TB block device limitation.  Fortunately, the
kernel patches to fix this are much easier than fixing the 2TB
limitation in the kernel.  :-)

A max_mount_count of zero is now treated as if no mount count were
set.  (Previously, no mount count was indicated by using -1, and a
mount count of zero caused e2fsck to always be run.)

Mke2fs supports two new filesystem types largefile and largefile4.

Mke2fs now adds some randomness in s_max_mount_count so that multiple
filesystems won't be all checked at the same time under normal
operations.

Fixed bug in the progress bar printing code which could cause e2fsck
to core dump on an illegal filesystem.

Fixed bug in fsck which could allow more than one instance of e2fsck
to be printing a progress bar.  (Debian bug #65267)

Fsck using a UUID or a LABEL specifier will work even if devfs is
compiled into the kernel and not mounted.  If the pathnames in
/proc/partitions are incorrect, fsck will search /dev for the correct
device (using the new ext2fs_find_block_device library function).
Fsck now also checks the RAID devices first so that they are properly
found when they are in use.  Support has also been added to support
additional IDE disks and the DAC 960 device names.  (Debian bug #94159)

Fixed a bug in fsck which caused it not deal properly with 16
byte long filesystem labels.

Fsck's -t option has been made a lot more flexible.  The semantics for
what happens if a comma-separated list to fsck has been regularized,
and it is now possible to filter what filesystems will get checked
based what is in the filesystem's fstab entry's option field.  (Debian
bug #89483.)

The dumpe2fs program can now print out the group description
information in hex, and also prints the location of the superblock and
block group descriptor for those block groups that have them.

Mke2fs now clears the ext2 superblock before it starts creating a
filesystem, so that the superblock magic number is only written if the
filesystem creation process successfully completes.

The debugfs program's stat command now pretty-prints the blocks used
by an inode so that it's more compact and informative.

The debugfs stats command now uses the same libe2p code (which is used
by dumpe2fs) to print the superblock header information.  This is more
complete, and it avoids a bit of code duplication.

Added a new debugfs command, set_super_value (ssv) which allows the
user to set arbitrary superblock fields.

Debugfs was extended to support inode numbers in hex (by prefixing
them with 0x), and so that modify_inode can set the inode generation
number.  Also, there is now a new function command called logdump
which will dump an ext3 journal.

Fixed a bug in debugfs so that quitting out of the pager doesn't kill
debugfs.

Debugfs's dump command now stops immediately upon reporting a disk
read error.  (Fixed a bug in ext2fs_file_read library routine which
caused debugfs not to stop.)  (Debian bug #79163)

On systems with /proc/mounts (mainly Linux systems), /proc/mounts is
checked before /etc/mtab is used, since /proc/mounts is more likely to
be accurate.

Added portability fixes for Solaris and Linux/ia64.

Various manual pages were clarified and cleaned up.  (Fixed debian
bugs #63442, #67446, and #87216)


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

The e2fsck message printer now supports %Iu and %Ig, which will print
out the inode's user and group owners, respectively.

E2fsprogs now includes its own version of include/linux/ext2_fs.h, so
that no longer dependent on the system having the correct version of
the kernel header files.

Added a new function to libext2, ext2fs_find_block_device(), which
searches the system (i.e., /dev, /devfs, /devices) for a pathname to a
device given its device number.

Added a new function to libext2, ext2fs_sync_device, which centralizes
all of the places which might try to use the BLKFLSBUF or FDFLUSH
ioctls (and usually failing to define them since the system header
files don't usually do this for us, and we're trying to avoid usage of
kernel include files now).

Added new utility programs in tests/progs: random_exercise and
hold_inode.  They aren't built by default; they're useful for
exercising ext3 filesystem code.

Added a new ext2 filesystem flag, EXT2_FLAG_SUPER_ONLY, which causes
the filesystem close functions to only update the superblock, and to
not touch the block group descriptors.  Needed by tune2fs when
modifying a mounted filesystem.

Got rid of struct ext2fs_sb and replaced it with the standard struct
ext2_super_block from include/linux/ext2_fs.h.  Note: this may break
source (but not binary) compatibility of some users of the ext2
library.  Those applications should just simply do a global search and
replace of struct ext2fs_sb with struct ext2_super_block, and include
the new header file <ext2fs/ext2_fs.h> which defines it.

The ino_t type has been renamed ext2_ino_t to protect applications
that attempt to compile -D_FILE_OFFSET_BITS=64, since this
inexplicably changes ino_t(!?).  So we use ext2_ino_t to avoid an
unexpected ABI change.

The Makefiles have been reworked so that "make check" can be run from
the top-level Makefile.

Fix general gcc -Wall complaints and removed dead code.

Remove use of NOARGS, because we assume everyone does ANSI C these
days.

Added build-rpm script from sct.

New functions ext2fs_image_{inode,super,bitmap}_{read,write} added 
to support e2image.

New function ext2fs_flush_icache which must be called if the
application program modifies the inode table blocks without going
through ext2fs_write_inode() interface.

New ext2fs_check_mount_point() function, which will return the mount
point of a device if mounted.

The io_channel abstraction now has an optional interface,
io_channel_write_range, which allows specific byte ranges to be
written.  

The unix_io IO channel now supports write-through caching, so that
journal creation is more efficient.

Added x86 assembly language routines to support byte swapping, to
reduce executable size.

Fixed bug in the utility program subst so that it's possible to
replace a substitution variable with a zero-length string.

Fixed numbering e2fsck pass1 problem numbers; an extra zero had
slipped into some of the problem number.

E2fsprogs 1.19 (July 13, 2000)
==============================

Release the resize2fs program since the timeout before it could
be released under the GPL has finally expired.

Add experimental support needed for the ext2 compression patches.
This requires compiling e2fsprogs with the --enable-compression flag
to the configure script.

Added ext3 journalling support.  E2fsck will run the journal (if
necessary) by temporarily mounting the filesystem.  /sbin/fsck.ext3 is
installed as a symlink to e2fsck.  Fsck has been taught about ext3,
and treats it the same as ext2 in terms of the progress bar logic.
Dumpe2fs will display the superblock journaling information if the
filesystem has a journal.  The ext2 library will now permit opening an
ext3 filesystem with the recovery flag set.  This is necessary for
on-line dump's to work correctly, but there may be issues with this
working well since ext3 is much less agressive about syncing blocks to
the filesystem, since they're safe on the journal.

Tune2fs and e2fsck have been changed to allow the mount_count check to
be disabled by setting max_mount_count to -1.  (This was already
supported by the kernel.)

Create a symbolic link for fsck.ext3, since the e2fsprogs utilities
are used for ext3 as well.

Added internationalization support for e2fsprogs; must be enabled
by passing --enable-nls to configure.

Always use the provided ext2fs header files to insulate ourselves from
kernel version changes.  Which include files are used by e2fsprogs
have also been cleaned up to improve portability.

Limit the number of times that e2fsck updates the progress bar so that
people who are booting using a 9600 baud console don't get swampped by
too many updates.

Improved the loop detection algorithm in e2sck's pass #3 so that it is
much, much faster for large filesystems with a large number of
directories.

The memory footprint for e2fsck is now slightly smaller than before.

E2fsck now checks if special devices have a non-zero size, and offers
to clear the size field if it finds such an inode.  

E2fsck now checks if special devices have the append-only flag set,
and offers to clear the inode.

E2fsck now properly handles some "should never fail" cases during a
bitmap copy in pass5.

E2fsck now properly prints control characters in filenames as ^A .. ^Z.

E2fsck now calculates the correct location of the backup superblock in
the case of filesystem blocksizes > 1k.

Fixed a bug in e2fsck's calculation of the number of inodes_per_block
which normally didn't cause problems under most filesystem parameters,
but could cause a valid superblock to be rejected in extreme cases.
Other checks for validating superblock values were made more
stringent.

Added non-destructive write testing to the badblocks program, courtesy
of David Beattie.  The badblocks also now has an option to input the
current set of bad blocks, so that known bad blocks are skipped to
speed up the badblocks test.  There is also a persistent rescan
feature which causes badblocks to run until it has completed some
number of passes without discovering any new bad blocks.

Badblocks now checks to see if the device is mounted and refuses to do
the tests involving writing to the device if it is mounted.  Also,
badblocks now allows the number of blocks to be checked to be
defaulted to the size of the partition.

Fixed a bug in fsck which didn't allow non-root users to be able to
check filesystems if there were any LABEL= or UUID= entries in
/etc/fstab.

The Hurd doesn't support the filetype filesystem feature.  The mke2fs
program now makes sure that for the Hurd, the filestype feature is
turned off.  E2fsck will check to see if the filetype feature is
turned on for Hurd filesystems, and offer to turn off the feature.

Mke2fs now has a safety check to make sure the number of blocks do not
exceed 32 bits even on a 64 bit platform.

Really fixed a bug in fsck to allow "fsck -As" to run interactive
fsck's.  (For those people who like to do interactive fsck's in the
/etc/rc scripts!?!)

Debugfs has a few new features: the rdump command, which will do a
recursive dump of a directory and all of its contents, and the lcd
command which does a local chdir (much like the ftp command of the
same name).  In addition, the debugfs program and the open_filesystem
command now takes three new options: -b and -s, which allows the
blocksize and superblock location to be specified, and the -c option
which is used in catastrophic situations where the block group
descriptors are corrupt.  If the -c option is specified, debugfs will
skip trying to read in the block and inode bitmaps.

Debufs's lsdel command was fixed to handle bad blocks in the inode
table.

A Y2K bug in debugfs's "ls -l" handling was fixed by switching to use
4 digit years.

General improvements in error messages

  - Mke2fs prints a sane error message if the partition size is zero
	(usually because the partition table wasn't reread by the
	kernel due to the partition being busy), instead of "invalid
	argument passed to ext2 library while initializing superblock".

  - Fsck now prints more self-explanatory message if an invalid UUID=
	or LABEL= specification is passed to it.

UUID library changed to use the LGPL.

Fixed a bug in the UUID library where very rapid calls to the
time-based UUID generator could cause duplicate UUID's to be returned.
This was not a problem for e2fsprogs, but it could be a problem for
other users of the library.

Make the UUID library more robust in the face of missing or an
improper /dev/urandom or /dev/random files.

Added some random portability fixes for Solaris.

Some minor man page updates.

Fixed a memory leak in the ss library.


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

We now try to use lseek64 and open64 from the LFS if possible.

The 3rd parameter in e2p's print_flags is now a flags word, instead of
a boolean option.

The mark and unmark bitmap functions now return the previous state of
the bit that was being changed, which is useful for some speed
optimizations.

The following functions have been added to enhance the badblocks list
handling in libext2fs: ext2fs_write_bb_FILE, ext2fs_read_bb_FILE2, and
ext2fs_badblocks_equal.

The ext2 header files now have the latest journalling fields to the
superblock.

The ext2fs_mkdir function in libext2fs now properly backs out of error
conditions robustly.

Cleaned up makefiles:
  - to cleanly  compile with the -j flag.
  - so distclean removes all generated files.
  - so in case of an error while installing header files, the make aborts.

Fix test_script so that it works correctly when compiling in the
source directory.

The random UUID generation routine has been made slightly better in
the case where /dev/random doesn't exist.  (Use of randomly-based UUID
is still not recommended if /dev/random doesn't exist, however; it's
better to use the time/ethernet MAC address UUID in this case.)

Clean up the build process so it's more friendly in case of missing
directories.

The ext2fs header file can now be #include'd into C++ programs.

The e2p.h header file is now installed.

Added workaround to a gawk 3.0.5 bug in lib/ss/mk_cmds.



E2fsprogs 1.18 (November 10, 1999)
==================================

Fix a core dumping bug in e2fsck if an imagic inode is present or
(more rarely) if the filesystem is badly corrupted enough that e2fsck
has to restart pass 1 processing.  E2fsck now closes the filesystem
before freeing a large number of its data structures, so in the case
of future memory faults, at least the fixed filesystem will be fully
written out.

If a filesystem doesn't support imagic inodes, and e2fsck discovers an
imagic inode, it will offer to clear the imagic flag.

E2fsck will now offer to clear the immutable flag on special files
(device/socket/fifos) when running it in non-preen mode.

E2fsck will now set the filetype when creating /lost+found, and when
connected orphaned inodes to /lost+found.

Debugfs's ncheck and icheck commands now handles the case where there
are bad blocks in the inode table without bombing out.

The badblocks list processing code has been made more efficiently for
appending a large number of (ordered) badblocks to the badblocks list.

Some minor man page updates.

Fsck now allows interactive e2fsck's when using fsck -As (not a common
mode, but some people like to do this in boot scripts for silly reasons).

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

The internal e2fsck problem code for PR_2_SPLIT_DOT was fixed to meet
with the problem code convention.

The badblocks list regression test program has been updated to work
with previously made API name changes.

The ext2fs_free() command now uses the new badblocks API to avoid
using the compatibility layer.

Added new regression test cases; the run_e2fsck test script now
supports the ability for a test case to run a prepratory command
before running e2fsck.

E2fsprogs 1.17 (October 26, 1999)
=================================

Fixed nasty typo in fsck which caused parallelized fsck's to go into an
infinite loop.

Fixed a bug in fsck where it used strncmp to compare a binary UUID,
thus potentially causing problems if a binary UUID contained a NULL
character.

E2fsck now uses stricter checks for directory entries in pass 2:
zero-length filenames are not allowed; neither are 8 byte long
directory entries.

The debugfs "dirty" command now clears the filesystem valid bit.
(Previously this just set the dirty-as-in-needs-writing-out-to-disk
bit in the in-core superblock image.  The new functionality is more
what the user expects, and is more useful.)

Added a debugging hook to test parallel fsck; if the environment
variable FSCK_FORCE_ALL_PARALLEL, then filesystems on the same drive
will be checked in parallel when they normally would not be.

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

Fixed some #ifdef's for compilation under the Hurd OS.

Fixed minor W2K compatibility problems.

Fixed some miscellaneous GCC warnings.


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.
