E2fsprogs 1.43.3 (September 4, 2016)
====================================

Fix e2fsck's handling of timestamps on 32-bit systems.

E2fsck will now check, and if necessary repair the extra isize fields
in the inode and superblock.

Fix crashes on architectures such as sparc64 that are sensitive to
unaligned pointer derferences in the journal recovery code when
journal checksums are enabled.

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

Support reproducible builds by not capturing the build directory into
the mk_cmds and compile_et scripts.  Also fix debian build rules to
ensure build reproducibility.

Fix debian build rules to ensure build reproducibility and to avoid
hiding the linker flags for e2fsck.static so the build hardening log
scanner can properly audit the build.

Fix compatibility with FreeBSD's pmake and teach the configure script
to force the creation of pmake-compatible Makefiles if the
FORCE_NATIVE_MAKE environment variable is set to a non-empty value.


E2fsprogs 1.43.2 (September 1, 2016)
====================================

Fix resize2fs so it will not crash if there is an extended attribute
block but it doesn't need to migate any blocks during an off-line
resize

Fix a crash when mke2fs or debugfs tries to copy in a directory
hierarchy containing an empty directory

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

Fix an alignment bug in e2fsck which caused sparc64 architectures to
crash when replaying the journal on file systems with a 64-bit block
number.

