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