Clarify the message printed by tune2fs message when the user needs to
run e2fsck so it's clear that the -f flag to e2fsck is needed to
force a full e2fsck scan.  (Addresses Debian Bug: #828022)

Fix a bug in e2fsck caused by a power failure during e2fsck's journal
replay could leave the file system in a state where if the file system
is mounted without doing a full e2fsck scan, the file system could get
corrupted

Fix the logic in e2fsck which decides when to repair legacy negative
timestamp encodings.

Add a command to debugfs to copy the inode structure from one inode to
another.

Fix a typo in debugfs's stat command when printing out the dtime field
on file systems with an extended timestamp.

Fix big endian bugs in the e2undo program.  (Addresses Red Hat Bug
#1344636)

Debugfs's logdump can now properly handle journals larger than 2GB.

Avoid installing the man page for fuse2fs if it has not been built.

Update the Catalan, Chinese, Danish, Dutch, French, German, Polish,
Swedish, Ukrainian translations and added new translations for
Hugarian and Serbian.


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

Fix portability problems in fuse2fs.  Previously it wouldn't build on
systems with older glibc versions where clock_gettime() is only
available in the librt library, and if libintl is not bundled into the
C library.

Remove complicated logic which caused a static code analyzer to flag a
false positive.  (A static code analyzer also found a valid bug in
deciding when to repair a legacy negative timestamp encoding, so
eliminating false positives is important.)

Fixed a bug where the ext2fs library cloud provoke when a
extfs2_zero_blocks() is used (via fallocation, initializing a file
system, uninitialized uninitialized inode table blocks) after a
different file system which also used ext2fs_zero_blocks().

Enable the unix_io manager in the ext2fs library so it can accept the
use of a file descriptor.  This is helpful in cases where the file
descriptor comes from temporary file created using O_TMPFILE, or
passed in from a unix domain socket.

Fix a Windows64 portability bug.


E2fsprogs 1.43.1 (June 8, 2016)
===============================

Fixed e2fsck so that it would correctly update the project quota usage
when deleting a corrupted and inode, and fixed mke2fs so it wouldn't
dereference memory beyond the small inode structure (which was wrong,
but worked mostly by accident unless hardening or some security malloc
was in use).

Fixed a large number of FreeBSD portability problems.  (To build on
FreeBSD, however, we still need to use GNU Make and redirect dd to use
GNU dd.)

The configure script now supports --enable-hardening, which enables
stack protection, fortify, read-only relocation tables, immediate
dynamic symbol binding, and text segment ASLR (if the kernel has
userspace ASLR support enabled) by enabling position independent
executable code.  (Distributions who want to do their own special
thing can set CFLAGS, CFLAGS_SHLIB, CLFAGS_STLIB, LDFLAGS,
LDFLAGS_SHLIB and LDFLAGS_STATIC as appropriate.)

The configure script now supports --disable-tdb since on 64-bit
systems, it's much faster to just enable additional swap space.  The
scratch_files feature in e2fsck.conf is mostly only useful on 32-bit
systems.

Fixed the Direct I/O fallback codepath in the Unix I/O manager so that
read/modify/write worked correctly.  Fortunately in practice (with the
exception of the Undo handler when running on FreeBSD) used this buggy
codepath. so file systems weren't getting corrupted.

Mke2fs will now warn if the user provides a label which is too long.
(Addresses Debian Bug: #791630)

Debugfs's rdump command now works correctly when dumping the root
directory of a file system.  (Addresses Debian Bug: #766125)

Fixed a bug in debugfs so it would correctly calculate a block group's
checksum field field on 64-bit ssystems.

E2fsck now has a much more understandable error message when the
journal superblock is corrupt and the user declines to fix it.
(Addresses Debian Bug: #768162)

Fixed support of extended timestamps on 64-bit systems.

Updated/fixed various man pages.  (Addresses Debian Bugs: #766379,
#761144, #770750, #428361, #766127)

Fixed various Debian Packaging Issues.  (Addresses Debian Bug: #825868)


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

Fixed coverity, sparse, gcc -Wall, and clang warnings/nits.

Fixed Android build makefiles (which was missing a newly added file in
lib/support).

In general, checks on s_creator_os have been removed in favor of
feature flag specific checks; if there is something that can't be
checked via the presence of a feature flag, we will simply check
whether the creator OS is *not* EXT2_OS_HURD which is the one
operating system where there has been extensive abuse of the
s_creator_os flag.

The libmagic libary has been suppressed when running the regression
test suite to avoid false test failures caused by differences between
versions of libmagic (and/or the magic number database).

The tests/test_script progam now accepts the --failed option, which
will run those tests that had previously failed.

Fixed tests build on those systems which require LDFLAGS to be set.

Fixed the regression test suite so it will properly filter out version
numbers with two components (such as 1.43) from log files before
comparing them with the expected golden output.


E2fsprogs 1.43 (May 17, 2016)
=============================

Add support for the ext4 metadata checksum, checksum seed, inline
data, encryption, project quota, and read-only features.

Support for the very old, experimental, and never-added-to-mainline
compression feature has been removed.

Mke2fs will now create file systems with the metadata_csum and 64bit
features enabled by default.

The mke2fs program will now support multiple -O options (instead of
just ignoring all but the last -O option).

Mke2fs will now correctly determine the size of a file system and
handle the discard operation correctly when the "-E offset=NNN" is
used.  (Addresses Debian Bug: #803629)

The tune2fs program will ask the user for confirmation before starting
dangerous operations if the terminal is available, and it will replay
the journal if necessary.

Add an ext2/3/4 FUSE server

Debugfs can now modify extended attributes and journal transactions.

Debugfs now can properly display and set extended timestamps.

E2fsck will offer to fix extended timestamps that were incorrectly
encoded by older kernels.

Fix miscellaneous MMP bugs in debugfs.

Fix sparse_super2 bugs in mke2fs and resize2fs.

Fix or improve offset support in mke2fs, e2undo, and libext2fs.

The resize2fs command can now convert file systems between 64-bit and
32-bit mode.

Fix potential out-of-bounds memory access in resize2fs when doing a
large off-line file system grow operation.

We now use a new e2undo file format which is much more efficient and
faster than the old tdb-based scheme.  Since it so much faster,
e2fsck, tune2fs, debugfs, and resize2fs now also can support using
creating an undo file.

The mke2fs command can now set the error behavior when initializing
the file system (so the administrator doesn't have to issue a separate
tune2fs -e command).

Teach mke2fs to parse a human-readable argument for -i option.

Teach mke2fs to automatically handle creating file systems > 500T by
automatically enable the meta_bg feature.

Mke2fs will now prompt for user verification before rewriting a file
system's superblock using the -S option.

Mke2fs no longer complains if the user tries to create a file system
using the entire block device (e.g., without using a partition).  The
minor number convention is not used by all block devices, and it's
quite normal in some circumstances to create a file system on /dev/sdc
instead of /dev/sdc1.

Fix an "mke2fs -d" bug which could create inodes with invalid
extended attribute blocks

E2fsck is now much more paranoid about not freeing or corrupting
critical metadata blocks, such as inode table blocks, even if
corrupted indirect blocks or extent trees point at these blocks.

E2fsck now prints block ranges in pass1b instead of listing all of the
blocks exhaustively.

E2fsck will try to expand the root directory if the lost+found can't
be linked to the root directory.  Also, offer to use the root
directory if lost+found can't be created.

E2fsck is now more paranoid handling corrupted extent trees as well as
corrupted journals.

E2fsck can now rebuild extent trees, either (a) to optimize them, (b)
to recover from a corrupted extent tree, or (c) to convert
block-mapped inodes to use extents.

E2fsck now has a readahead mechanism which can significantly speed its
performance, especially on RAID arrays.

E2fsck now has a "yes to all" option which the user can give if she is
tired of answering 'y' to a very large number of questions.

E2fsck will now ignore the badblocks inode if the contents of the
badblocks inode indicate that the portion inode table containing the
badblocks inode is bad.  (We must go deeper...)

E2fsck can now correctly fix directory with holes on bigalloc file
systems.

E2fsck will now check for extent mapped inodes with no extent header
and clear them if found.

E2fsck now checks to make sure the extended attribute header doesn't
result in the xattr extending beyond the bounds of the inode

Fixed a bug in e2fsck to avoid overrunning a buffer containing jbd2
revoke records if the journal is corrupted.

Fixed a bug in e2fsck which could cause it loop forever if a special
inode has too many invalid block mappings.

Fixed a bug in e2fsck which could cause pass1b/c/d processing to get
confused if an attempt to allocate a block can't find any free space
in the file system.

E2fsck will no longer try to force rewrite blocks located beyond the
file system.

The e2fsck program will no longer update the quota inodes when it is
interrupted.

Fix a bug which in rare cases would cause e2fsck -fD to corrupt an
extent-mapped directory.

Fixed a bug in resize2fs which could lead to resize2fs crashing or a
corrupted file system if the file system is almost completely full
when trying grow a file system and we need to allocate blocks to grow
the block group descriptors.

Fixed a bug in resize2fs which could cause it to get fooled trying to
determinthe the RAID array's stride when flex_bg is enabled.

Fix resize2fs bug that could leave block allocation bitmaps
uninitialized.

The dumpe2fs output has been improved so it is cleaner and always fits
within 80 columns.  Also added a more easily machine-parsable output
of dumpe2fs.

The mke2fs program can now pre-populate a file system from a directory
hierarchy using the -d option.

The mke2fs program now skips zeroing inode table blocks if they were
already zeroed using the discard feature.

Check to make sure file system features which can not be supported by
HURD are not enabled if the file system is created to be
HURD-compatible.

Added a new e2fuzz command that will fuzz an ext4 image for testing
purposes.

The debugfs logdump command can now deal with 64-bit revoke tables
correctly.  Also, "logdump -O" will print the old log contents (before
the journal was replayed).

The debugfs bmap command can now be used to set or allocate a physical
block.

Fixed a bug so "filefrag -B -e -v" does not return a separate entry
for each block.

The filefrag program now accounts for holes in sparse files created by
the file punch operation as an expected/optimal mapping.

The file I/O functions now correctly handle inodes containing
uninitialized blocks.

Fix a bug in tune2fs so that removing uninit_bg feature on a bigalloc
file system won't result in corrupted block bitmaps.

Updated/fixed various man pages.  (Addresses Debian Bug: #798425)


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

Fixed coverity, sparse gcc -Wall, and clang warnings/nits.

Added Android build files so that e2fsprogs can be built in the
Android source tree.

Reduce the use of libc functions in libext2fs that may not be present
in the boot loader environment, at least for those functions that are
needed by boot loadsers such as yaboot.

Developers can now overide the debugging and optimization flags by
redefining the CFLAGS makefile macro.

The libext2fs library now has support for fallocate.

The mke2fs command will now ask the user for confirmation if block
device or image file contains an existing file system image, and
stdout and stdin are connected to a tty.

The libext2fs library now picks a more intelligent goal block when
doing block allocations.

The libext2fs library will now automatically set the BLOCK_UNINT flag
if all of the blocks in a block group are free, to speed up future
e2fsck and dumpe2fs operations on the file system.

Add two new functions ext2fs_new_range() and ext2fs_alloc_range() to
libext2fs.

The ext2fs_zero_blocks() command will use FALLOC_FL_ZERO_RANGE for
file-based images.

The ext2fs_bmap() function supports new flags BMAP_UNINIT and
BMAP_ZERO.

The ext2fs_new_block2() function will now call the alloc_block hook
before checking fs->block_map.

Support for the MMP feature can now be disabled at compile time.

Added support to manipulate extended attributes to libext2fs.

Added a lot of new regression tests.

Added endian annotations so it's possible to scan e2fsprogs for endian
problems using a static code analyzer.

Fixed memory leaks in libext2fs.

The e2fsck jbd2 handling code has been resynced with the 3.16 kernel.
There is now a script in the contrib directory which automates most of
the resync process.

The build system will now run cppcheck (a static code analysis tool)
via "make C=1"


E2fsprogs 1.42.13 (May 17, 2015)
================================

Fixed a potential buffer overflow while closing a file system in
libext2fs.  (CVE-2015-1572, Addresses Debian Bug: #778948)

Fixed a bug which could cause e2fsck to corrupt Hurd file systems.
(Addresses Debian Bug: #760275)

Fixed a deadlock which occurs when using systemd and e2fsck.conf's
logging feature.  (Addresses Debian Bug: #775234)

Fixed a bug which could cause programs using libext2's inode table
scanning functions from crashing on certain corrupted file systems.
(Addresses Debian Bug: #773795)

Fixed dumpe2fs so it won't crash if the user doesn't specify a block
device (file system).  (Addresses Debian Bug: #764293)

Fixed e2fsck so if it notices unexpected HTREE blocks in pass 2, it
will report the correct directory inode containing the inconsistency.

If e2fsck fails to grow the dir_info structure due realloc(3) not
having enough memory, it will now fail with explanatory message
instead of staggering on failing with a confusing internal error
messages.

The tune2fs program will zero out the superblock journal backup
information when removing a journal from a file system.

The mke2fs program now enables the large_file feature by default.

Fixed a bug which could cause badblocks to crash if there are millions
and millions of bad blocks.

Fixed some use-after-free bug in resize2fs and e2fsck.

Fixed a memory leak in tune2fs.

Fixed some bigendian bugs that had crept into both indirect and extent
handling inside libext2fs.

Updated/fixed various man pages.

Update Esperanto, German, and Spanish translations.  Added Danish
translation.

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

Fixed coverity, sparce gcc -Wall, and clang warnings/nits.

Clean up some build system problems (build failures with various
configure options, fix Posix portability issues, etc.)

The functions ext2fs_inode_alloc_stats[2]() and
ext2fs_block_alloc_stats[2]() now check the inode and block numbers
passed to them, to avoid crashes caused by buggy callers.

The libext2fs directory iterator will now check for an invalid
directory entry length instead of possibly walking off the end of the
directory buffer.


E2fsprogs 1.42.12 (August 25, 2014)
===================================

Fix various e2fsck bugs when trying to repair bigalloc file systems.

E2fsck can now repair a file system with an overly large
s_first_meta_bg field, which had previously caused all e2fsprogs
programs to crash when trying to open such a file system.

Fix e2fsck so that it can correctly fix a number of rare file system
corruptions that were discovered when using a file system fuzzer.

Fix e2fsck so it does not try to write back block group descriptors if
they have not been modified.

Mke2fs program will now place metadata blocks in the last flex_bg so
they are contiguous.  This reduces free space fragmentation in a
freshly created file system, as well as allowing mke2fs commands which
request extremely large flex_bg size to succeed.

Mke2fs now creates hugefiles more efficiently (with fewer extent tree
blocks).

Fix a 32/64-bit overflow bug that could cause resize2fs to loop
forever. (Addresses-Launchpad-Bug: #1321958)

The resize2fs program will now use much less memory when resizing very
large file systems.

Fix a bug which could cause resize2fs to get confused and produce a
corrupted file system when shrinking a file system that had been
previously expanded and converted to use the meta_bg file system
format, but which no longer needs to use the meta_bg file system
format any longer.  This typically happened with large (> 16TB) file
systems.  (Addresses Debian Bug: #756922)

The e4defrag program will now defrag backwards-allocated files.

Fix tune2fs updating UUID's when manipulating file systems with
external journals (both the file system and journal UUID).

Fix tune2fs so it can remove an external journal for file systems with
a 1k block size.

Add a new debugfs command, "inode_dump", which prints the inode in hex
and ASCII format.

The debugfs's "set_inode_field" will now automatically allocate blocks
for indirect blocks and extent tree blocks.

Fix debugfs's "set_inode_field" so can properly handle
"block[IND|DIND|TIND]".

The debugfs "rdump" command will now take multiple source arguments.

Fixed a double close(2) bug in "rdump" and "rdump -p".

Fix debugfs's argument parsing for the freefrag command.

Fix filefrag to properly handle using the FIBMAP ioctl (with -B).
(Addresses Launchpad Bug: #1356496)

Clarified messages that were confusing users in debugfs, e2fsck,
mke2fs, and resize2fs (Addresses Debian Bugs: #758029, #757543,
#757544)

Dumpe2fs will now complain if extra arguments are given to it.
(Addresses Debian Bug: #758074)

Updated/fixed various man pages.  (Addresses-Debian-Bug: #726760)

Update Czech, Dutch, French, Polish, Spanish, Sweedish, Ukrainian, and
Vietnamese translations.

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

The Unix I/O layer will now use pread[64]/pwrite[64] to reduce the
number of system calls issued.

Fixed profiled build.

The libext2fs library will now more efficiently split an extent tree
index block when appending to an end of a file.

Fixed free block accounting for 64-bit file systems.

Add a new function ext2s_inode_size_set() which takes care of all of
the required feature flag modifications.

The regression tests no longer require the presence of the md5sum
program.

Fix build failure on MIPS platforms on Debian (Addresses Debian Bug:
#754605)

Fix various Coverity warnings (#1225003, #1229243, #1252003)


E2fsprogs 1.42.11 (July 9, 2014)
================================

Add support so that mke2fs can create hugefiles so that they are
aligned relative to the beginning of the disk, instead of relative to
the beginning of the partition, using the mke2fs.conf configuration
parameter "hugefiles_align_disk".

Fix a bug which causes e2fsck to abort a journal replay on a file
system with bigalloc enabled.  (Addresses Debian Bug: #744953)

Add sanity checks so that mke2fs will refuse insanely large flex_bg
counts specified by the -G option.  Insanely large flex_bg sizes can
result in a file system which can't be unmounted, or with extremely
pessimal metadata layouts.

The mke2fs program will provide a better metadata layout for
moderately large (but believable) flex_bg counts, such as 133,072.

The mke2fs progam will also check the kernel version number to
determine whether the lazy_itable_init option is supported, so that
lazy inode table initialization can be used even if the ext4 is
compiled as a module which isn't loaded at the time that mke2fs is
run.

Add description of ext4's mount options to the ext4 section 5 man
page.

Improve the chattr man page and clean up the chattr usage message.

E2fsck will now automatically fix a last mount time or last write time
which is in the future in preen mode, instead of aborting the fsck
check.

Mke2fs will now check the file system revision number requested by the
command line, and reject it if it is too large.  A file system with an
unsupported revision number will not be accepted by any of the other
file system tools, and this command line option is rarely used, so
let's try to help the user not shoot their own foot off.

The debugfs progam can now set the error count and associated
first_error and last_error fields in the superblock using the
set_super_value command.

Resize2fs will not try to calculate the minimum size of a file system
if it contains errors.  Otherwise a very badly corrupted file system
image can cause the minimum size calculation to loop forwever.  Since
resize2fs will not allow a file system marked as containing errors to
be resized.  It's pointless to calculate the minimum size, so just
skip it.

Fixed a typo in one of mke2fs's error message.

If filefrag runs into an error, it will continue processing the rest
of the files specified on thec ommand line, but then exit with an
error code.

Filefrag now prints some additional new flags (such as
FIEMAP_EXTENT_ENCODED), and print unknown flags as hex values.

Fixed support in filefrag for files with > 2**32 blocks on 32-bit
platforms.

Fixed a file descriptor leak in debugfs when copying files.

Fixed a regression introduced in 1.42.10 which caused mke2fs to fail
to create file systems larger than 2GB on 32-bit platforms.
(Addresses Red Hat Bugzilla: #1099892, Debian Bug: #752107)

Add Esparanto and Ukrainian translations, and update Czech, Dutch,
French, German, Italian, Polish, Sweedish, and Vietnamese
translations.

Fixed various compiler warnings.


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

The gcc "-checker" option has been long deprecated, so remove support
from e2fsprogs.  It was causing a few people to be confused when they
tried enabling the configure option.

Update to the latest version of the config.status and config.rpath
files, as well as newer versions of the autoconf files in aclocal.m4.
Also, move the e2fsprogs-specific macros to acinclude.m4, which allows
people who want to use autoreconf to do so.

Make the use of strptime() function in debugfs to be more portable to
fix regression test failures for FreeBSD and MacOS.

A few miscellaneous changes designed to make life easier for
translators.

Fix the f_quota test and some Makefile dependencies if quota support
is not enabled.

Fix cross-compilation support, which got broken in 1.42.10.
(Addresses Debian Bug: #753375)

Delete lib/ext2_types.h on a make clean, and build it as necessary.

Add a debug program used for libext2fs unit tests.

Clean up the tests so that it avoids using GNU-specific behaviour in
mktemp.  Make sure the temporary files are cleaned up if the tests are
interrupted.

Add a new ext2fs_close_free() helper function which automatically
takes care of freeing the ext2_filsys structure even if ext2fs_close()
returns an error.


E2fsprogs 1.42.10 (May 18, 2014)
================================

Mke2fs now creates file systems in regular files (which is very often
used when maintaining virtual machine images) without requiring the
user to use the force option.  In addition, the mke2fs output has been
made much less verbose and only displays information that users will
be more likely to find useful by default.

Mke2fs now will ask the user to confirm that they want to continue
before wiping out a pre-existing file system, partition table, or LVM
physical volume.

Mke2fs now has the ability to create file systems where all the
metadata is located at the very beginning of the device.  This can be
useful for flash devices which have SLC flash at the beginning of the
disk, for FAT compatibility, for example.  As part of this, mke2fs and
tune2fs can control the location of the data blocks used by the
journal inode.  In addition, the new sparse_super2 feature allows for
even fewer (anywhere from zero to two) backup superblocks.

Mke2fs now uses much less CPU when allocating the blocks used for very
large file systems.

Mke2fs can now support creating a file system at an offset.  This can
be useful when creating a disk image for virtual machines (Addresses
Debian Bug: #497984)

Previously, e2fsck had a number of very serious bugs when checking a
file system wich used the new the quota file system option (where the
quota inodes were stored in hidden inodes) and the quota inode was
inconsistent with the actual usage data.  This problem was documented
in https://ext4.wiki.kernel.org/index.php/Quota.  These problems have
been fixed in 1.42.10, so the quota should be safe to use with
e2fsprogs 1.42.10.

Fixed in a bug in resize2fs which could cause shrink operation fail in
the unlikely situation when the inode table needs to be moved to a
location before the current location.

Resize2fs now has a much more accurate (and less conservative)
estimation of how far the file system can be shrunk.  This allows a
mostly empty filesystem which is a few terabytes, to be shrunk to a
few megabytes in a single resize2fs -M operation.

E2fsck will now force a full file system check if there are any file
system inconsistencies detected in the super block.

The filefrag program will now display hte shared extent flag, which is
used by file systems such as btrfs.

If the number of inodes in the file systems is larger than the time
that file sytem was created (as measured by the number of seconds
since January 1, 1970) e2fsck would print a scary (but otherwise
harmless) warning of file system corruption for each inode in the
orphan list.  This false positive has been fixed.

The e4defrag program has been fixed so it will no longer refuse with
filesystem with the 64-bit or the bigalloc feature enabled.

The logsave progam will print a much less scary message which could
lead users to believe something has gone very wrong with e2fsck exits
with a non-zero exit status (since this is normal after e2fsck has
automatically fixed a file system corruption during a preen
operation).   (Addresses Debian Bug: #468821)

When creating a file system which is larger than 16TB, the
resize_inode option must be disabled -- since the resize_inode simply
doesn't support reserving metadata block numbers which is larger than
32 bits.  The mke2fs program does this automatically if the file
system size is determined automatically.  It will now also do this if
the file size is specified explicitly.

Fixed bugs associated with resize2fs and shrinking bigalloc file
systems.

The e2fsck program will no longer try to add a UUID on a mounted file
system with checksums enabled, since this could leave the file system
checksums broken.

Tune2fs will allow the removal of an external journal from file system
which is marked as needing the journal replayed when the force ("-f")
option is given twice.  (Addresses Debian Bug: #559301)

Tune2fs will no longer support enabling sparse_super if the meta_bg
file system feature is enabled, since it could result in data loss.
In practice, all modern file systems have sparse_super is enabled, so
it's not worth trying to change how tune2fs handles enabling the
sparse_super feature.

Fixed support for 1k block file systems with the meta_bg feature.

When the superblock is corrupt, e2fsck can't figure out the location
of the alternate superblock.  Unfortunately, the routine that
calculates the location of the alternate superblock uses 8193 if it
can't figure this out, so the message printed by e2fsck always
suggests using "e2fsck -b 8193".  This message has been fixed to
suggest both the superblock location of 8193 and and 32768.
(Addresses Debian Bug: #719185)

The lookback mount detection code that was introduced in 1.42.9 wasn't
actually compiled in due to an autoconf oops, so it's fixed now in
1.42.10.  (Addresses Debian Bug: #497984)
    
A bug introduced in 1.42.9 would cause debugfs to print two error
messages if it found an error while parsing a user-supplied block
number.  This has been fixed in 1.42.10.

Update Czech, Dutch, French, German, Polish, Spanish, Sweedish, and
Vietnamese translations.  (Addresses Debian Bug: #703048)

Updated/fixed various man pages.  (Addresses Debian Bugs: #719189,
#719184)

Fixed various Debian Packaging Issues.  (Addresses Debian Bug: #718725)


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

Fixed a lot of coverity, sparce gcc -Wall, and clang warnings/nits.

Allow the location of pkg-config files to be specified independent of
the libdir location via a makefile variable.

Fixed parse-types.sh not to complain when cross-compiling and the
sizes of types are different between the target architecture and the
architecture of the build system

Allow the regression test suite to work correctly on systems which do
not have the "truncate" or "mksawp" programs.

Allow e2fsck to build correctly on systems (such as Android) that do
not have the signal.h file.

E2fsprogs now has code coverage testing which can be enbled using
"configure --enable-gcov".

The libe2p.h header file can now be used included by C++ programs.

The profile/config file used by e2fsck and mke2fs will interpret
numbers with a leading 0 character to mean that they should be
interpreted as an octal integer.

The extent handling functions in libext2fs have been improved so they
have proper rollback when there is an error splitting an extent.  Also
fix a number of bugs when punching holes in files, and fix an
off-by-one bug when inserting an extent into an empty inode.

The libext2fs library now handles the support of BLOCK_UNINIT by
clearing the portion of block bitmap when it is loaded, instead of
when it is used.  This reduces the chances of bugs, and and simplifies
the code.  It also means that debugfs will properly show that blocks
in uninitialized block groups as being unused when using the testb
command.

The e4defrag program will try to use fadvise64 or posix_fadvise64() if
it is present, which allows 64-bit offsets on 32-bit systems.


E2fsprogs 1.42.9 (December 28, 2013)
====================================

Mke2fs will detect an attempt to create a file system on a loop
mounted file and complain without the -FF option.  Also fixed mke2fs
so it allows the creation of a file system on a mounted device with
two -F options, as documented in the man page, instead of three -F
options.

Fixed a large number of bugs in resize2fs, e2fsck, debugfs, and
libext2fs to correctly handle bigalloc and 64-bit file systems.  There
were many corner cases that had not been noticed in previous uses of
these file systems, since they are not as common.  Some of the bugs
could cause file system corruption or data loss, so users of 64-bit or
bigalloc file systems are strongly urged to upgrade to e2fsprogs
1.42.9.

The tune2fs program will now not allow changing the uuid on a mounted
file system which has the uninit_bg feature enabled.  This avoids a
nasty race where the kernel and tune2fs are both retrying rewrite the
group descriptors at the same time, with different ideas about what
the UUID should be.

When e2fsck is rehashing an extent-mapped directory, it's possible
(although very rare) that an extent block will need to be allocated;
fix e2fsck to make sure that the block gets marked as used.

Mke2fs will now properly set the LARGE_FILE feature when creating a
journal >= 2GB --- which can happen when using 64k block size.

Fixed debugfs so that its freei command will correctly handle a request
to free a range of consecutive inodes.

Fixed 2fsck so it will not erroneously complain that an external journal
is invalid if it is exactly 2**32 blocks.

Fixed e2fsck so it won't try checking for, and adding, a missing
lost+found directory when running in read-only mode.

Fixed e2image so that progress information won't get leaked to stdout.
(Addresses Red Hat Bugzilla: #1327329)

Fixed e2image to avoid some buffer overruns which would cause it to when
creating a "standard (non-raw, non-qcow2) image file.  Standard
e2image files are actually very rarely used, so we didn't notice when
the changes to enable the qcow2 format broke this e2image mode.

Fixed mke2fs so that the extended option "-E resize=NNN" will not turn
on the resize_inode feature when the meta_bg feature is set, since
these two features can not be set at the same time.

Fixed tune2fs so that when it disables the quota feature, it updates all
of the backup superblocks.

Fixed dumpe2fs that would cause it to abort when run using an image file
when trying to print the journal information (which is not present in
an e2image created image file).

Fixed a potential integer overflow in e2reefrag.
(Addresses-Debian-Bug: #718205)

Enhance debugfs so that when copying a sparse file from a native file
system into the file system image using the "write" command, it will
create a sparse file into the destination file system.

Enhanced debugfs so it can support a command line which is up to 8k
long.

E2image will refuse (unless the -f option is specified to force the
issue) to create a raw or qcow image using a mounted file system,
unless the -f option is specified to force the issue.

E2image has been optimized for using it to efficiently copy a file
system by only copying the allocated blocks, by using the options -ra.
New options (-o and -O) have been added so that a source and
destination offset can be given.  The -p option will print progress
information so the user will know how far along the copy is going.
And finally, the new option -c is useful for updating a file system on
an SSD, by avoiding unnecessary writes.  E2image can also shift a file
system image by doing an in place move.

Fix a regression introduced in 1.42.8 which would cause e2fsck to
erroneously report uninitialized extents past the EOF (as determined by
i_size) to be invalid.

Fixed resize2fs so under a corner case when an inode has a complex
extent tree, it will not corrupt an interior node in the extent tree.

Fixed resize2fs which would sometimes corrupt a file system when
shrinking a file system to a minimum size using resize2fs -M.
(Addresses Debian Bug: #660793)

Fixed resize2fs so that it will relocate inode table blocks if this
becomes necessary when shrinking the file system.

Fixed resize2fs and e2fsck so they will not crash when hit a failure
while operating on a file system with the MMP feature enabled.

Fixed a bug in debugfs which caused it create an invalid inode when
trying to write a zero-length file.

E2fsck will no longer crash if it tries to delete an invalid
extent-mapped symlink.

E2fsck will no longer crash if it comes across an directory which is
larger than 2GB (which is not allowed in valid file systems).

Fixed debugfs's help texts to fully document all options and otherwise
be more helpful.

Updated/fixed various man pages.  (Addresses Debian Bugs: #586218,
#669730, #698076)

Fixed various Debian Packaging Issues (#698879, #721365)


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

Fix sparse, gcc -Wall and clang nits.

Update config.{guess,sub} to the latest version

Fixed various memory and file descriptor leaks on various error paths,
as well as some missing error return checks, which were found using
Coverity.

Run sparse against source files when building e2fsprogs with 'make
C=1'.  If instead C=2, it configures basic ext2 types for bitwise
checking with sparse, which can help find the (many many) spots where
conversion errors are (possibly) happening.

Allow the regression test to be run in chrooted environments where
/etc/mtab might be missing.

The ext2fs_punch() function, which was introduced in 1.42, was broken
in many ways, but this was never noticed since it wasn't used for
anything significant.  Some of the bugs include failing when trying to
punch a completely sparse file, failing when punching an extent-mapped
inode when the starting block was at the beginning of the inode, and
not being able to punch a single block (where start_blk == end_block).
It also didn't handle being passed an invalid, too-large ending block
number, and didn't handle properly terminate at the right place when
operating on an indirect-mapped inode.

Fixed some minor typo's in the error catalog for libext2fs.

Fixed ext2fs_file_set_size2() so that if it truncates an inode by
setting the file size, to zero the rest of the block to the end of the
file, so that if an ext4 FUSE driver tries to extended the file, that
we don't avoid stale data from being returned.

Fixed ext2fs_bmap() to disallow clients from trying to map or set
logical blocks which are larger than what an extent-mapped or indirect
block-mapped inode can allow.

If debugfs (or some userspace program using libext2fs) creates a file
which is larger than 2GB, make sure the large_file feature flag gets
set.

Fix a bug in ext2fs_link() where if there is multiple empty slots in the
directory which are large enough, the directory entry could get
inserted more than once in the directory.

If quota support is disabled (which is the default), make sure that
all traces of the quota support is removed from usage messages, man
pages, and tune2fs must not be able to enable the quota file system
feature.  (Addresses Red Hat Bugzilla: #1010709)

The ext2fs_file_write() now updates i_size on a successful write,
instead of only updating i_size wen the file is closed via
ext2fs_file_close().

Added a shell script, populate-extfs.sh which uses debugfs to populate
an ext2/3/4 file system image from a given directory.  It is similar
to the genext2fs program, but it supports ext3 and ext4 file system.

Add changes to the libext2fs library to support block group
descriptors larger than 64 bytes (for future compatibility).

Fixed an off-by-one bug in ext2fs_file_set_size2() so that it will not
leave an extra block in the file when truncating the file down to
size.

The html version info pages are now built using makeinfo --html
instead of the unmaintained and now-obsolete texi2html program.


E2fsprogs 1.42.8 (June 20, 2013)
================================

As a part of mke2fs's option parsing cleanup, the use of the -R option
will give a warning that it is depreated (it has been so documented
since 2005) and -E should be used instead.

Mke2fs will not give warnings about the bigalloc and quota options in
quiet mode.

If an invalid journal size is given to mke2fs, it will now complain
and exit sooner.

Debugfs was erroneously giving spurious error messages for certain
extent_inode subcommands which take arguments (split_node,
replace_node, and insert_node).  This has been fixed.

Fix the parsing of the 's' (sectors) in parse_num_blocks2, which among
other programs is used by mke2fs.

Change mke2fs so that it does not set the root directory to the real
uid/gid of the mke2fs process.  Add the extended option root_owner to
override this behavior.

Fix resize2fs when shrinking file systems to make sure that bitmap
blocks aren't left outside the bounds of the shrunken file system.
This could happen with flex_bg file systems that were grown using
the old online resizing algorithm.

E2fsck will now detect and repair corrupted extent trees which contain
invalid extents at the end of the extent tree leaf block.

E2fsck will now longer complain about zero length extended attribute
values.

Fix a regression introduced in e2fsprogs v1.42 which caused e2image -s
to crash.

Add safety check so tune2fs will not attempt to set the inode size to
be larger than the block size.

Fix e2fsck so it can check a read-only root file system with an
external journal.  (Addresses Debian Bug: #707030

Fix off-line resizing of file systems with flex_bg && !resize_inode
(Addresses Debian Bug: #696746)

Fix e2image with large (> 32-bit) file systems (Addresses Debian Bug:
#703067)

Enhance chattr to allow clearing the extent flag if the kernel allows
migrating extent based files to use indirect blocks.

Update German translation.

Updated/fixed various man pages.  (Addresses Debian Bugs: #712429,
#712430, #707609)

Fixed various Debian Packaging Issues (Addresses Debian Bug #708307)

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

Use secure_getenv() in preference to __secure_getenv().

Optimize CPU utilization of ext2fs_bg_has_super().

Fix ext2fs_llseek() on 32-bit i386 systems to work correctly when
SEEK_CUR is used with large files.

The ext2fs_read_inode_full() function will no longer use
fs->read_inode() if the caller has requested more than the base 128
byte inode structure and the inode size is greater than 128 bytes.

Fix build failure with --enable-jbd-debug.

Clean up filtering of outputs for the regression tests by using a
common sed script.

Fix gcc -Wall and clang nits.


E2fsprogs 1.42.7 (January 21, 2013)
===================================

Add warnings to mke2fs, resize2fs, and tune2fs that the bigalloc and
quota features are still under development.  For more information
please see:
    * https://ext4.wiki.kernel.org/index.php/Bigalloc
    * https://ext4.wiki.kernel.org/index.php/Quota

Add some new options to filefrag from Lustre's patches to e2fsprogs:
    * add -k option to print extents in kB-sized units (like df -k)
    * add -b {blocksize} to print extents in blocksize units
    * add -e option to print extent format, even when FIBMAP is used
    * add -X option to print extents in hexadecimal format

Fix resize2fs so that it can handle off-line resizes of file systems
with the flex_bg feature but without a resize_inode (or if we run out
of reserved gdt blocks).  This also fixes a problem where if the user
creates a filesystem with a restricted number of reserved gdt blocks,
an off-line resize which grows the file system could potentially
result in file system corruption.

Fix a resize2fs bug which could cause it to corrupt bigalloc file
systems when doing an off-line resize.

Further optimize resize2fs so it doesn't use quite as much CPU when
resizing very large file systems. 

Fixed 32-bit overflow bugs which could cause resize2fs to fail and
possibly corrupt the file system while resizing 64-bit file systems.

Fix a bug in mke2fs where parsing "-E resize=NNN" will result in a
mke2fs crash due to a divide-by-zero if the 64bit file system feature
is enabled.

Add better error checking to mke2fs to check for invalid parameters
when creating bigalloc file system.

When creating bigalloc filesystems, the -g option to mke2fs will now
specify the number of clusters per block group.

Add to debugfs the functionality to corrupt a specific file system
block via the "zap_block" command.

Add to debugfs the functionality to print out a hex dump of a block in
the file system via the "block_dump" command.

Add to debugfs the functionality to manipulate the extent tree
directly via the "extent_open" command.

Fixed debugfs's mknod command so that it updates the block group
statistics.

Fix e2fsck so it can detect and fix inconsistencies in the interior
nodes of an inode's extent tree.

Fix a potential memory corruption failure in e2fsck's error path if
the call to ext2fs_open2() fails.

Fix e2fsck if its logging function is enabled in e2fsck.conf, and the
resulting file name for the log file is longer than 100 bytes, that it
properly handles this situation instead of crashing.

E2fsck will now report the amount of memory that it attempted to
allocate when a memory allocation request fails, to make it easier to
track down the problem.

Fix mke2fs's handling of the mmp_update_interval option.  (Addresses
Lustre Bug: LU-1888)

E2image can now include all data blocks in the e2image output file
when the user specifies the -a option.

If e2fsprogs is compiled without --enable-quota, make sure that
tune2fs can not turn on the feature for new-style quota support, since
afterwards, none of the e2fsprogs tools will be willing to touch that
file system.

Optimize e2fsck's so that it uses much less CPU for large file
systems.  This can result in significant speedups, especially on
CPU-constrained systems.  This was primarily done by optimizing
libext2fs's bitmap functions.  (Addresses Google Bug: #7534813)

Fix debugfs's htree command so that all its messages are sent through
the pager.

Fixed debugfs's "dump_file" and "cat" functions work correctly
on file systems whose block size is greater than 8k.

Fix e2freefrag so it works on 64-bit file systems, and so it uses much
less memory.  (Addresses Google Bug: 7269948)

Update the spd_readdir.c file in the contrib directory to include some
additions which were made in 2008 that didn't get folded into the
version which we checked into the e2fsprogs source tree.  These
enhancements include thread safety, support for readdir64_r(), and
safe_getenv() support in case spd_readdir.so is used for setuid binaries.

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

Add a command to debugfs to create symlinks.

Document the bigalloc feature in the mke2fs man page.  (Addresses
Debian Bug: #669730)


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

Fix gcc -Wall nits.

Fix a spelling typo in the libext2fs texinfo documentation.

Change the output from "make check" so that tools such as emacs's "M-x
compile" does not mistake the output as containing a compiler error.

Export two new functions from libext2fs: ext2fs_extent_node_split()
and ext2fs_extent_goto2().

The ext2fs_extents_fix_parents() was fixed so it does not modify the
location of the extent handle if its current location is at an
interior node, rather than a leaf node of an inode's extent tree.

Add a regression test to assure that e2fsck can correctly fix an
inconsistent interior node in an inode's extent tree.

The ext2fs_{mark,unmark,test}_block_bitmap_range2() functions now
correctly support bigalloc file systems which use store block usage
information in units of clusters.

Fixed the help text in the configure script for --enable-quota.

The m68k-specific bitops code has been removed since they were
incorrectly treating bit numbers with the high bit set as signed
integers.  Furthermore, modern compilers do a good enough job
optimizing the generic code there is no point in having the m68k
specific asm statements.

Fixed how we link the test programs so they always use the static
libraries, so that we test using the libraries which we have just
built.

Update config.guess and config.sub to the latest versions from the GNU
project.

Fixed the com_err.texinfo file so that it can produce a valid
postscript/pdf printed output.

Add a regression test which checks debugfs's ability to create
symlinks, named FIFO's, and device nodes.

Add a function ext2fs_symlink(), which creates symlinks to the
libext2fs library.

Add debugging code so we can test old kernel interfaces for online
resize to resize2fs.  This backwards compatibility checking is keyed
off of the RESIZE2FS_KERNEL_VERSION, which is designed to allow us to
test the functionality of the kernel's older resize ioctls without
needing to install an old version of resize2fs, and to also test a
modern resize2fs's ability to work with older kernels without having
to install an older version of the kernel.


E2fsprogs 1.42.6 (September 21, 2012)
=====================================

When mke2fs creates file systems with lazy itable initialization, the
progress updates for writing the inode table happens so quickly that
on a serial console, the time to write the progress updates can be the
bottleneck.  So mke2fs will now only update its progress indicators
once a second.

Resize2fs will skip initializing the inode tables if the kernel
supports lazy_itable_init, which speeds up growing off-line growth of
uninit_bg file systems significantly.  Resize2fs will now also
correctly set the itable_unused field in the block group descriptor to
speed up the first e2fsck after the file system is grown.

Resize2fs has been fixed so that on-line resizing of meta_bg file
systems work correctly.  This is needed to grow file system which are
larger than 16T.

Resize2fs will now correctly handle resizing file systems to 16TB on
32-bit file systems when "16TB" is specified on the command line.

Fix mke2fs so that it will be careful to set the reserved blocks ratio
larger than 50%; this can happen when creating small file systems and
when the last block group is dropped because there are not enough
blocks to support the metadata blocks in the last block group.

Fixed spelling mistake in debugfs's help message.

Fixed a potential seg fault in e2fsck when there is an I/O error while
reading the superblock.

Fixed various Debian Packaging Issues (Addresses Debian Bug #677497)

Updated/fixed various man pages.  (Addresses Sourceforge Bug:
#3559210)

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

The configure option --enable-relative-symlink was broken so that it
needed to be --enable-symlink-relative-symlinks.  We will support both
for at least two years, but then the worng configure option will be
removed.

Fixed a regression introduced in 1.42.5 so the link order for
e2fsprogs' libraries will be correct for both static and shared
linking.  (Addresses Sourceforge Bug: #3554345)

Add support for e2fsprogs to be compiled using clang/LLVM.

Fix portability problems on non-Linux systems: avoid compile failures
on systems that don't have malloc.h

Fix f_mmp regression test suite so that debugfs gets killed if the
test is interrupted.



E2fsprogs 1.42.5 (July 29, 2012)
================================

Fixed a bug with mke2fs where if there is only 8 inodes per block
group, the calculation of the number of uninitialized inodes in the
first block group would go negative.  This resulted in "mke2fs -N 256
-t ext4 /tmp/foo.img 256m" trying to write so many blocks that /tmp
would run out of space.  (Addresses Sourceforge Bug: #3528892)

Fixed a bug in how e2fsck would uniquify directory entry names.
(AddressesSourceforge Bug: #3540545)

Previously, e2fsck would only allow a mounted file system to be
checked if it was the root file system and it was mounted read-only.
Now it will allow any file system mounted read-only to be checked if
the -f option is specified.  This makes it easier to test how e2fsck
handles checking file systems which are mounted without having to test
on the root file system.

Fixed a problem if e2fsck where if the root file system is mounted
read-only, e2fsck would not clear an error indication in the journal
superblock.  Combined with a kernel bug, this would cause the e2fsck
to check the file system after every single boot.

The e4defrag program can now handle device symlinks, such as
/dev/mapper/testvg-testlv, instead of insisting on a less
human-friendly name such as /dev/dm-2.  (Addresses Red Hat Bugzilla:
#707209)

Fixed filefrag so it will not crash with a segfault on files from a
virtual file system such as /proc.  (e.g., "filefrag
/proc/partitions")

Fixed filefrag so that it correctly reports the number of extents.
(Addresses Red Hat Bugzilla: #840848)

Fixed a file descriptor leak in logsave which could cause it to hang.
(Addresses Debian Bug: #682592)

Fixed e2fsck so that the file system is marked as containing an error
if the user chooses not to fix the quota usage information.

Fixed tune2fs so that it correctly removes the quota feature when the
last quota inode is removed.

Fix tune2fs so that after removing a quota inode, the block bitmap is
updated; otherwise, e2fsck would complain after running 'tune2fs -O
^quota <dev>'.

Fix tune2fs so that when converting a file system from using legacy
quota files to the new quota file system feature with hidden quota
files, the accounting for these files is handled correctly so that
e2fsck doesn't complain.

Improved e2fsck's verbose reporting statistics, and allow the more
verbose reporting to be enabled via /etc/e2fsck.conf.

Fixed various Debian Packaging Issues (Addresses Debian Bug #678395)

Updated/fixed various man pages.  (Addresses Debian Bugs: #680114)


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

Fixed portability problems on other operating systems (e.g., Hurd and
FreeBsd) caused by the attempted inclusion of <sys/quota.h>.

Make sure that shared libraries link with the shared libraries built
in the build tree, instead of the system provided libraries.
Previously, libraries and executables were linked with the system
libraries if present, and possibly using static archives instead of
shared libraries.  This was also problematic since if libext2fs.so is
linked with a static libcom_err.a from system, the build system would
attempt to link without -lpthread.  (Addresses Sourceforge Bug:
#3542572)


E2fsprogs 1.42.4 (June 12, 2012)
================================

Fixed more 64-bit block number bugs (which could end up corrupting
file systems!) in e2fsck, debugfs, and libext2fs.

Fixed e2fsck's handling of the journal's s_errno field.  E2fsck was
not properly propagating the journal's s_errno field to the superblock
field; it was not checking this field if the journal had already been
replayed, and if the journal *was* being replayed, the "error bit"
wasn't getting flushed out to disk.

Fixed a false positive complaint by e2fsck if all of the extents in
the last extent tree block are uninitalized and located after the end
of the file as defined by i_size.

The dumpe2fs will now display the journal's s_errno field if it is
non-zero, and it will also display the journal's 64-bit feature flag
if present.

Fix e2fsck so that it always opens the device file in exclusive mode
when it might need to modify the file system, and never if the -n
option is specified.  (Previously, there were a few corner cases where
it might get things wrong in either direction.)

E2fsck now correctly truncates or deallocates extent-mapped inodes on
the orphan list.  The root cause was a bug in libext2fs's block
iterator which could end up skipping an extent when the last block in
an extent is removed, causing the current extent to be removed from
the extent tree.

E2fsck now correctly sets the global free block and inode counts when
truncating or removing inodes on the orphan list in preen mode.
Previously, it would leave these values would be set incorrectly,
which is largely a cosmetic issue since the kernel no longer pays
attention to those fields, but it can cause spurious complaints in
subsequent e2fsck runs.

Fix i_blocks accounting when the libext2fs library needs to add or
remove an extent tree block  on bigalloc file systems.

The lsattr and chattr programs now support the No_COW flag for the
benefit of btrfs.

Debugfs now interprets date strings of the form @ddd as ddd seconds
after the beginning of the epoch.  This is handy when setting an inode
number into the d_time field when debugging orphan list handling.

Fix a precedence bug with built-in quota support which might result in
e2fsck paying attention to the quota inode field even if the built-in
quota feature flag is not set.  Fortunately, in practice that
superblock field should be zero for non-built-in quota file systems,
so it's unlikely this bug would have caused problems.

Updated/fixed various man pages.  (Addresses Debian Bugs: #674453,
#674694)

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

The regression test suite can now run the integration tests in the
tests directory in parallel, via "make -jN check".

Add new test, f_zero_extent_length which tests e2fsck's handling of
the case where all of the extents in the last extent tree block are
uninitialized extents after i_size.

Add a new test, f_jnl_errno, which checks handling of an error
indication set in the journal superblock.

Fix the test f_jnl_64bit so that it properly checks e2fsck's handling
of a 64-bit journal.

Add two tests, f_orphan_indirect_inode and f_orphan_extent_inode which
tests e2fsck's handling of orphan inodes in preen mode, and truncation
of extent inodes on the orphan list.

Fixed more OS X portability issues.


E2fsprogs 1.42.3 (May 14, 2012)
===============================

Fix a bug in the Unix I/O manager which could cause corruption of file
systems with more than 16TB when e2fsprogs is compiled in 32-bit mode
(i.e., when unsigned long is 32-bits).  Also fix a bug which caused
dumpe2fs to incorrectly display block numbers > 32-bits.

Improve the support for integrated quota files (where quota is a first
class supported feature using hidden files in the ext4 file system).
Previously the quota file was getting rewritten even when it was not
necessary, and e2fsck would erroneously try to hide quota files which
were already hidden.

Quiet complaints in e2fsck when the total free blocks or inodes are
incorrect in the superblock after an system crash, since we don't
update nor depend on the superblock summaries at each commit boundary.

Fixed a regression introduced in 1.42.2 which would cause applications
outside of e2fsprogs which did not pass the EXT2_FLAG_64BIT (and so
would were still using the legacy 32-bit bitmaps) to crash.  This was
due to missing 32-bit compat code in side the function
ext2fs_find_first_zero_generic_bmap().  (Addresses Red Hat Bugzilla:
#808421)
    
Fix a bug which would cause mke2fs to fail creating the journal if
/etc/mtab and /proc/mounts are missing.  (Addresses Sourceforge Bug:
#3509398)
    
Updated/fixed various man pages.

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

Fixed various Debian Packaging issues.


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

Change the nonsensically wrong types in the function signature of the
inline function ext2fs_find_first_zero_block_bitmap2().  This was
caused by a cut and paste error; fortunately no code in e2fsprogs used
this inline function, and there are any users of this functions
outside of e2fsprogs.

Add support for systems which have valloc(), but which do have
posix_memalign() nor memalign() (such as MacOS 10.5).

Refactor and clean up the allocation of aligned buffers for Direct I/O
support.  Previously some allocations were requesting a greater
alignment factor that what was strictly necessary.  Also optimize
reading and writing bitmaps using Direct I/O when the size of the
bitmap did not fully cover the file system blocksize.

Reserve the codepoints for the INCOMPAT features LARGEDATA and
INLINEDATA.

Improved the regression test suite by adding some new integration
tests (f_jnl_32bit, f_jnl_64bit) which detect breakage of the on-disk
jbd2 format, as well as f_eofblocks which tests the new handling of
uninitialized and initialized blocks beyond i_size.  Also add a new
unit test which verifies 32-bit bitmaps support and the new
find_first_zero primitives.

Add a few dependencies to fix parallel (make -j) builds.

Removed bash'isms which were breaking the regression test suite on
systems where /bin/sh is not bash.

The config.guess and config.sub have been updated to the 2012-02-10
version.
    
Fix a portability problem caused by assuming the present of mntent.h
means that setmntent() exists.  Instead, explicitly test for this in
the configure script.

If the sys/signal.h header file does not exist, don't try to include
it, since it's not available on all systems.

Add support for systems that do not support getpwuid_r()
    
The configure script now supports a new option,
--enable-relative-symlinks, which will install relative symlinks for
the ELF shared library files.  (Addresses Sourceforge Bug: #3520767).
    
When building BSD shared libraries make sure the LDFLAGS variable is
passed to the linker.  Fixing this allows, for example, e2fsprogs to
be built in 32-bit mode on Mac OS X Lion (Addresses Sourceforge Bug:
#3517272)
    
Fix gcc -Wall nitpicks


E2fsprogs 1.42.2 (March 27, 2012)
=================================

The resize2fs program uses much less CPU and is much faster for very
large file systems.  (Addresses Debian Bug: #663237)

The seti and freei commands in debugfs can now take an optional length
argument to set and clear a contiguous range of inodes.

E2fsck will now make explicit checks for the EOFBLOCKS_FL, since we
plan to remove support for it from the kernel file system driver.  It
really wasn't very useful and was causing more problems than it
solves.  Since e2fsck will complain if inodes that should have
EOFBLOCKS_FL do not have the flag set, we are going to remove this
check from e2fsprogs first, and then only remove the flag from the
kernel much later.

The mke2fs program can now use direct I/O via "mke2fs -D".  This will
slow down the mke2fs, but it makes it more polite on a loaded server
by limiting the amount of memory that gets dirtied by mke2fs when it
is using buffered I/O.

E2fsck was needlessly closing and re-opening the file system as a side
effect of adding Multiple Mount Protection (MMP).  This isn't
necessary for non-MMP file systems, so drop it.

Print errors returned by ext2fs_open2() and ext2fs_check_desc() so we
can more easily diagnose memory allocation failures caused by
insufficient memory.  E2fsck will now abort if there are memory
allocation failures when the file system is initially opened and
during the block group descriptor checks.  (Addresses Google Bug:
#6208183)

If there are incorrect block group checks, e2fsck will now report the
incorrect and corrected checksum values.

The e2fsck progam can now write log files containing the details of
the problems that were found and fixed directly, via configuration
parameters in /etc/e2fsck.conf.

Added the ability to limit the number of messages reported by e2fsck
for a given problem type.  This avoids a potential bottleneck if there
is a serial console which can cause a boot sequence to take a long
time if e2fsck needs to report many, many file system errors.

The dumpe2fs, debugfs, and tune2fs now use rbtree bitmaps, which cause
them to use much less memory for large file systems.

The dumpe2fs program will now print the expected block group checksum
if it is incorrect.  This helps to diagnose problems caused by
incorrect block group checksums.

E2fsck now checks for extents with a zero length, since the kernel
will oops if it comes accross such a corrupted data structure.  (See
https://bugzilla.kernel.org/show_bug.cgi?id=42859)

E2fsck has a number of bugs relating to discard that have been fixed.
(1) Fixed a bug which could cause e2fsck to discard portions of the
inode table which were actually in use.  (2) E2fsck will now avoid
using discard if the block device doesn't zero data on discard, since
otherwise this could cause problems if the file system gets corrupted
in the future.  (3) E2fsck will now avoid using discard when it is run
in read-only mode.  (4) Fixed a bug which caused e2fsck to not issue
discards in the last block group.

E2fsck's CPU utilization in pass 5 has been optimized, which will
speed up e2fsck slightly.

E2image will now skip copying uninitialized bitmap and inode table
blocks.

Fixed mke2fs -S so it does not corrupt the first block group's
information.

E2fsck will now check the new sysfs interface to determine if we are
using the battery or AC mains.  (Addresses SourceForge Bug: #3439277)

Updated/fixed various man pages.  (Addresses Debian Bug: #665427)

Fixed various Debian Packaging issues.  (Addresses Debian Bug: #665885)

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

Fixed various portability issues for non-Linux systems, particularly
MacOS X, as well as Linux systems running with the just-released glibc
2.15.

Fix file descriptor leak in ext2fs_close() if the file system with
uninit_bg is opened read/only with a backup superblock.  (Addresses
SourceForge Bug: #3444351)

Fixed an invalid return in a non-void function in the quota code.
(Addresses SourceForge Bug: #3468423)

Fixed the debian rules file so that the calls to dpkg-buildflags works
when the shell is dash.

The debian package build now uses V=1 so that there is more
information about potential build failures in debian buildd logs.

If the uninit flags get cleared by functions such as
ext2fs_new_inode() or ext2fs_new_block2(), we now make sure the
superblock is marked dirty and the block group descriptor checksum is
updated if necessary.

The debian rules file will now try to load debian/rules.custom of it
exists.  This flie can skip various builds for speed reasons if there
is no need for the e2fsck-static or udeb packages.  Available
customizations in the rules file includes SKIP_STATIC=yes,
SKIP_BF=yes, and SKIP_DIETLIBC=yes.

In addition, if the file misc/mke2fs.conf.custom.in exists in the
source tree, it will be used instead of the standard misc.conf file in
the upstream sources.  This makes it easier for Debian-derived systems
to distribute a custom mke2fs.conf file without having to worry about
merge issues if future versions of e2fsprogs makes changes in the
upstream default version of mke2fs.conf.


E2fsprogs 1.42.1 (February 17, 2012)
===================================

The mke2fs and e2fsck now use significantly less memory when creating
or checking very large file systems.  This was enabled by adding
extent-based bitmaps which are stored using a red-block tree, since
block and inode allocations tend to be contiguous.

The command mke2fs -S is used as a last ditch recovery command to
write new superblock and block group descriptors, but _not_ to destroy
the inode table in hopes of recovering from a badly corrupted file
system.  So if the uninit_bg feature is enabled, mke2fs -S will now
set the unused inodes count field to zero.  Otherwise, e2fsck -fy
after using mke2fs -S would leave the file system completely empty.

Since mke2fs recognizes mke3fs in argv[0] to mean "mkfs.ext3", also
honor "mke4fs" to work the same as "mke2fs.ext4", since RHEL5 has
installed an mke2fs binary using that name.

The usage and help messages for the -G, -t and -T options in mke2fs
have been fixed.

If e2fsck needs to use the backup group descriptors, the
ext2fs_open2() function clears the UNINIT bits to ensure all of the
inodes in the file systems get scanned.  However, the code which reset
the UNINIT flags did not also recalculate the checksum, which produced
many spurious (and scary) e2fsck messages.  This has been fixed by
resetting cheksums when the UNINIT bits are cleared.

Relax a check in e2fsck which required that the block bitmap to be
initialized when the inode bitmap is in use.  This will allow us to
eventually eliminate code from the kernel which forcibly initialized
the block bitmap when the inode bitmap is first used, requiring an
extra journal credit and disk write.  (Addresses Google Bug: #5944440)
    
Make sure rdebugfs (which may be installed setuid or setgid disk) does
not honor environment variables if euid != uid or egid != gid.

Debugfs's ncheck command has been optimized and now is much more
robust with faced with corrupted file systems.  The ncheck command
also now has a -c option which will verify the file type information
in the directory entry to see if matches the inode's mode bits.  This
is extremely useful when trying to use debugsfs to determine which
parts of the file system metadata can be trusted.

E2image will try to use ftruncate64() to set the i_size for raw
images, instead of writing a single null byte.  This avoid allocating
an extra block to the raw image, for those file systems and/or
operating systems that support this.  (Linux does.)  In addition, fix
a logic bug that caused the file to not be properly extended if the
size of the last hole was exactly an multiple of a megabyte.

Fixed a bug in resize2fs where for 1k and 2k file systems, where
s_first_data_block is non-zero, this wasn't taken into account when
calculate the minimum file system size for use with the -M option.

Fixed the badblocks program to honor the -s flag when in read-only -t
mode.  (Addresses Debian Bug #646629)

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

Fixed various Debian Packaging issues so that dpkg-buildflags is used
if present, which allows e2fsprogs to be built with security hardening
flags.  (Addresses Debian Bugs: #654457)

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

Fix a bug in ext2fs_clear_generic_bmap() when used for 32-bit bitmaps.
This was only an issue for programs compiled against e2fsprogs 1.41
that manipulate bitmaps directly.  (Addresses Sourceforge Bugs:
#3451486)

The libext2fs library now uses sysconf() to fetch the page size, instead
of the deprecated getpagesize().

The ext2fs_get_pathname() function will return a partial path if an a
directory in the path is not a directory, displaying it as an inode
number in angle brackets instead of giving up and displaying an error.
This is much more helpful when a user is trying to debug a corrupted
file system.

Codepoints for the RO_COMPAT_REPLICA feature has been reserved.

Added a new library function, ext2fs_file_get_inode_num(), for use by
fuse2fs.

Fixed a bug in ext2fs_file_set_size2() so that when it is truncating a
file, it actually works.

The block iterator now properly honors the BLOCK_ABORT flag for
extent-based flags.  Previously, it didn't, which generally made code
be less efficient, but it could cause bugs in ext2fs_link(), for
example, by causing it to insert multiple directory entries.

Fixed an (harmless other than causing a compiler warning) use of an
uninitialized variable in e2fsck's MMP code.


E2fsprogs 1.42 (November 29, 2011)
==================================

This release of e2fsprogs has support for file systems > 16TB.  Online
resize requires kernel support which will hopefully be in Linux
version 3.2.  Offline support is not yet available for > 16TB file
systems, but will be coming.

This release of e2fsprogs has support for clustered allocation.  This
reduces the number of block (now cluster) bitmaps by allocating and
deallocating space in contiguous power-of-2 collections of blocks,
which are called clustered.  This is a file system level feature,
called 'bigalloc', which must be enabled when the file system is
initially formatted.  It is not backwards compatible with older
kernels.

Added support for the Multi-Mount Protection (MMP) feature.

E2fsck more efficiently uses scratch files for really big file
systems.  (This is a feature that has to be turned on explicitly; see
[scratch_files] in the e2fsck.conf man page.)

Fix a bug in e2fsck where if the free blocks and inodes counts are
incorrect, e2fsck would fix them without printing an error message.
This would cause a "*** FILE SYSTEM WAS MODIFIED ***" message without
any explanation of what was fixed.

E2fsck will no longer attempt to clone an extended attribute block in
pass1b handling if the file system does not support extended
attributes.

E2fsck will be more careful accidentally asking the user to continue
if the file system is mounted, so that an escape sequence won't cause
a false positive.  (Addresses Debian Bug: #619859)

E2fsck now uses less cpu time in pass 5 when large portions of the
bitmaps are uninitialized.

E2fsck will no longer segault when a corrupted file system has a bad
extent, and removing it leads to a block needing to be deallocated.
(Addresses SourceForge Bug: #2971800)

E2fsck will catch termination signals (segfaults, bus errors, sigfpe)
and print debugging information to make it easier to find potential
problems.

E2fsck will check to see if the bad block inode looks insane, and will
skip trying to use if it certain fields which should be zero look
non-zero.  This is to avoid a corrupted bad block inode causing e2fsck
to get confused and do more harm than good.

If e2fsck modifies certain superblock fields which the kernel doesn't
look at, it will now mark the superblock as dirty without marking the
file system as changed.  This avoids signalling the init scripts that
a reboot is necessary, since the kernel isn't going to look at those
fields, so it won't care if they have been changed.

Fixed a bug in the libext2fs library (in the binary search routine of
the icount abstraction) that could (very, very rarely) cause e2fsck to
die in the middle of pass 1 or pass 2 processing.

E2fsck will not try to do a discard operation if the -n option was
specified on the command line.

E2fsck now supports an extended "discard" option which will cause
e2fsck to attempt discard all unused blocks after a full, successful
file system check.

E2fsck will check for the bad block inode to make sure it looks sane
before trusting it, to avoid causing more harm than good to the file
system.

E2fsck now returns additional status bits in its exit code if it
aborts early in the e2fsck run.

E2fsck now correctly calculates the maximum file size in the case of
the huge_file file system feature enabled without extents.

The mke2fs and e2fsck programs now tries to use the punch hole command
as a "discard" when operating on normal files.

The e2image program now supports the qcow2 format, which is a more
efficient way of capturing file system dumps.

Mke2fs now supports the [devices] stanza in mke2fs.conf which allows
per-device defaults to be specified in the configuration file.

Mke2fs now supports the reserved_ratio relation in the [defaults] and
[fs_types] section in mke2fs.conf.

Mke2fs now creates extent-mapped directories for the root and
lost+found directories.

Mke2fs will skip zero'ing the journal if the extended option
"lazy_journal_init" is specified.  This can save a lot of time, but it
does add a small amount of risk if the system crashes before the
journal is overwritten entirely once.  It is epsecially useful for
testing.

Mke2fs will now create file systems that enable user namespace
extended attributes and with time- and mount count-based file
system checks disabled.

Mke2fs will not set a stride or strip size of one block based on block
device attributes obtained from sysfs.

Mke2fs now displays a progress report during the discard process.

Mke2fs now handles extreme file system parameters correctly which
previously caused the inodes per group to drop below 8, leading to a
segfault.  (The inodes per group must be a multiple of 8, but the code
didn't correctly deal with an inodes per group count less than 8.)

Mke2fs and tune2fs previously would give an error if the user tried
setting the stride and stripe-width parameters to zero; but this is
necessary to disable the stride and stripe-width settings.  So allow
setting these superblock fields to zero.  (Addresses Google Bug:
#4988557)

Mke2fs now gives a warning if the auto-detected block size exceeds the
system's page size.

If the enable_periodic_fsck option is false in /etc/mke2fs.conf (which
is the default), mke2fs will now set the s_max_mnt_count superblock
field to -1, instead of 0.  Kernels older then 3.0 will print a
spurious message on each mount then they see a s_max_mnt_count set to
0, which will annoy users.  (Addresses Debian Bug: #632637)
    
The default mke2fs.conf now has entries for "big" and "huge", which
are needed for very big file systems.

The resize2fs program now has support for a new online resize ioctl
that can support file systems > 16TB, once it arrives in v3.x kernels.

Fixed bug which caused resize2fs to fail when shrinking an empty file
system down to its minimal size.  (Addresses Sourceforge Bug #3404051)

Fixed tune2fs's mount options parsing.  (Addresses Debian Bug: #641667)

Allow tune2fs to remove external journals if the device can not be
found.

Debugfs's icheck will now correctly find inodes which use the
searched-for block as an extended attribute block.

Debugfs now has a new "punch" command which remove blocks from the
middle of an inode.

Debugfs now has a new "e2freefrag" command which analyzes the free
space fragmentation of the file system, using the same code as the
e2freefrag program.

Debugfs now has a "filefrag" command which displays information about
a file's fragmentation.

Add support to build a metadata-only, read-only, stripped-down version
of debugfs called rdebugfs.

Fixed a potential stack overrun bug in debugfs.

The badblocks program now correctly recovers from I/O errors when
direct I/O is being used.  The badblocks command now also supports a
-B option which forces the use of buffered I/O, and the -v option will
provide a more detailed breakdown of read, write, and failed
comparison errors.

Added e4defrag tool which uses the EXT4_IOC_MOVE_EXT ioctl.

Added support for journals larger than 2GB.

Support using both hard links and symlinks when installing e2fsprogs.

Add overflow checking to tune2fs -i's fsck interval, which must fit in
a 32-bit field.

The debugfs command now has a new 'blocks' command which prints out
data blocks of a particular inode in a format which is useful for
scripting.

Filefrag will report 0 extents correctly in verbose mode.  (Addresses
RedHat Bugzilla: #653234)

Filefrag has been fixed so its -v report prints the correct expected
block number (previously there had been an off-by-one error).  In
addition, it will now display the number of contiguous extents when -v
is not specified.  This makes it consistent with the number of extents
printed when the -v option was specified.  In addition, the number of
contiguous extents is far more interesting/useful than the number of
physical extents for very large files.  (Addresses Debian Bug:
#631498, #644792)
    
Logsave's usage message has been fixed.  (Addresses Debian Bug:
#619788)

Avoid an infinite loop in ext2fs_find_block_device() if there are
symlink loops in /dev caused by a buggy udev.

Added a useful "fallocate" program to the contrib directory.

Fixed an ABI compatibility problem in libext2fs which broke the dump
program.  Also added back some macros which dump needed so it could
compile against the latest version of ext2_fs.h (Addresses Debian Bug:
#636418)

Fixed parsing of MNTOPT_ options for tune2fs and debugfs (Addresses
Debian Bug: #641667)

Added internationalization support for libcom_err error table strings.

Fixed various spelling mistakes found in various output strings found
by I18N translators.

Update translations: French, Chinese, Germany, Indonesian, Swedish,
Vietnamese, Polish, Dutch, Czech.  (Addresses Debian Bugs: #520985,
#620659)

Fixed various Debian Packaging issues.  (Addresses Debian Bugs:
#614662, #632169, #641838, #627535, #629355)

Updated/clarified man pages.  (Addresses Debian Bugs: #639411,
#642193, #634883)

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

Initial support for quota as an integrated feature, where the quota
files are hidden system files that are automatically maintained by
e2fsck is present, although disabled by default.  It must be enabled
by using the configure option --enable-quota.

Reserved the on-disk fields for the metadata checksum and snapshot
features, which are currently in development.

The ext2fs library now has the new functions ext2fs_punch(),
ext2fs_get_memzero() and ext2fs_file_get_inode().

The ext2fs library now has support for calculating the crc32c checksum
(via the new functions ext2fs_crc32c_be and ext2fs_crc32c_le).

The I/O manager now supports the discard operation.

Reserved file system code points for new 1st class quota feature.

Shortened the compilation lines by moving the autoconf defines to
a config.h header file.

Fixed a potential free of an unitialized pointer in
ext2fs_update_bb_inode().

Fixed miscellaneous gcc -Wall and coverity warnings.

Fixed portability issues for Mac OS X, Hurd, and FreeBSD.

Fixed a build failure when OMIT_COM_ERR is defined.

Improved error checking and fixed memory leaks caused by error return
paths.

Add ext2fs_flush2() and ext2fs_close2() which takes a flag to allow
the fsync() to be skipped.

Added a test for extent-mapped journals by mke2fs and tune2fs.

Added a test for creating a large (over 4GB) journal using mke2fs.

Added a test to make sure the inode size remains constant.

The regression test script now prints the list of which tests failed.

The regression test system now uses /tmp for its scratch files, which
is often a tmpfs mounted file system and hence much faster.

The i_e2image test was fixed so it works with valgrind.

Tests that rely on debugfs are now skipped if debugfs wasn't built.

Fixed the dependencies for "make check" so all required dependencies
are built before running the gression tests.

A link to com_err.h is installed in $(includedir) during a "make install".

The po/*.gmo files are automatically rebuilt if they are missing or
out of date.  This helps out Debian packaging.

Allow ext2fs_get_memalign() to compile on systems that don't have
posix_memalign().

Fixed a namespace leak in libext2fs (tdb_null).


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
memory 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.
