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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

Fixed compile warning in mke2fs.c.

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

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

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

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

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

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


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

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

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


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

Fix resize2fs bug which causes it to access invalid memory.

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

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

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

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

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

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

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

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

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

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

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

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

Fix some big-endian bugs in e2fsck and libext2fs.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Work around a bug in autoconf 2.64.


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

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

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

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

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

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

Fixed filefrag for non-extent based files.

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

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

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

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

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

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

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

Fixed miscellaneous gcc -Wall warnings.

Fixed memory leak in error path in ext2fs_block_iterate2()

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

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

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

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

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

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

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

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

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

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

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

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

Update/clarify man pages.

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

Change badblocks to allow block sizes larger than 4k.

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

Update Chinese and Czech translation from the Translation Project.

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


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

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

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


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

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

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

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

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

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

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

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

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

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

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

Update Chinese translation from the Translation Project.

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

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


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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

Update Czech translation from the Translation Project.

Add Chinese (simplified) translation from the Translation Project.

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

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

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

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

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

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

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

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

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

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

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

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

Add support for building the blkid command statically.

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Update Catalan translation from the Translation Project.

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

Updated "make depend" information for crc16.o
    

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

E2fsck will now print the depth of corrupt htree directories.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

All source files no longer have any trailing white space.

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

The e2fpsrogs translation template now expands the @x abbrevation.

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

Fix a parallel build problem in e2fsprogs.

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Remove MASIX support from e2fsprogs.

Add I/O statistics reporting to e2fsck.

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

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

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

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

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

Fix gcc -Wall warnings

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

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

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

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

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

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

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

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

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


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

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

Updated Spanish and Catalan translations.

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

Add detection for ZFS volumes to the libblkid library.

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

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

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

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

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

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

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

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

Updated German, Dutch, Sweedish, and Vietnamese translations.

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

Update valgrind options in test_script to work with valgrind 3.2.3

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

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

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

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


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

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

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

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

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

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

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

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

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

Fixed a portability problem in libblkid with DJGPP.

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

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


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

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

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

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

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

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

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

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

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

Fix various gcc -Wall warnings.

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

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


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

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

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

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

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

Add portability checks to support compilation under DJGPP.

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

Fix memory leak in ext2fs_alloc_block().

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


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

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

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

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

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

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

Document the BLKID_FILE environment variable in the libblkid man page

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

Update e2fsprogs translation template and Vietnamese and Czech translations

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

Update Swedish translations from the Translation Project.

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

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

Updated e2fsprogs.spec file to include a new uuidd package

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

Add "make check" to the RPM spec file

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Add support in blkid to detect LUKS encrypted partitions.

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

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

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

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

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

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

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

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

Fix a signed vs. unsigned bug in debugfs.

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

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

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

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

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

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

Add libreadline.so.5 support to libss.

Impove badblocks -n/-w exclusive usage message.

Fix dump_unused segfault in debugfs when a filesystem is not open

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

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

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

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

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

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

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

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

Fix memory leak in ext2fs_write_new_inode()

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

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

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

Allow debugfs and dumpe2fs to support fs features under development.

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

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

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

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

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

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

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

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

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

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

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

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

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

Add GFS/GFS2 support to the blkid library.

Fix blkid support of empty FAT filesystem labels.

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

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

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

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

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

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

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

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

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

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


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

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

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

Remove unused variables and other lint/gcc -Wall cleanups

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

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

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

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

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

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

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

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

Added various FreeBSD portability fixes.

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

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

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

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

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

Updates/improvements to RPM spec file

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

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

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

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

Fix up usage and decrement error messages in the test_icount program

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

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

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

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

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

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

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

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

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

Fix typo in name of f_dup4 regression test

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

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

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


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

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

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

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

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

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

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

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

Add support for on-line resizing to resize2fs.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Fix a file descriptor leak in blkid library.

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

Add a regression test suite for the blkid library.

Fix a fencepost error in resize2fs caught by valgrind.  

Fix compiler warnings about missing memcpy prototypes.

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

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

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

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

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

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

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

Fix various gcc -Wall complaints.

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

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

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

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

Make test scripts more robust against locale-related environment variables

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

Fix type warning problem with time_t in debugfs.


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Updated and fixed translations.

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

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

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

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

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

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

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

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

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

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

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

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

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

Fixed gcc -Wall nits.


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

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

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

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

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

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

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

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

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

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

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

Fixed a compile-time error on Darwin systems.

Cleaned up the lib/ext2fs Makefile slightly.


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Fix filefrag so that it works correctly with sparse files.

Filefrag -v will print first and last blocks.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Fix a file descriptor leak in the filefrag program.

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

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

Fix bug in the blkid library when detecting the ocfs1 filesystem 

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

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

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

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

Change e2fsck to accept directories greater than 32MB.

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

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

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

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

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

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

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

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

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

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

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

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

Add ocfs and ocfs2 probe support into the blkid library.

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

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

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

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

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

Add support for Windows 9x/NT under Cygwin.

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

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

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

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


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

Fixed various gcc -Wall warnings.

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

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

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

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

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

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

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

Fix build of mke2fs.static.

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

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

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

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

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

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

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

Update gettext files to version 0.14.1.

Update to use autoconf 2.5x.

Improved support for compiling e2fsprogs under dietlibc.

Make e2fsprogs portable to Solaris and FreeBSD systems.

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

Add pkg-config files for e2fsprogs's libraries.

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Fix compile_et to output the correct prototype for
initialize_xxx_err_table_r() in the header file.  (Addresses Debian
bug #204332)

In the lib/et makefile, make sure com_err.info is deleted on "make clean".
  
Fix 64-bit warnings in e2fsprogs pass1b by using inttypes.h if
present.  This is for when we try stuffing an int into void * pointer.

Fix type-punning which can cause gcc 3.x to miscompile code by getting
confused about pointer aliasing.  ext2fs_getmem(), ext2fs_free_mem(),
and ext2fs_resize_mem() all now take a 'void *' instead of a 'void
**'.  The EVMS code uses an ugly union approach since we don't want to
modify the EVMS interfaces. 

Make sure all Makefiles use $(MAKE) rather than hardcoded "make", to
aid build process on systems can use invoke GNU make as "gmake".

Added regression testing for mke2fs.

Fixed gcc -Wall nitpicks.

Fixed various compiler warnings.

Add portability fixes for FreeBSD and for using fsctl under Darwin to
support ext2 ioctl's.


E2fsprogs 1.34 (July 25, 2003)
===============================

Fixed a bug introduced in E2fsprogs 1.30 which caused fsck to spin in
a tight loop while waiting for a child fsck to exit in some cases.
This burns CPU times which slows down the low-level filesystem check.

Added code to mke2fs to assure that the default block size for a
filesystem is at least as big as the sector size of the device, if it
can be determined.

Changed mke2fs and resize2fs to round the default size of a filesystem
to be an even multiple of the VM pagesize in order to avoid a Linux
kernel bug introduced when the storage of the buffer cache was moved
into the page cache.

Mke2fs will warn the user when creating a filesystem with journaling
and a blocksize greater than 4096.  (Addresses Debian bug #193773)

Fixed a bug in resize2fs which caused it to fail on filesystems with a
non-empty bad block list.  Resize2fs now discards any blocks on the
badblock list which are no longer part of the filesystem as the result
of a filesystem shrink.  (Note: this means that shrinking and then
enlarging a filesystem is no longer a reversible operation;
information about bad blocks in the part of the filesystem which is to
be chopped off will be lost.)

Changed resize2fs so the user can use prefixes to specify the units of
the new filesystem size (sectors, kilobytes, megabytes, or gigabytes),
and to make the error and informational messages explicitly display
the blocksize used by the filesystem, in order to avoid confusion.
(Addresses Debian bug: #189814)

Added a new debugfs command, dump_unused, which dumps the contents of
all unused blocks to stdout.  (Useful as an emergency try-to-find
deleted data command.)

Added a new debugfs command, imap, which prints the location of a
specified inode in the inode table.

Fixed a bug in the badblocks program which caused it to use one bit of
randomness in its non-destructive read/write test, instead of using a
full 8 bits of randomness.

Added a new option (-t) to badblocks, which allows the user to control
the test pattern(s) used when checking a disk.

The blkid probe function now more correctly detects UDF filesystems.

Fixed a bug in the blkid library which caused it to not update its
cache if a filesystem changes from having a label to not having a
label.

Fixed a bug in the blkid library wihch could avoid an infinite loop
in blkid_find_dev_with_tag() if /proc is not mounted and there the
/etc/blkid.tab file has not yet been created.

Fixed the badblocks program so that the destructive read/write test
honors the -c option, and to use O_DIRECT when possible to avoid
thrashing the system block buffer cache.

Fixed various NLS issues.
 - Added Czech and Swedish translations
 - Removed testing NYC translation
 - Fixed NLS support for message abbrevations in e2fsck
 - Remove de-utf.po, since we shouldn't have two versions using different
	charset encodings.
 - Used ngettext() (abbreivated with the macro P_(str1, str2, n)) to 
	simplify the statistics reporting in e2fsck.

Changed configure.in so that its defaults for *BSD systems no longer
build an fsck wrapper, and not to install in /usr/local by default.

Fixed some minor spelling errors/typo's in e2fsck and the configure
script.

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

Updated and clarified man pages.  (Addresses Debian Bug #195616)

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

Fix gcc -Wall nitpicks.

Updated gettext implementation used by e2fsprogs to 0.11.5, and enable
NLS support by default.  (Added partial workaround for gettext/Darwin
incompatibility problems.)

Added full MIT KRB5 and Himdall compaibility support to the com_err
library and the compile_et program.  (Addresses Debian bug #191900)

Added the blkid_known_fstype() function to the blkid library, which
returns true if it is passed a filesystem type which is recognized by
the blkid probing functions.

Improved the documentation for the blkid library.

Added the ext2fs_get_device_sectsize() function the the ext2fs library, which
returns the hardware sector size of a device, if it is available.

Added a dependency in the blkid library's .so file to the uuid
library, since the former uses the latter.  (Addresses Debian bug
#194094)

Added --with-diet-libc and --disable-evms to the configure script.

Fixed a minor memory leak in the badblocks program.

Fixed a portability problem in tune2fs --- not all systems have strptime().

Fixed a portability problem in debugfs with the use of getopt() more
than once.  Old-style BSD, new-style BSD, and Linux C libraries all do
things differently.

Add support Windows support to ext2fs_get_device_size().

Added (normally disabled) debugging code to the Unix I/O manager which
causes it to disable all userspace caching if the NO_IO_CACHE is
defined.

Changed the test I/O manager so it can always be linked into e2fsck,
mke2fs, and tune2fs if enabled via --enable-test-io-debug to the
configure script.  The test I/O manager will only print any debugging
information if the TEST_IO_FLAGS or TEST_IO_BLOCK environment
variables are set, which specifies which I/O operations are logged and
a block number to watch, respectively.  The log messages are sent to
stderr by default, unless a filename is specified via the
TEST_IO_LOGFILE environment variable.


E2fsprogs 1.33 (April 21, 2003)
===============================

Added a new utility program, logsave, which captures the output of a
command in a log file, even if the containing directory hasn't been
mounted yet (in which case the it saves the output in memory until it
can write out the logfile).  This is useful for capturing the
output of fsck during the boot sequence.

Fixed some portability problems that were causing problems under
the Cygwin32 environment.

Mke2fs now interprets a negative number to the -b option as a minimum
block size.

Fixed a bug in mke2fs which was incorrectly checking the argument to
the -g option if the default block size was used.  (Addresses Debian
bug #188319)

Fsck now explicitly ignores tmpfs and devpts, and it will complain if
it can not find filesystem checkers for jfs, reseirfs, and xfs.

E2fsck now updates the global free block and inode counters from the
block group specific counters quietly.  This is needed for an
experimental patch which eliminates locking the entire filesystem when
allocating blocks or inodes; if the filesystem is not unmounted
cleanly, the global counts may not be accurate.

Imported bug fixes to the EVMS plugin from the EVMS 2.0 tree.  (EVMS
2.0 is not yet supported; this only pulled in the bug fixes: fixed
possible hangs caused by bugs in calling waitpid, and not setting the
pipe to non-blocking mode; also fixed a file descriptor leak; made
sure all functions call log entry/exit functions.)

Badblocks now flushes its output file as bad blocks are discovered.

The uuid library is now more paranoid about assuming the correctness
of the /dev/random device; it mixes in a stream of bytes from
random/srandom, just in case.

Update Debian files to reflect the fact that I am now the Debian
maintainer of e2fsprogs.  Other various Debian-specific packaging
cleanups.

Move the source tarball generation functions from the top-level
makefile to the util/gen-tarball script.  

Updated the Turkish .po translation file.

Added Heimdal and MIT krb5 extensions to the com_err library to make
it more compatible with com_err libraries from those distributions.

Changed dumpe2fs to always display the superblock fields relating to
the journalling and/or directory indexing feature even if those
features are not enabled.

Updated and clarify copyright statement vis-a-vis alpha releases of
e2fsprogs.

The ss library will now try to dynamically link to the readline
library and use it if it is present in the system.  This means that
the debugfs program now has line editing and history features.  The
SS_READLINE_PATH environment variable is used to find a readline or
readline-compatible library.

E2fsck now finds most duplicate filenames (all when rebuilding all
directories via the -D option) and offers to delete or rename
duplicate filenames/directory entries.  (Addresses Debian Bug #176814).

Fix bug in e2image.  When writing out a raw image file, include data
blocks from symlinks that do not store the symlink within the inode.

Fix bug in resize2fs which incorrectly moved the block and inode
bitmaps for sparse superblock filesystems and incorrectly marked
blocks as in use.  (Addresses Debian bug #174766)
 
Added a new shared library, the blkid library, which efficiently
allows fsck, mke2fs, e2fsck, and tune2fs to be able to look up LABEL
and UUID filesystem specifiers without needing to search all of the
devices in the system.  Instead, the device is looked up in a cache
file, and then verified to make sure the blkid cache is correct.

Tune2fs and e2label will accept LABEL=xxx and UID=yyy specifiers for
the device name, using the blkid library.  (Addresses Debian bugs
#166048, #179671)

Fsck now supports backslash escapes in /etc/fstab so that \040 can be
used for spaces in device labels.

Removed 32-bit limitations for debugfs's dump command.

If the user specifies a large number of inodes, Mke2fs will
automatically adjust the number of blocks per group to find a valid
set of filesystem parameters.

Add workaround to detect broken MD devices where when some of the
underlying devices are marked read-only, writes to the MD device are
silently dropped.  E2fsck will detect if there is an attempt to run
the journal twice, and abort with an error if this is the case.
(Addresses IBM Bugzilla bug #1226)

E2fsck will print an error if more than one of the -p/-a, -n or -y
options are specified.

E2fsck will fix HTREE corruptions in preen mode, without stopping the
boot process.  This is needed because the 2.4 ext2 filesystem
accidentally had the INDEX_FL backwards compatibility code removed.

Mke2fs no longer creates filesystems with the dir_index flag set by
default; the user has to specifically request it.

Update and clarified various man pages. (Addresses Debian bugs
#173612, #175233, #175113, and #170497, #185945, #188318)

Created man page for the mk_cmds program (from the libss library).

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

Fix various gcc -Wall nits.

Fixed a lot of portability problems that caused e2fsprogs not to build
successfully under Solaris and Apple/Darwin.

Fixed a Makefile dependency to allow building e2fsprogs using parallel
make jobs.

Changes to create a subset distribution which consists only of the
et, ss, uuid, and blkid libraries.  The configure script and top-level
makefile were changed to support working with a subset distribution.

Removed EXT2_FEATURE_RO_COMPAT_BTREE_DIR mention of since it's not
actually used, and might people who are looking for
EXT2_FEATURE_COMPAT_DIR_INDEX, which is in use.

Updated debian files to fix a number of Lintian warnings.

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

Removed unnecessary libraries from being linked into the fsck, lsattr, 
chattr, and blkid executables.

E2fsprogs 1.32 (Nomvember 9, 2002)
==================================

Fixed a bug in the Unix I/O routines which caused needless writebacks
of clean blocks from the unix_io cache (they were erroneously marked
as being dirty, so they were getting written back to disk before
getting evicted from the disk cache).  This was harmless, but it
significantly slowed down e2fsck.

Made some other minor optimizations to the Unix I/O routines to save a
small amount of CPU time.

Updated internationalization files.


E2fsprogs 1.31 (Nomvember 8, 2002)
==================================

Update EVMS ext2fsim plugin with EVMS 1.2.  (We still support
compiling the fsim plugin with EVMS 1.0 and 1.1.)  Add better error
handling for child process that die unexpectly.  Add a hack to force
mkfs to create filesystems that won't cause problems with hardware
that has 2k or 4k minimum blocksize requirements.  Read from child
processes in non-blocking mode, so that the GUI continues to update.

Fix e2fsck so that it returns the appropriate exit code when the root
filesystem has been changed, so that system's rc scripts will be told that 
the system needs to be rebooted.

Fix a bug in ext2fs_flush/ext2fs_close; when the MASTER_SB_ONLY flag
was set, some of the descriptor blocks that should have been written
out were getting skipped.

Changed e2fsck to force out changes to the backup copies of the
superblock and block group descriptors when important changes are made
to those data structures.

Fix a bug where e2fsck could erroneously mark a filesystem as being
clean if a check of dirty filesystem is interrupted with a ^C.  (Bug
introduced in e2fsprogs 1.28.)

If journal debuging is enabled using --enable-jbd-debug, the debugging
level is now set via the E2FSCK_JBD_DEBUG environment variable.

If byteswapping support is disabled using configure --disable-swapfs,
skip the tests which depend on byte-swapping, so that "make check"
won't bomb out.

Lshattr will now display the indexed directory flag.  Also, some of
the more esoteric compression flags are supressed unless compression
support has been enabled.

Update man pages.


E2fsprogs 1.30 (October 31, 2002)
=================================

When resizing a filesystem, and inodes need to moved, resize2fs will
update the inode's ctime field, and the mtime field of the containing
directories, so that incremental backups using dump/restore will work
correctly.

In order to avoid spurious errors, e2fsck wil check the last
superblock write time to determine whether or not it can safely use
the LOW_DTIME checks to determine if there are inodes on the orphan
inode linked list that had somehow gotten disconnected.  (Addresses
Sourceforge bug #620980)

Partition in /proc/partitions that being with the string "lvm" are
considered real partitions even if they do not end with a number.

Fixed a bug in the the uuid generation function, where if /dev/urandom
is not present, but /dev/random is, and there isn't sufficient
entropy, the get_random_byte function could spin a loop forever.

E2fsck, mke2fs, etc. will now reliably notice when image files are
mounted using the loopback interface.  (Addresses Sourceforge bug
#619119)

When flushing buffers (as is done by badblocks, for example) check to
see if the BLKFLSBUF ioctl succeeds, and if so, avoid using the
FDFLUSH ioctl which causes the MD device driver which causes confusing
syslog messages about obselete ioctl messages.  (Addresses Sourceforge
bug #545832).

Debugfs's write command now checks to see if the destination filename
exists before creating it.  (Addresses Sourceforge bug #478195.)

When installing man pages, search for compressed man pages using all
commonly used compression extensions (i.e., .Z, .gz, .bz2, etc.)

Fixed a bug in fsck where multiple filesystems specified on the
command were not being checked in parallel due to a logic bug
introduced to support the FSCK_MAX_INST environment variable.

We have added a new superblock field, s_mkfs_time, which indicates
when a filesystem was created.  It is set via mke2fs, and printed out
by dumpe2fs, but is not actually touched by the kernel.

Dumpe2fs has been made more robust by not aborting if there is an
error reading the block/inode bitmaps; instead it will still print out
the location of the block/inode bitmaps and inode table.

Add support for the an alternative block group descriptor layout which
allows for on-line resizing without needing to prepare the filesystem
in advance.  (This is the incomat feature flag meta_bg.)

Add support for storing default mount options in the superblock, so
that the filesystem can be mounted with specific mount options without
needing to specify them on the mount command line or in the /etc/fstab
file.

Add support for a new inode flag, which is to be used for indicating
the top of directory hierarchies for the Orlov block allocator.

Fix e2fsck so that if it creates the lost+found directory, it does so
with the more apporpriate permissions of 0700.  Also change
mklost+found so that it also creates the directory 0700.

Fixed format bug in e2fsck if NLS is in use.
  
Add a German translation for e2fsprogs's NLS support.

Fixed e2fsck so that it more handles BAD_BLOCK_IN_INODE_TABLE even at
the beginning of the inode table.  This won't matter much, since if
there is a bad block at the beginning of the inode table, the root
directory won't be available.  But at least e2fsck won't crash in this
case.

Fixed endian problems in the htree code for e2fsck and debugfs.
  
When byte-swapping a filesystem on a PPC architecture, byte-swap the
bitmaps since the historical big-endian ext2 variant had byte-swapped
bitmaps, and the ext2fs library assumes this.  This fixes the
regression test suite on PPC machines.

Fix e2image so that it handles a bad block in the inode table
appropriately.

E2fsck now uses a more sophisticated algorithm to salvage corrupted
directories that recovers more information in the corrupted directory
block.

E2fsck now performs additional consistency checks on indexed (HTREE)
directories.

Fix bug where efsck might get confused about whether a completely
empty directory block is an empty leaf block or an interior htree
node.  This could cause e2fsck to get confused into think that a valid
indexed directory was corrupted.

E2fsck no longer creates an empty directory entry at the end of a
directory block when optimizing a directory.  This would cause some
earlier versions of the dxdir kernel code to corrupt the directory
when attempting to split a node containing an empty directory entry.

E2fsck could sometimes in rare circumstances leave the indexed flag
set after a small directory was optimized by compressing it instead of
indexing it.  (This should never happen in real life, since
directories that small wouldn't have been indexed, but better safe
than sorry.)

E2fsck now only updates the master superblock in all cases.  This
slightly shortens its run time.

Ext2ed can deal with directory entries of length 0; previously it
would get stuck in an infinite loop.

Fsck now has support for reiserfs volumes when parsing LABEL= and UUID=
specifiers.  (Sourceforge patch #613447)

Badblocks will now work correctly on read-only devices such as
CD-ROM's.  (Sourceforge patch #600451)

Updated and clarified man pages.  (Addresses Debian bug #167108)


E2fsprogs 1.29 (September 24, 2002)
===================================

Fixed a bug in e2fsck which could corrupt a directory when optimizing
it (via the -D option) or rebuiliding the hash tree index with a 1 in
512 probability, due to a fence post error.

Fixed a bug in the LVM support code which caused LABEL='xxx' not to
work correctly.

Mke2fs now enables the directory indexing flag by default.  (Since
this is a compatible feature flag, it's safe to do so.)

Tune2fs will support setting the directory indexing feature flag.  It
will automatically set up the default hash algorithm and hash seed
fields in the superblock.

If the bone-headed user enters the root filesystem twice in
/etc/fstab, the -R option which skips the root filesystem will skip
all of them.  (Addresses Debian bug #159423).  Note!  This is not a
precedent for dealing intelligently with any other kind of doubled
entry in /etc/fstab!


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

Removed perror declaration in lib/et/internal.h.  All modern systems
can be expected to define perror() these days.  Besides, the lib/et
code wasn't using perror at all anyway.  :-)


E2fsprogs 1.28 (August 31, 2002)
================================

Add support for the Hashed-Tree Directory Indexing to e2fsck.  Support
for setting the htree flag is not included yet, although it can be
manually turned on via the debugfs program.

Clarified e2fsck error message which is printed when it cannot find
sufficient contiguous block when relcating filesystem metadata.

Added support for building an EVMS plugin module for ext2/3.  This
module is substantially the same as the EVMS module shipping with EVMS
1.1, with one or two bugfixes.  E2fsprogs can also build this plugin
for use with EVMS 1.0 (which did not include the ext2 plugin module),
if the configure --enable-old-evms flag is given.

Fsck will search through EVMS volumes when trying to resolve
filesystem specifications such as LABEL=xxx or UUID=xxx.
  
Added a new utility program, /sbin/findfs, which will return
filesystem specifications such as LABEL=xxx or UUID=xxx, and prints
the device name.

Update and clarified various man pages. (addresses Debian Bug #145044,
#146437, #131350, #151990, #144621, #141938)

If there are no filesystems specified on fsck's command line, fsck now
treat that as if the -As options were given.  Previously it would
simply do nothing.  (Addresses Debian Bug #153102)

Mke2fs no longer treats a failure to be able to clear the MD signature
at the end of the filesystem as a fatal error.  (Addresses Debian Bug
#155007)

The e2p library functions (which are used by lsattr and chattr) now
double check to make sure the file is a regular file or directory
before attempting to use the ext2 ioctls.  Some device drivers
unfortunately respond to the ext2 ioctl's with unknown behaviour.
(Addresses Debian Bug #152029).

The extended attribute handling has been updated to correspond with
the latest V2 bestbits ACL code.

Fixed bug in e2fsck which caused it to not clear the dtime field when
processing truncated inodes on the orphan list.  This could cause data
loss(!) if a filesystem is rebooted before a truncate has been
committed.

E2fsck now uses red/black trees in pass1b, which removes some O(n**2)
algorithms.  This makes e2fsck much faster in the case of severely
corrupted filesystems where a large number of blocks are claimed by a
large number of inodes.  (Thanks to the 2.5 IDE device driver for
inspiring this work.)

Resize2fs has been significantly sped up when shrinking and expanding
a filesystem by a very small number of blocks (for example, when EVMS
is converting a partition to be an EVMS legacy volume).

Added a new option to e2fsck, -D, which will optimize or compress all
of the directories in the filesystem.

E2fsck now catches SIGINT and SIGTERM to make sure it will can
properly clean up and only exit at safe points.  Fsck will pass
SIGINT/SIGTERM to its child processes, and wait until they have all
exited before it exits.

The uuid parsing code in the uuid library now properly complains when
an illegally formated uuid is presented to it.  (Addresses Debian bug
#152891)

Restrict use of the 2.4 setrlimit ABI f*ckup to kernels between 2.4.10
and 2.4.17, since the workaround can cause problems when using a 2.4
kernel with an old version of glibc built with the 2.2 headers.

Fixed a bug in mke2fs where it wasn't properly clearing the initial
superblock used by other filesystems.  (Addresses Debian bug #147256.)

Added support for the synchronous directory feature written by Andrew
Morton.

The debugfs program can delete directories using the rmdir command.

Add support for 8k and 16k filesystems (for systems with page sizes
that are greater or equal to 8k or 16k, respectively).  Note that
these filesystems can not be mounted on x86 systems, or other systems
with only 4k page sizes, due to limitations in the current Linux VM
code.

Resize2fs requires that the filesystem state be valid and have no
errors; otherwise, e2fsck -f must be run first.  (Previously it simply
required that the last fsck time be greater than the last mount time.)

Configure now defaults the man pages directory to /usr/share/man on
Linux systems.

E2fsck now offers to truncate inodes which contain too many blocks (so
that i_blocks would overflow.  Also fixed handling of large sparse
files.

E2fsck now more completely checks for symlink validity, including
requiring NULL termination and length checks.

E2fsck will offer to try forcing a disk write to remap a bad block
after finding a read error when reading a filesystem metadata block.

Fixed a bug in debugfs which caused the -b and -s options to crash
debugfs, as well as breaking the testb, setb, and clearb functions.

Added a bmap command to debugfs which calculates the logical to
physical block mapping for a particular inode.

Fixed a bug in code which checked to see if a device was mounted which
sometimes (rarely) failed in the case of a plain file.

Fixed a bug in resize2fs where when it reported an error, it would
print a message erroneously indicating that the filesystem had been
resized before it aborted.

When resizing a plain file which is smaller than the requested size,
resize2fs will attempt to extended the file so that programs like
e2fsck will not complain that the file is too small.

Resize2fs will print the actual new size of the filesystem when it is
finished resizing.

Fixed a bug in debugfs where "ls -l" would report incorrectl file type
information on big-endian systems.


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

Fixed collisions with C++ reserved words.

Added portability fixes for building e2fsprogs on the HURD and AIX.

Added the ext2ed program for creation of test cases.  (ext2ed has many
limitations and bugs which make it unsuitable for production use.)

The ext2fs_read_dir_block2 and ext2fs_write_dir_block now take a new
flag, EXT2_DIRBLOCK_V2_STRUCT, which will will reverse when the
name_len field is byte swampped on big-endian machines, since in the
V2 structure, name_len is a char field which is doesn't need to be
byte swapped --- except if an old-style kernel had byte-swapped the
name_len field as part of the V1 structure.
  

E2fsprogs 1.27 (March 8, 2002)
==============================

The warning messages for mke2fs now go to standard error.

Fixed to make sure "make check" runs all of the test programs with
LD_LIBRARY_PATH set, so that we test the libraries in the build tree.

The mke2fs program checks the boot sector for the BSD disk label, and
avoids erasing it if it is there.

Fixed a bug in e2fsck which caused it to core dump if the journal
inode was missing when it was supposed to be there.

E2fsck now prints ranges in pass 5 when printing deltas for the block
and inode bitmaps.

Debugfs's "ls -l" command now will print out the file type information
in the directory entry.

Create man pages and hard links for fsck.ext3 and mkfs.ext3.  If
mke2fs is invoked as mkfs.ext3, create the filesystem with a journal.

Debugfs can now examine the experimental directory indexing
information.

Fixed bug in debugfs which caused it to core dump if modify_inode is
called without an open filesystem.

The debugfs lsdel command now runs its output through a pager first.

When installing manual pages, remove the compressed manual pages first.

Synchronized with Debian's packaging information for e2fsprogs-1.26-1.

Fix the 2.4 resource limitation workaround introduced in 1.26 which
actually broke things on mips32, sparc32, and Alpha platforms.

Updated the I18N code so that calls to setlocate(LC_CTYPE, 0) are made
(which is required by the newer libintl libraries).

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

Fixed various gcc -Wall complaints.

Fixed a few memory leaks in the e2fsck journaling code, and in the
ismounted code checking for a swap device.

Add new inode I/O abstraction interface which exports an inode as
an I/O object.
  
Exported ext2_file_flush as a public interface.
  
In ext2_file_write, we now mark the buffer void * argument as a const, since ext2_file_write doesn't modify the buffer.

Lots of small random portability fixes to make e2fsprogs build under
AIX --- even without the 5L compatibility toolkit, and even using the
uber-crippled AIX native C compiler.


E2fsprogs 1.26 (February 3, 2002)
=================================

Dumpe2fs will keep going now if the bad block inode can't be read.
(Previously it stopped with a fatal error.)

E2fsck will now give an opportunity to run the journal even if the
recovery flag is not set.  This is the default behaviour if e2fsck is
using a backup superblock, since the needs_recovery flag will never be
set in the backup superblock copies.

E2fsck now automatically finds the backup superblock/group descriptors
even when the primary superblock is completely destroyed for 2k and 4k
filesystems.  (Previously it just guessed/assumed that we were dealing
with a 1k filesystem in that case, and users had to manually specify
the backup superblock number.)

Fixed a bug in e2fsck where it dereferences a null pointer when there
is a problem opening a filesystem in preen mode.

E2fsck now handles external journals correctly; previously it trashed
the external journal device if the journal needed to be replayed.

Work around ulimit incompatibility problem caused by recent 2.4
kernels; the unix IO module will automatically try to set any resource
limits to be infinite on startup.

Fixed a bug in e2fsck where it wasn't allocating a new block or inode
bitmap if it wasn't present and the blocksize was 2k or 4k.
 (Addresses Debian Bug #116975)

E2fsck will check and fix botched ext3 V1 to V2 superblock updates by
clearing the new V2 fields if they do not make sense or if the ext3
superblock is version 1 superblock.

E2fsck will automatically relocate the ext3 journal from a visible
file (i.e., /.journal) to an hidden inode if the filesystem has been
opened read/write.  This allows the users to add a journal while the
filesystem is mounted, but the next time the system is rebooted, the
journal file will disappear.  This avoids problems with backups,
stupid operators with superuser bits, etc.

Fix a bug in fsck where it would not support a filesystem type of
"auto" if the device was specified in terms of LABEL=xxx or UUID=xxx.

Fsck now supports fstab entries of the form "ext3,ext2".  It will also
automatically identify reiserfs filesystems.

The number of processes spawned by fsck can now be limited using the
FSCK_MAX_INST environment variable.

Fsck now searchs the LVM proc hierarchy to find logical volumes which
should be searched for  UUID and label information.

Work around a bug in 2.4.10+ kernels by trying to unset the filesize
limit if at all possible, when opening a block device.  (The filesize
limit shouldn't be applied against writes to a block device.)

In mke2fs and e2fsck, specifying the -c option twice will now do
a read/write test on the disk.  Update the man pages to encourage
using the -c option, and to discouraging running badblocks separately,
since users tend to forget to set the blocksize when running 
badblocks.

Mke2fs now automatically clears the immutable attribute on a
pre-existing .journal file left over from a previous failed attempt to
add a journal to an alreadyy-mounted filesystem.

Fixed mke2fs's exit codes to consistently indicate when the mke2fs
operation failed.

Mke2fs now creates the lost+found directory with permissions of 0700,
so that files that had previously lived in protected directory are
safe if they get dropped in lost+found and the system administrator
doesn't deal with immediately.  (Addresses Debian #bug 118443)

Mke2fs and e2fsck (and all programs that use the
ext2fs_check_if_mounted function) will now properly identify that a
device is mounted, even in cases where devfs has confused things with
multiple devices names with the same identity, or if a dim-witted
system administrator has done something stupid like creating device
file aliases in their home directory.  Also now checks for swap devices
by using /proc/swaps.  (Addresses Debian bug #106622)

Added a new option (-T) to tune2fs which sets the time a filesystem
was last checked.

Speed up e2image when creating sparse raw image files by optimizing
away excess lseek() system calls.

Fix support of large (> 2GB) files when used as a filesystem in
mke2fs, tune2fs, debugfs, and findsuper.

Debugfs's stat and icheck commands now properly deals with large (>
2GB) files.

Debugfs's set_super_value command now prints out the list of valid
superblock fields which can be set using the command.

Debugfs's rm and kill_file command now updates the superblock free block
and inode counts, thus keeping the filesystem consistent.

Debugfs's lsdel command now takes an optional argument which allows
the user to only see the most recently deleted files.

A new command (undel) was added to debugfs which automates
undeleting a deleted inode and linking it back to a directory.

Debugfs's ls command now takes a new option, -d, which lists 
deleted directory entries.

Debugfs's testb, freeb, setb, and find_free_block commands now take an
optional count argument.

Add support for a new ext2 file attribute, EXT2_NOTAIL_FL, which will
be used to signal that a particular inode should not be eligible for
tail-merging --- this is needed for programs like LILO.

The findsuper (an unreleased, uninstalled utility program) has been
improved to add extra validity checks and to add a progress meter.
(It is still an unsupported program; the officially supported way to
recover from a trashed partition table is to use gpart; findsuper is
for wizards only.  :-)

Debugfs was fixed to compile with "configure --disable-swapfs".

Cleaned up various manual pages.   (Addresses Debian bug #119624, #120171)

Added new translation file for Turkish.

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

Fix general gcc -Wall complaints.

E2fsprogs (mostly) works with the dietlibc.

The programming texinfo file has been expanded to include description
of additional libext2fs functions.  (Still not compeltely done, but a
lot of the more important functions have been documented.)

Added a umask structure to struct_ext2_filsys, which currently only
modifies the behaviour of ext2fs_mkdir(), but if we add any file
creation functions to libext2fs, we should also make sure they respect
the umask setting.

The build-rpm script was fixed to be a bit more safe.

The tests' Makefile now has a way of automating test case creation 
for e2fsck, using "make testnew".

Created a new function, ext2fs_dir_iterate2 which passes more
information to the callback function (identical to the one used by
ext2fs_dblist_dir_iterate).  The directory iterator functions take a
new flag, DIRENT_FLAG_INCLUDE_REMOVED, which will return deleted
directory entries.  If the directory entry is deleted, the callback
function will be called with the entry paraemter set to
DIRENT_DELETED_FILE.
  
Added new functions, ext2fs_inode_alloc_stats and
ext2fs_block_alloc_stats, which takes updates block/inode allocation
statistics in the bitmaps, block group descriptors, and superblock
when inodes or blocks are allocated or deallocated.


E2fsprogs 1.25 (September 20, 2001)
===================================

This is primarily a bug-fix release; no new features were added, but
there are a number of embarassing bug fixes and cleanups applied.

Fix a bug mke2fs which causes stack garbage to be written to disk when
zapping disk sectors.  (This bug could cause mke2fs to core dump for
some kernels, I suspect with security enhancement patches.)

Remove unneeded #include of <linux/config.h> which was breaking
building e2fsprogs on the Hurd.  (Addresses Debian bug #112414.)

Updated tune2fs man page to reflect the fact that adding or removing a
journal doesn't require running e2fsck.

Remove use of AC_REQUIRE from autoconf which had been used to prevent
AC_CANONICAL_HOST from being called twice; unfortunately this causes
recent autoconf to bomb out since they don't allow AC_REQUIRE to be
used outside of autoconf macros.  Fortunately, it doesn't seem to be
necessary any more, anyway.

E2fsck will now not fall back to an alternate superblock if the user
specifies the superblock location explicitly on the command-line.
This allows easier recovery from a situation where the primary
superblock and block groups are slightly corrupted, but the backup
superblocks are completely broken.  

Fix problem which caused compile_et and mk_cmds to blow up if
e2fsprogs was in a directory with a pathname that contained spaces.

We are now more paranoid about checking the entry in /etc/mtab to make
sure the filesystem is really mounted, since some broken distributions
(read: Slackware) don't initialize /etc/mtab before checking non-root
filesystems.  (Slackware also doesn't check the root filesystem
separately, and reboot if the root filesystem had changes applied to
it, which is dangerous and broken, but there's nothing I can do about
that.)

Make UUID library C++ friendly by adding appropriate extern "C"
declarations and using const in the function declarations.

Fix up the com_err texinfo file so that it can product a valid info
file (previously, it could only be used to generate paper
documentation using texinfo.tex).


E2fsprogs 1.24a (September 2, 2001)
===================================

Fix brown-paper bug in mke2fs which caused it to segfault when
printing the version string.


E2fsprogs 1.24 (August 30, 2001)
================================

Revert the BLKGETSIZE64 support, since for some distributions, this
ioctl has been used by an unofficial kernel patch to update the last
sector on the disk, and this was causing disk corruption problems as a
result.

Mke2fs is now more careful about zapping swap space signatures and
other filesystem/raid superblock magic values so that programs like
mount who try to use hueristics to determine the filesystem type of a
partition are less likely to be confused.

E2fsck will no longer complain if the the mode of EXT2_RESIZE_INO is a
regular file (since Andreas Dilger's on-line resizing tools will set
its mode bits).

Fixed some minor texinfo, man pages nits for spelling errors,
texinfo warnings, etc.  (Addresses Debian bug #110621.)

E2fsprogs program no longer print the filesystem version number
(i.e. 0.5b), since it only confuses people and doesn't serve any real
purpose.

E2fsck will once again compile under libc5, since it will supply its
own version of strnlen if necesssary.

mke2fs and tune2fs will allow the use of UUID= or LABEL= specifiers
when specifying the external journal device.  tune2fs will also search
devices looking for the externla journal debice when removing.  

E2fsprogs 1.23 (August 15, 2001)
================================

Add initial support for extended attributes (EA); e2fsck will
correctly handle a filesystem with EA's and check the EA blocks for
corruptions.

E2fsck's symlink sanity checking has been cleaned up.  It now checks
the i_size value of fast symlinks, and checks for immutable flags
being set of symlinks, etc.

E2fsck now offers to clear inodes which are special files that have a
non-zero i_blocks or i_size field.  (The i_size field check was in the
previous version of the code, but due to a bug it didn't offer to
clear the inode unless i_size and i_size_high were both non-zero.)

E2image can now create "raw" image files, which only contain the
filesystem metadata placed in a spare file so that e2fsck, dumpe2fs,
debugfs, etc., can be run directly on the raw image file.

Add support for the 64-bit block device patches.

Fixed bugs in creating external journals with a 1k blocksize.

Add initial support for external journals (so long as the external
journal only supports a single filesystem) in e2fsck.

Remove requirement for needing to run fsck on a filesystem after
removing a journal (either internal or external).

The man pages now document how to create and manage external journals.

Speed up the check of an ext3 filesystems by avoiding a needless flush
of all of the superblock and block group descriptors.

Speed up creating an internal journal using tune2fs in the case where
the filesystem has a lot blocks already allocated.

Tune2fs has been fixed to make sure that only error messages go to
stderr, and normal message go to stdout. (Addresses Debian bug #108555)

Fixed a minor bug in mke2fs; if -O none is passed to mke2fs, it will
now not set the sparse_super feature.  (Addresses Debian bug #108165)

Add support in fsck for the filesystem type "auto".

Fsck -A will not try to interpret device names for filesystems which
have a pass number is 0.  (Addresses Debian bug #106696).

Fsck prints a warning message if now valid filesystems are passed to
it.  (Addresses Debian Bug #107458.)

E2fsck now gives an explicit warning if there filesystem still has
errors at the end of the run. (Addresses Debian bug #104502)

E2fsck will set the EXT2_ERROR_FS flag if the journal superblock
reflects an error.  E2fsck will also not run the orphan list if the
filesystem contains errors, since the orphan list might be corrupted.

E2fsck now prints the number of large files when given the -v option.

Fixed minor memory leaks in e2fsck.

Some minor man pages updates. (Addresses Debian bug #30833, #108174)


E2fsprogs 1.22 (June 22, 2001)
==============================

Fixed a bug in e2fsck's handling of orphan inodes which are special
files (i.e., block/character device files, named FIFO's, etc.).

Fixed a bug accidentally introduced in e2fsprogs 1.21 which caused
tune2fs to fail at adding a journal to a mounted filesystem.

Fixed a few big-endian bugs in e2fsprogs
	* The directory block functions were accidentally reporting
		some directories as corrupted when they weren't.
	* If e2fsprogs is compiled --disable-swapfs, the C language 
		equivalents weren't being included for big-endian platforms.
		(Fixes Debian bug #101686).

Fixed a Hurd compilation problem.  (Addresses Debian bug #101361)

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

Use platform independent method of defining the BLKFLSBUF and FDFLUSH
ioctls, and allow them to be defined for non-i386 platforms.

The uuid.h header file is now protected against multiple inclusions.

E2fsprogs is now being developed using BitKeeper.  Changed the test
scripts to deal with BK's stripping CR characgters from text files,
and changed the top-level Makefile.in to avoid including BitKeeper
files when generating the source tarball.


E2fsprogs 1.21 (June 15, 2001)
==============================

Added new configure flags which allow a subset e2fsprogs to be built;
this is most useful for boot floopies, since the resulting shared
libraries and programs are slimmed down by removing features that
aren't necessary for a boot floppy.  The new flags that were added
are: --disable-swapfs, which removes support for byte swapping old
legacy PPC/68k filesystems, --disable-debugfs, which removes support
for debugfs from the libext2fs library, --disable-imager, which
removes support for the e2image program, and --disable-resizer, which
removes support for resize2fs.

E2fsck now prints the number of mounts or days elapsed since the last
check when e2fsck is forced to check an otherwise clean filesystem.

Tune2fs now prints an informative message about how often a filesystem
will be checked when adding a journal to the filesystem, to remind the
user that he/she may want to adjust those parameters using tune2fs
-c/-i.

Worked around hurd brain-damage which causes e2fsck to sometimes
believe a filesystem is the root filesystem based on device numbers
(since Hurd doesn't have dev_t's, which is arguably a POSIX.1
violation).

Fixed a bug introduced in 1.20 which caused e2fsck to abort with an
erroneous error with the -F option was specified.

Fixed a ext3 recovery bug in the revoke handling; synchronized with
ext3 0.7a.

Fixed two bugs in e2fsck's handling of dup block handling, dealing
with relatively uncommon edge cases: a directory with an indirect
block which is claimed by another file, and when the last inode in the
filesystem has blocks claimed by another file.

E2fsck now checks to see if the i_size field of a fast symlink is too
big, and offers to clear the symlink if so.

E2fsck now checks to see if i_size_high of special files is non-zero,
and offers to clear i_size_high.

Fix e2fsck's handling of incompatible journal flags so that the user
has chance to abort, and then has the option to clear out the journal
entirely.  (Addresses Debian bug #98527.)

Fixed a bug in fsck which could cause it to core dump if a mix of
standard and non-standard device names are used in /etc/fstab.
(Debian bug #100559)

Fixed a bug in debugfs which caused read errors when copying a file to
not be noticed.

The debugfs set_super_value command can now modify the s_lastcheck field.

Fixed a bug in lsattr and chattr which was accidentally introduced in
1.20 to support > 2GB files; both lsattr and chattr wasn't reading
directories correctly because the change modified the layout of struct
dirent to be incompatible with the libe2p shared library.

Cleaned up the mke2fs manual page and included a discussion about why
it's good to periodically check the filesystem even when journaling is
enabled.

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

Fix general gcc -Wall complaints.

The types needed by the ext2 header files are now provided by
lib/ext2fs/ext2_types.h, instead of include/asm/types.h.

Integers are now preferred to longs when trying to find a 32-bit type
in ext2_types.h.  Also, if linux/types.h has already been defined,
don't try to redefine the types.

Fixed make depend script so that it automatically corrects the
pathname cleanups performed by make -M, so I don't have to fix them up
by hand.

Fixed the d_loaddump test case to be more robust, and not depend on
bash'isms.

Removed debugfs's dependence on pread(), which was accidentally
intrudced in e2fsprogs 1.20

Fixed a performance bug in the libext2fs's icount routine; the size
estimate of the icount array was incorrectly being calculated.

Removed use of the badblocks compatibility functions in the e2fsprogs
programs.

Added paranoia code which protects against strange cases where /etc
isn't on the root filesystem, or if /etc/mtab doesn't exist.

The header file ext2_types.h is now installed.

Autoconf is used to determine when we are on big-endian machines,
instead of doing run-time tests, to save a few bytes of code.

The ext2fs_mark_generic_bitmap and ext2fs_unmark_generic_bitmap
functions are no longer inline functions, which saves space and
doesn't really cost any real performance.

The ext2fs library no longer depends on the e2p library.  (What need
there was of it --- namely, fsetflags, was coded in-line).

Fixed the makefile so that lib/ext2fs/ext2_types.h is generated even
when the user is stupid and tries compiling the package using "make
install" as root.

Miscellaneous code cleanups:
	* Added missing files from Makefile.in's SRCS file, so that 
		their dependencies would be properly calculated.
	* Removed redundant code
	* Fixed comments in code
	* Removed no-longer unneeded argsused #pragma.


E2fsprogs 1.20 (May 20, 2001)
=============================

Add support for replaying the ext3 journal purely in user mode,
including handling the orphaned inode list.  Used code contributed by
Andreas Dilger, with bug fixes and the orphaned inode handling done
by Theodore Ts'o.

The mke2fs and tune2fs programs can create or modify a filesystem to
include an ext3 journal.  Tune2fs also can be used to remove an ext3
journal from a filesystem.

E2fsck will now check for the existence of a linked list of orphan
inodes in the superblock, and clear those inodes before starting the
rest of the filesystem check (but after the journal playback).

E2fsck now validates the file descriptor passed to the -C option,
which saves against the completion bar getting written to an
unexpected location, such as the disk being checked.  (Debian
bug/wishlist #55220)

E2fsck will now bump the filesystem revision number from zero to one
if any of the compatibility bits are set.

Fixed a bug where a badly corrupted directory on a big endian system
could cause e2fsck to die with a bus error.  The
ext2fs_read_dir_block() and ext2fs_process_dir_block() functions in
the ext2 library now does alignment sanity checks on the rec_len field
of the directory entry before using it.

The ext2 library has been enhanced to make tune2fs safe to run on
mounted filesystems.  (Users could usually get away with using tune2fs
on mounted filesystems before, but with the advent of ext3 and
journaling, it became important to make tune2fs was *really* safe for
use even when the filesystem being modified is mounted.)  E2label is
now implemented by tune2fs using an argv[0] dispatch, so that e2label
is also now safe for use on mounted filesystems.

Added a new program, e2image, which creates a backup of critical ext2
filesystem data structures.  The generated image file can be examined
using dumpe2fs and debugfs.  In the future, e2fsck will be able to use
the image file to help recover very badly damaged filesystems.

Fixed a number of LFS bugs in e2fsck; very, very large (> 2**42) files
no longer cause e2fsck to bomb out.  Also treat files > 2GB as being
large file when deciding whether or not the filesystem has large files.

Fixed lsattr and chattr so that they work correctly on large files.
(Fixes Debian bug #72690.)

Removed limitation in get_device_size() which imposed a one terrabyte
filesystem limitation.  (Most 2.2 kernels still have a signed int
problem which cause 1 TB block device limitation.  Fortunately, the
kernel patches to fix this are much easier than fixing the 2TB
limitation in the kernel.  :-)

A max_mount_count of zero is now treated as if no mount count were
set.  (Previously, no mount count was indicated by using -1, and a
mount count of zero caused e2fsck to always be run.)

Mke2fs supports two new filesystem types largefile and largefile4.

Mke2fs now adds some randomness in s_max_mount_count so that multiple
filesystems won't be all checked at the same time under normal
operations.

Fixed bug in the progress bar printing code which could cause e2fsck
to core dump on an illegal filesystem.

Fixed bug in fsck which could allow more than one instance of e2fsck
to be printing a progress bar.  (Debian bug #65267)

Fsck using a UUID or a LABEL specifier will work even if devfs is
compiled into the kernel and not mounted.  If the pathnames in
/proc/partitions are incorrect, fsck will search /dev for the correct
device (using the new ext2fs_find_block_device library function).
Fsck now also checks the RAID devices first so that they are properly
found when they are in use.  Support has also been added to support
additional IDE disks and the DAC 960 device names.  (Debian bug #94159)

Fixed a bug in fsck which caused it not deal properly with 16
byte long filesystem labels.

Fsck's -t option has been made a lot more flexible.  The semantics for
what happens if a comma-separated list to fsck has been regularized,
and it is now possible to filter what filesystems will get checked
based what is in the filesystem's fstab entry's option field.  (Debian
bug #89483.)

The dumpe2fs program can now print out the group description
information in hex, and also prints the location of the superblock and
block group descriptor for those block groups that have them.

Mke2fs now clears the ext2 superblock before it starts creating a
filesystem, so that the superblock magic number is only written if the
filesystem creation process successfully completes.

The debugfs program's stat command now pretty-prints the blocks used
by an inode so that it's more compact and informative.

The debugfs stats command now uses the same libe2p code (which is used
by dumpe2fs) to print the superblock header information.  This is more
complete, and it avoids a bit of code duplication.

Added a new debugfs command, set_super_value (ssv) which allows the
user to set arbitrary superblock fields.

Debugfs was extended to support inode numbers in hex (by prefixing
them with 0x), and so that modify_inode can set the inode generation
number.  Also, there is now a new function command called logdump
which will dump an ext3 journal.

Fixed a bug in debugfs so that quitting out of the pager doesn't kill
debugfs.

Debugfs's dump command now stops immediately upon reporting a disk
read error.  (Fixed a bug in ext2fs_file_read library routine which
caused debugfs not to stop.)  (Debian bug #79163)

On systems with /proc/mounts (mainly Linux systems), /proc/mounts is
checked before /etc/mtab is used, since /proc/mounts is more likely to
be accurate.

Added portability fixes for Solaris and Linux/ia64.

Various manual pages were clarified and cleaned up.  (Fixed debian
bugs #63442, #67446, and #87216)


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

The e2fsck message printer now supports %Iu and %Ig, which will print
out the inode's user and group owners, respectively.

E2fsprogs now includes its own version of include/linux/ext2_fs.h, so
that no longer dependent on the system having the correct version of
the kernel header files.

Added a new function to libext2, ext2fs_find_block_device(), which
searches the system (i.e., /dev, /devfs, /devices) for a pathname to a
device given its device number.

Added a new function to libext2, ext2fs_sync_device, which centralizes
all of the places which might try to use the BLKFLSBUF or FDFLUSH
ioctls (and usually failing to define them since the system header
files don't usually do this for us, and we're trying to avoid usage of
kernel include files now).

Added new utility programs in tests/progs: random_exercise and
hold_inode.  They aren't built by default; they're useful for
exercising ext3 filesystem code.

Added a new ext2 filesystem flag, EXT2_FLAG_SUPER_ONLY, which causes
the filesystem close functions to only update the superblock, and to
not touch the block group descriptors.  Needed by tune2fs when
modifying a mounted filesystem.

Got rid of struct ext2fs_sb and replaced it with the standard struct
ext2_super_block from include/linux/ext2_fs.h.  Note: this may break
source (but not binary) compatibility of some users of the ext2
library.  Those applications should just simply do a global search and
replace of struct ext2fs_sb with struct ext2_super_block, and include
the new header file <ext2fs/ext2_fs.h> which defines it.

The ino_t type has been renamed ext2_ino_t to protect applications
that attempt to compile -D_FILE_OFFSET_BITS=64, since this
inexplicably changes ino_t(!?).  So we use ext2_ino_t to avoid an
unexpected ABI change.

The Makefiles have been reworked so that "make check" can be run from
the top-level Makefile.

Fix general gcc -Wall complaints and removed dead code.

Remove use of NOARGS, because we assume everyone does ANSI C these
days.

Added build-rpm script from sct.

New functions ext2fs_image_{inode,super,bitmap}_{read,write} added 
to support e2image.

New function ext2fs_flush_icache which must be called if the
application program modifies the inode table blocks without going
through ext2fs_write_inode() interface.

New ext2fs_check_mount_point() function, which will return the mount
point of a device if mounted.

The io_channel abstraction now has an optional interface,
io_channel_write_range, which allows specific byte ranges to be
written.  

The unix_io IO channel now supports write-through caching, so that
journal creation is more efficient.

Added x86 assembly language routines to support byte swapping, to
reduce executable size.

Fixed bug in the utility program subst so that it's possible to
replace a substitution variable with a zero-length string.

Fixed numbering e2fsck pass1 problem numbers; an extra zero had
slipped into some of the problem number.

E2fsprogs 1.19 (July 13, 2000)
==============================

Release the resize2fs program since the timeout before it could
be released under the GPL has finally expired.

Add experimental support needed for the ext2 compression patches.
This requires compiling e2fsprogs with the --enable-compression flag
to the configure script.

Added ext3 journalling support.  E2fsck will run the journal (if
necessary) by temporarily mounting the filesystem.  /sbin/fsck.ext3 is
installed as a symlink to e2fsck.  Fsck has been taught about ext3,
and treats it the same as ext2 in terms of the progress bar logic.
Dumpe2fs will display the superblock journaling information if the
filesystem has a journal.  The ext2 library will now permit opening an
ext3 filesystem with the recovery flag set.  This is necessary for
on-line dump's to work correctly, but there may be issues with this
working well since ext3 is much less agressive about syncing blocks to
the filesystem, since they're safe on the journal.

Tune2fs and e2fsck have been changed to allow the mount_count check to
be disabled by setting max_mount_count to -1.  (This was already
supported by the kernel.)

Create a symbolic link for fsck.ext3, since the e2fsprogs utilities
are used for ext3 as well.

Added internationalization support for e2fsprogs; must be enabled
by passing --enable-nls to configure.

Always use the provided ext2fs header files to insulate ourselves from
kernel version changes.  Which include files are used by e2fsprogs
have also been cleaned up to improve portability.

Limit the number of times that e2fsck updates the progress bar so that
people who are booting using a 9600 baud console don't get swampped by
too many updates.

Improved the loop detection algorithm in e2sck's pass #3 so that it is
much, much faster for large filesystems with a large number of
directories.

The memory footprint for e2fsck is now slightly smaller than before.

E2fsck now checks if special devices have a non-zero size, and offers
to clear the size field if it finds such an inode.  

E2fsck now checks if special devices have the append-only flag set,
and offers to clear the inode.

E2fsck now properly handles some "should never fail" cases during a
bitmap copy in pass5.

E2fsck now properly prints control characters in filenames as ^A .. ^Z.

E2fsck now calculates the correct location of the backup superblock in
the case of filesystem blocksizes > 1k.

Fixed a bug in e2fsck's calculation of the number of inodes_per_block
which normally didn't cause problems under most filesystem parameters,
but could cause a valid superblock to be rejected in extreme cases.
Other checks for validating superblock values were made more
stringent.

Added non-destructive write testing to the badblocks program, courtesy
of David Beattie.  The badblocks also now has an option to input the
current set of bad blocks, so that known bad blocks are skipped to
speed up the badblocks test.  There is also a persistent rescan
feature which causes badblocks to run until it has completed some
number of passes without discovering any new bad blocks.

Badblocks now checks to see if the device is mounted and refuses to do
the tests involving writing to the device if it is mounted.  Also,
badblocks now allows the number of blocks to be checked to be
defaulted to the size of the partition.

Fixed a bug in fsck which didn't allow non-root users to be able to
check filesystems if there were any LABEL= or UUID= entries in
/etc/fstab.

The Hurd doesn't support the filetype filesystem feature.  The mke2fs
program now makes sure that for the Hurd, the filestype feature is
turned off.  E2fsck will check to see if the filetype feature is
turned on for Hurd filesystems, and offer to turn off the feature.

Mke2fs now has a safety check to make sure the number of blocks do not
exceed 32 bits even on a 64 bit platform.

Really fixed a bug in fsck to allow "fsck -As" to run interactive
fsck's.  (For those people who like to do interactive fsck's in the
/etc/rc scripts!?!)

Debugfs has a few new features: the rdump command, which will do a
recursive dump of a directory and all of its contents, and the lcd
command which does a local chdir (much like the ftp command of the
same name).  In addition, the debugfs program and the open_filesystem
command now takes three new options: -b and -s, which allows the
blocksize and superblock location to be specified, and the -c option
which is used in catastrophic situations where the block group
descriptors are corrupt.  If the -c option is specified, debugfs will
skip trying to read in the block and inode bitmaps.

Debufs's lsdel command was fixed to handle bad blocks in the inode
table.

A Y2K bug in debugfs's "ls -l" handling was fixed by switching to use
4 digit years.

General improvements in error messages

  - Mke2fs prints a sane error message if the partition size is zero
	(usually because the partition table wasn't reread by the
	kernel due to the partition being busy), instead of "invalid
	argument passed to ext2 library while initializing superblock".

  - Fsck now prints more self-explanatory message if an invalid UUID=
	or LABEL= specification is passed to it.

UUID library changed to use the LGPL.

Fixed a bug in the UUID library where very rapid calls to the
time-based UUID generator could cause duplicate UUID's to be returned.
This was not a problem for e2fsprogs, but it could be a problem for
other users of the library.

Make the UUID library more robust in the face of missing or an
improper /dev/urandom or /dev/random files.

Added some random portability fixes for Solaris.

Some minor man page updates.

Fixed a memory leak in the ss library.


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

We now try to use lseek64 and open64 from the LFS if possible.

The 3rd parameter in e2p's print_flags is now a flags word, instead of
a boolean option.

The mark and unmark bitmap functions now return the previous state of
the bit that was being changed, which is useful for some speed
optimizations.

The following functions have been added to enhance the badblocks list
handling in libext2fs: ext2fs_write_bb_FILE, ext2fs_read_bb_FILE2, and
ext2fs_badblocks_equal.

The ext2 header files now have the latest journalling fields to the
superblock.

The ext2fs_mkdir function in libext2fs now properly backs out of error
conditions robustly.

Cleaned up makefiles:
  - to cleanly  compile with the -j flag.
  - so distclean removes all generated files.
  - so in case of an error while installing header files, the make aborts.

Fix test_script so that it works correctly when compiling in the
source directory.

The random UUID generation routine has been made slightly better in
the case where /dev/random doesn't exist.  (Use of randomly-based UUID
is still not recommended if /dev/random doesn't exist, however; it's
better to use the time/ethernet MAC address UUID in this case.)

Clean up the build process so it's more friendly in case of missing
directories.

The ext2fs header file can now be #include'd into C++ programs.

The e2p.h header file is now installed.

Added workaround to a gawk 3.0.5 bug in lib/ss/mk_cmds.



E2fsprogs 1.18 (November 10, 1999)
==================================

Fix a core dumping bug in e2fsck if an imagic inode is present or
(more rarely) if the filesystem is badly corrupted enough that e2fsck
has to restart pass 1 processing.  E2fsck now closes the filesystem
before freeing a large number of its data structures, so in the case
of future memory faults, at least the fixed filesystem will be fully
written out.

If a filesystem doesn't support imagic inodes, and e2fsck discovers an
imagic inode, it will offer to clear the imagic flag.

E2fsck will now offer to clear the immutable flag on special files
(device/socket/fifos) when running it in non-preen mode.

E2fsck will now set the filetype when creating /lost+found, and when
connected orphaned inodes to /lost+found.

Debugfs's ncheck and icheck commands now handles the case where there
are bad blocks in the inode table without bombing out.

The badblocks list processing code has been made more efficiently for
appending a large number of (ordered) badblocks to the badblocks list.

Some minor man page updates.

Fsck now allows interactive e2fsck's when using fsck -As (not a common
mode, but some people like to do this in boot scripts for silly reasons).

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

The internal e2fsck problem code for PR_2_SPLIT_DOT was fixed to meet
with the problem code convention.

The badblocks list regression test program has been updated to work
with previously made API name changes.

The ext2fs_free() command now uses the new badblocks API to avoid
using the compatibility layer.

Added new regression test cases; the run_e2fsck test script now
supports the ability for a test case to run a prepratory command
before running e2fsck.

E2fsprogs 1.17 (October 26, 1999)
=================================

Fixed nasty typo in fsck which caused parallelized fsck's to go into an
infinite loop.

Fixed a bug in fsck where it used strncmp to compare a binary UUID,
thus potentially causing problems if a binary UUID contained a NULL
character.

E2fsck now uses stricter checks for directory entries in pass 2:
zero-length filenames are not allowed; neither are 8 byte long
directory entries.

The debugfs "dirty" command now clears the filesystem valid bit.
(Previously this just set the dirty-as-in-needs-writing-out-to-disk
bit in the in-core superblock image.  The new functionality is more
what the user expects, and is more useful.)

Added a debugging hook to test parallel fsck; if the environment
variable FSCK_FORCE_ALL_PARALLEL, then filesystems on the same drive
will be checked in parallel when they normally would not be.

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

Fixed some #ifdef's for compilation under the Hurd OS.

Fixed minor W2K compatibility problems.

Fixed some miscellaneous GCC warnings.


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

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

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

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

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

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

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

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

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

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

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

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

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

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

Fixed minor display bugs in tune2fs and mke2fs.

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

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

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

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

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

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


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

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

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

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

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

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

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

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

Fix bug in e2fsck where it wouldn't check to see if a disconnected
inode had any problems before connecting it to /lost+found.

Add check to e2fsck so it makes sure that total number of inodes in
the filesystem is a sane number.

Fix fencepost error when clearing an the end of the block bitmap which
caused the last block in the bitmap not to get cleared.

Cleaned up a number of messages in e2fsck:
	* The message "Group's #'s copy of the group descriptor..."
		was fixed so that the correct number would be displayed.
	* Added missing space in the "disk write-protected" error messsage
	* Cleaned up the error message printed when a non-interactive
		e2fsck needs to abort a check because the filesystem
		appears to be mounted.

Added a new command-line utility, uuidgen, which will create and print
a UUID.

Make debugfs's icheck command more robust by checking to make sure an
inode has valid blocks before interarting over the inode's blocks.

UUID generation now uses a random-based scheme whenever possible to
prevent potential privacy problems.

Man pages for all of the UUID functions in the lirbary were added.

Fixed bug in fsck so it won't coredump if a filesystem not in
/etc/fstab is given to it.

Fsck now understands the UUID=xxxx and LABEL=yyyy forms in /etc/fstab
that most of the other mount utilities understands.

Mke2fs will make a filesystem even if it appears mounted if the force
option is given.

Dumpe2fs has new command-line options which allow a filesystem expert
to specify the superblock and blocksize when opening a filesystem.
This is mainly useful when examining the remains of a toasted
filesystem.

The badblocks program has been updated to display correctly on disks
with large block numbers.

The badblocks program no longer gives spurious errors when errors
occur on non-block boundaries, which is common if the blocksize is
larger than 1k.

Mke2fs will sync the disk device every MKE2FS_SYNC block groups if the
MKE2FS_SYNC environment variable is set.  This is to work around a VM
bug in the 2.0 kernel.  I've heard a report that a RAID user was able
to trigger it even using a 2.2 kernel, but hopefully it will not be
needed for most Linux 2.2 users.

Fixed miscellaneous documentation and man pages.

Programmer's notes:
-------------------

Cleaned up functions such as pass1_get_blocks, pass1_read_inode which
in e2fsck's pass1.c really should have been static.

The return value of the uuid_compare() function was changed to make it
match with the convetions used by strcmp, memcmp, and Paul Leach's
UUID sample document.

The "make depend" process has now been made more automated; it now
automatically word-wraps the dependencies, and only replaces source
Makefile.in if there has been a change in the dependencies.  Also, a
top-level "make depend" now recurses through all the subdirectories
automatically.

The Makefile in .../util has been changed so that subst is built using
the native C compiler during a cross-compilation, since the subst
program is only used during the build process.  Also add an explicit
rule to build util/subst by cd'ing to the correct directory and
running Makefile.

The man directories are defined in terms mandir, so that the configure
script can override the location of the manual pages.

The config files have been updated to recognize new machine types for
both the i386 and alpha families.

Fsck has been modified so that it will accurately create an
fsck_instance even when the noexecute flag is set.  This allows for
accurate debugging of the fsck pass structure.  Also, when the verbose
flag is given twice, fsck will print debugging information about when
fsck is waiting for jobs to finish.


E2fsprogs 1.14 (January 9, 1999)
================================

Fix the fstab parsing code so that it can handle blank lines and
comment characters.  Also, missing pass numbers need to be treated as
zero.

Fixed a bug in e2fsck where under some circumstances (when e2fsck
needs to restart processing after fixing an egregious inconsistency)
it would try to access already freed memory.

E2fsck now prints non-printable characters in directory entries and
pathnames using '^' and 'M-' notation.

Fixed chattr so that it will ignore symbolic links when doing
recursive descent traversals.  For both chattr and lsattr, no longer
print the version string unless the -V option is given.

Allow the system administrator to directly specify the number of
inodes desired in the filesystem, for some special cases where this is
necessary.

Fix portability problems so that e2fsprogs can be compiled under Linux
1.2 systems and Solaris systems.

Update the config.guess file with a more recent version that will
identify newer Linux platforms.

Programmer's notes
------------------

Ext2fs_read_inode and ext2fs_write_inode will now return an error if
an inode number of zero is passed to them.

E2fsprogs 1.13 (December 15, 1998)
==================================

Fixed a bug in debugfs where an error messages weren't getting printed
when the ext2 library routines to read inodes returned errors in the
stat, cmri and rm commands.

Fixed a bug in mke2fs so that if a ridiculous inode ratio parameter is
provided, it won't create an inode table smaller than the minimum
number of inodes required for a proper ext2 filesystem.

Fsck now parses the /etc/fstab file directly (instead of using
getmntent()), so that it can distinguish between a missing pass number
field and pass number field of zero.  This caused problems for
diskless workstations where all of the filesystems in /etc/fstab have
an explicit pass number of zero, and fsck could not distinguish this
from a /etc/fstab file with missing pass numbers.

E2fsck will create a /lost+found directory if there isn't one in the
filesystem, since it's safer to create the lost+found directory before
it's needed.

Fixed e2fsck so that it would detect bogus immutable inodes which
happen to be sockets and FIFO files, and offer to clear them.

If a filesystem has multiple reasons why it needs to be checked, and
one of the reasons is that it is uncleanly mounted, e2fsck will print
that as the reason why the filesystem is being checked.

Cleaned up the output routines of mke2fs so that it doesn't overflow
an 80 column display when formating really big filesystems.

Added a sanity check to e2fsck to make sure that file descriptors 0,
1, 2 are open before opening the hard disk.  This avoids a problem
where a broken program might exec e2fsck with those file descriptors
closed, which would cause disastrous results if the kernel returns a
file descriptor for the block device which is also used by FILE *
stdout.

Fixed up the e2fsck progress reporting functions so that the values
reliably reach 100% at the completion of all of the e2fsck passes.

Fixed minor documentation bugs in man pages and usage messages.

Programmer's notes:
-------------------

Fixed a number of lint warnings in the ext2fs library and potential
portability problems from other OS's header files that might define
CPP macros for names like "max" and "min".

ext2fs_badblocks_list_add() has been made more efficient when it needs
to grow the bad blocks list.

Fixed a bug in e2fsck which caused it to dereference a freed pointer
just before exiting.

Fixed the substition process for generating the mk_cmds and compile_et
scripts so that they will work outside of the build tree.

Add sanity check to e2fsck so that if an internal routine
(ext2fs_get_dir_info) returns NULL, avoid dereferencing the pointer
and causing a core dump.  This should never happen, but...

E2fsprogs 1.12 (July 9, 1998)
==================================

E2fsprogs now works with glibc (at least with the version shipped wtih
RedHat 5.0).  The ext2fs_llseek() function should now work even with
i386 ELF shared libraries and if llseek() is not present.  We also
explicitly do a configure test to see if (a) llseek is in libc, and
(b) if llseek is declared in the system header files.  (See standard
complaints about libc developers don't understand the concept of
compatibility with previous versions of libc.)

The ext2fs library now writes out the block group number in each of
the superblock copies.  This makes it easier to automatically
determine the starting block group of the filesystem when the block
group information is trashed.

Added support for the EXT2_FEATURE_INCOMPAT_FILETYPE feature,
which means that e2fsprogs will ignore the high 8 bits of the
directory entry's name_len field, so that it can be used for other
purposes.

Added support for the EXT2_FEATURE_RO_COMPAT_LARGE_FILE feature.
E2fsprogs will now support filesystems with 64-bit sized files.

Added support for the EXT2_FEATURE_COMPAT_DIR_PREALLOC feature.

Added new program "e2label", contributed by Andries Brouwer.  E2label
provides an easy-to-use interface to modify the filesystem label.

Fixed bug so that lsattr -v works instead of producing a core dump.

Fixed a minor bug in mke2fs so that all groups with bad superblock
backup blocks are printed (not just the first one).

Mke2fs will check the size of the device, and if the user specifies a
filesystem size larger than the apparent size of the device it will
print a warning message and ask if the user wants to proceed.

E2fsck has a new option -C, which sends completion information to the
specified file descriptor.  For the most part, this is intended for
programs to use, although -C 0 will print a spinning character to the
stdout device, which may be useful for users who want to see something
happening while e2fsck goes about its business.

Fixed a bug in e2fsck which could cause a core dump when it needs to
expand the /lost+found directory, and sometimes the bitmaps haven't
been merged in.  Also fixed a related bug where ext2fs_write_dir_block
was used to write out a non-directory block.  (Which would be bad on a
non-Intel platform with byte swapping going on.)

Fixed bug in e2fsck where it would print a "programming error" message
instead of correctly identifying where a bad block was in used when
the bad block was in a non-primary superblock or block group
descriptor.  Also fixed a related bug when sparse superblocks are in
use and there is a bad block where a superblock or block group
descriptor would have been in a group that doesn't include a
superblock.

Fixed a bug in e2fsck (really in libext2fs's dblist function) where if
the block group descriptor table is corrupt, it was possible to try to
allocate a huge array, fail, and then abort e2fsck.
ext2fs_get_num_dirs() now sanity checks the block group descriptor,
and subsitutes reasonable values if the descriptors are obviously bogus.

If e2fsck finds a device file which has the immutable flag set and the
i_blocks beyond the normal device number are non-zero, e2fsck will
offer to remove it, since it's probably caused by garbage in the inode
table.

When opening a filesystem, e2fsck specially checks for the EROFS error
code, and prints a specific error message to the user which is more
user friendly.

If the filesystem revision is too high, change the e2fsck to print
that this is either because e2fsck is out of date, or because the
superblock is corrupt.  

E2fsck now checks for directories that have duplicate '.' and '..'
entries, and fixes this corruption.

E2fsck no longer forces a sync of the filesystem (with attendant sleep
calls) at all times.  The ext2fs_flush() function now performs a sync
only if it needed to write data blocks to disk.

Fixed a minor bug in e2fsck's pass1b's file cloning function, where
certain errors would not be properly reported.

Updated and expanded a few points in the man pages which users
complained wheren't explicit enough.

Added special case byte-swapping code if compiling on the PowerPC, to
accomodate the strange big-endian variant of the ext2 filesystem that
was previously used on the PowerPC port.


Programmer's notes:
-------------------

Removed C++ keywords from the ext2fs libraries so that it could be
compiled with C++.

E2fsck's internal organization has now been massively reorganized so
that pass*.c don't have any printf statements.  Instead, all problems
are reported through the fix_problem() abstraction interface.  E2fsck
has also been revamped so that it can be called as a library from a
application.

Added new fileio primitives in libext2fs for reading and writing
files on an unmounted ext2 filesystem.  This interface is now used by
debugfs.

Added a new libext2fs function for mapping logical block numbers of
a file to a physical block number.

Added a new libext2fs function, ext2fs_alloc_block(), which allocates
a block, zeros it, and updates the filesystem accounting records
appropriately.

Added a new libext2fs function, ext2fs_set_bitmap_padding(), which
sets the padding of the bitmap to be all one's.  Used by e2fsck pass 5.

The libext2fs functions now use a set of memory allocation wrapper
functions: ext2fs_get_mem, ext2fs_free_mem, and ext2fs_resize_mem,
instead of malloc, free, and resize.  This makes it easier for us to
be ported to strange environments where malloc, et. al. aren't
necessarily available.

Change the libext2fs fucntion to return ext2-specific error codes
(EXT2_DIR_EXISTS and EXT2_DB_NOT_FOUND, for example) instead of using
and depending on the existence of system error codes (such as EEXIST
and ENOENT).

Renamed io.h to ext2_io.h to avoid collision with other OS's header
files.

Add protection against ext2_io.h and ext2fs.h being included multiple
times.

The types used for memory lengths, etc. have been made more portable.
In generla, the code has been made 16-bit safe.  Added Mark
Habersack's contributed DOS disk i/o routines.

Miscellaneous portability fixes, including not depending on char's
being signed.

The io_channel structure has a new element, app_data, which is
initialized by the ext2fs routines to contain a copy of the filesystem
handle.

ext2fs_check_directory()'s callback function may now return the error
EXT2_ET_CALLBACK_NOTHANDLED if it wishes ext2fs_check_directory() to
really do the checking, despite the presence of the callback function.


E2fsprosg 1.11 (June 17, 1997)
==============================

Fixed e2fsck to detect (previously ignored) conflicts between the
superblock or block group descriptors and block bitmaps, inode
bitmaps, and inode tables.

Fixed bug in e2fsck so that when the message printed out when a block
or inode bitmap conflicts with other data, it has the correct group
number.

Fixed bug in e2fsck and mke2fs where the blocksize wasn't being passed
to badblocks.  This meant that not all of the filesystem was being
tested for bad blocks! 

Fixed an array boundary overrun case which cropped up in
ext2fs_badblocks_list_test when a user tried running "mke2fs -c 
-b 4096".

Adjusted the number of columns printed by mke2fs when displaying the
superblock backups to avoid running over 80 columns when making a
really big filesystem.

Fixed up the man pages for e2fsck, debugfs, badblocks, chattr,
dumpe2fs, fsck, mke2fs, and tune2fs (typos and other minor grammar
fixes), thanks to some suggestions from Bill Hawes (whawes@star.net).

Programmer's notes:
-------------------

Fixed install rule in lib/ss so that ss_err.h is actually getting
installed.

Fixed bug in ext2fs_copy_bitmap; the destination bitmap wasn't getting
bassed back to the caller.

Fixed bug in ext2fs_inode_scan_goto_blockgroup; it had not been
setting the current inode number (which meant this function wasn't
working at all).

Fixed bug in ext2fs_resize_generic_bitmap; it had not be zeroing all
blocks in the bitmap when increasing the size of the bitmap.

Changed the initial number of blocks allocated by ext2fs_init_dblist()
to be more realistic.

Added a new function ext2fs_allocate_group_table, which sets up the
group descriptor information (and allocates inode and block bitmaps,
and inode tables for a particular group).  The function was created by
factoring out code form ext2fs_allocate_tables().

Added a new function ext2fs_move_blocks which takes a bitmap of the
blocks to be moved, and moves them to another location on the
boardboard.

Make the unix_io channel's io_channel_flush implementation calls sync()
to to flush the kernel buffers to disk.

Added a new function ext2fs_dblist_count returns the number of
directory blocks in dblist.


E2fsprogs 1.10 (April 24, 1997)
===============================

Mke2fs once again defaults to creating revision #0 filesystems, since
people were complaining about breaking compatibility with 1.2 kernels.
Warning messages were added to the mke2fs and tune2fs man pages that
the sparse superblock option isn't supported by most kernels yet (1.2
and 2.0 both don't support parse superblocks.)

Added new flag to mke2fs, -R <raid options>, which allows the user to
tell mke2fs about the RAID configuration of the filesystem.  Currently
the only supported raid option is "stride" which specifies the width
of the RAID stripe.

Fixed bug in e2fsck where pass1b would bomb out if there were any
blocks marked bad in the inode table.

Fixed rare bug in mke2fs where if the user had a very unlucky number
of blocks in a filesystem (probability less than .002) the resulting
filesystem would be corrupt in the last block group.

Fixed bug where if e2fsck tried to allocate a block to fix a
filesystem corruption problem and the filesystem had no free blocks,
ext2fs_new_block() would loop forever.

The configure script now checks explicitly to see if "-static" works,
since that can't be assumed to be true --- RedHat doesn't install
libc-static by default.

Fixed bug in libext2's block iterator functions where under some
cirmcustances, file with holes would cause the bcount parameter to the
callback function to be incorrect.  This bug didn't affect any of
e2fsprogs programs, but it was discovered by Paul Mackerras, the
author of the PPC boot loader.

Removed use of static variables to store the inode cache in libext2fs.
This caused problems if more than one filesystem was accessed via
libext2fs (static variables in libraries are generally a bad idea).
Again, this didn't affect e2fsprogs programs, but it was discovered by
Paul Mackerras.

Fixed minor bugs and version code drift to assure that e2fsprogs 1.10
will compile cleanly with 1.2.13 kernels (even with a.out shared
libraries!)

Programmer's notes:
-------------------

Added new functions to duplicate an ext2 filesystem handle, and its
associated substructure.  New functions: ext2fs_dup_handle(),
ext2fs_copy_dblist(), ext2fs_badblocks_copy(), ext2fs_copy_bitmap().
Other structures, such as the io_channel and the inode_cache, now have
a ref count so that they only get freed when they are no longer used
by any filesystem handle.  (These functions were added as part of the
development effort for an ext2 resizer).

E2fsprogs 1.09 (April 14, 1997)
===============================

Fixed bug in mke2fs (really in lib/ext2fs/initialize.c) which was
accidentally introduced in the 1.08 release.  The overhead calculation
was accidentally removed, which caused ext2fs_initialize() to not
notice when the filesystem size needed to be adjusted down because
there wasn't enough space in the last block group.

Fixed bug in version parsing library routine; it was always parsing
the library version string, instead of using the passed-in string.

Clarified chattr man page.

E2fsprogs 1.08 (April 10, 1997)
===============================

E2fsck 1.07 was very slow when checking very large filesystems with a
lot of files that had hard links (i.e., news spools).  This was fixed
by seriously revamping the icount abstraction.  Added a formal test
suite for the icount abstraction.

Debugfs now has a "-l" option to the "ls" command, which lists the
inode number, permissions, owner, group, size, and name of the files
in the directory.

Fix a bug in e2fsck where when a directory had its blocks moved to
another location during the pass 1b processing, the directory block
list wasn't updated, so pass 2 wouldn't check (and correct) the
correct directory block.

E2fsck will now treat inodes which contain blocks which are claimed by
the filesystem metadata by treating them as multiply claimed blocks.
This way, the data in those blocks can be copied to a new block during
the pass 1b--1d processing.

E2fsck will attempt to determine the correct superblock number and
display it in the diagnostic and warning messages if possible.

Add support for a new (incompatible) feature, "sparse_super".  This
feature reduces the number of blocks which contain copies of backup
superblocks and block group descriptors.  (It is only an incompatible
feature because of a bug in ext2_free_blocks.)  mke2fs and tune2fs now
support a new -s option; e2fsck will recognize filesystems built with
this feature turned on.

E2fsck now checks the library to make sure is the correct version,
using new library functions.  (This helps to diagnose incorrectly
installed e2fsprogs distributions.)

Dumpe2fs now prints more information; its now prints the the
filesystem revision number, the filesystem sparse_super feature (if
present), the block ranges for each block group, and the offset from
the beginning of the block group.

Mke2fs now distributes the inode and block bitmap blok so that the
won't be concentrated in one or two disks in RAID/striping setups.
Also, if the user chooses a 2k or 4k block group, mke2fs will try to
choose the largest blocks per group that be chosen.  (For 2k blocks,
you can have up to 16384 blocks/group; for 4k blocks, you can have up
to 32768 blocks/group.)  Previously mke2fs would not allow
specification of more than 8192 blocks per group, even if you were
using a 2k or 4k block group.

Programmer's notes:
-------------------

Added a new function ext2fs_create_icount2() which takes a "hint"
argument.  This hint argument presets the icount array with the list
of inodes which actually need to be in the icount array.  This really
helps to speed up e2fsck.

Added a new function ext2fs_icount_validate() which checks the rep
invariant for the icount structure.  This is used mostly for testing.

The error mesasage given when a bad inode number is passed to
test_generic_bitmap to reflect EXT2FS_TEST_ERROR (instead of
EXT2FS_UNMARK_ERROR).

Added a new function ext2fs_set_dir_block which sets the block of a
dblist entry, given the directory inode and blockcnt.

Added a new function ext2fs_get_library_version() which returns the
current library version, and ext2fs_parse_version_string() which
returns a version number based on a e2fsprogs version string.

The icount functions will return EINVAL if the passed in inode number
is out of bounds.

E2fsprogs 1.07 (March 9, 1997)
==============================

E2fsck is now uses much less memory when checking really large
filesystems (or rather, filesystems with a large number of inodes).
Previously a filesystem with 1 million inodes required 4 megabytes of
memory to store inode count statistics; that storage requirement has
now been reduced to roughly half a megabyte.

E2fsck can now properly deal with bad blocks appearing inside the
inode table.  Instead of trying to relocate the inode table (which
often failed because there wasn't enough space), the inodes in the bad
block are marked as in use.

E2fsck will automatically try to use the backup superblocks if the
primary superblocks have a bad magic number or have missing meta-data
blocks (or meta-data blocks which are out of range).

E2fsck's pass 3 has been made more efficient; most noticeable on
filesystems with a very large number of directories.

Completely revamped e2fsck's system of printing problem reports.  It
is now table driven, to make them more easily customizeable and
extendable.  Error messages which can be printed out during preen mode
are now one line long.

Fixed e2fsck's filesystem swapping code so that it won't try to swap
fast symbolic links or deleted files.

Fixed e2fsck core dumping when fixing a filesystem which has no
directories (not even a root directory).

Added a check to e2fsck to make sure that the length of every
directory entry is a multiple of 4 (since the kernel complains if it
isn't).

Added a check to e2fsck to make sure that a directory entry isn't a
link to the root directory, since that isn't allowed.

Added a check to e2fsk to now make sure the '.' and '..' directory
entries are null terminated, since the 2.0 kernel requires it.

Added check to write_bitmaps() to make sure the superblock doesn't get
trashed if the inode or block bitmap is marked as being block zero.

Added checking of the new feature set fields in the superblock, to
avoid dealing with new filesystem features that this package wasn't
set up to handle.

Fixed a fencepost error in ext2fs_new_block() which would occasionally
try to allocate a block beyond the end of a filesystem.

When the UUID library picks a random IEEE 802 address (because it
can't find one from a network card), it sets the multicast bit, to
avoid conflicting with a legitimate IEEE 802 address.

Mke2fs now sets the root directory's owner to be the real uid of the
user running mke2fs.  If the real uid is non-zero, it also sets
the group ownership of the root directory to be the real group-id of
the user running mke2fs.

Mke2fs now has more intelligent error checking when it is given a
non-existent device.

When badblocks is given the -vv option, it now updates the block that
it is currently testing on every block.

Fixed a bug in fsck where it wouldn't modify the PATH envirnoment
currently correctly if PATH wasn't already set.

Shared libraries now built with dependencies.  This allows the shared
library files to be used with dlopen(); it also makes the transition
to libc 6 easier, since ld.so can tell which libc a particular shared
library expects to use.

Programmer's notes:
-------------------

Added new abstraction (defined in dblist.c) for maintaining a list of
blocks which belongs to directories.  This is used in e2fsck and other
programs which need to iterate over all directories.

Added new functions which test to see if a contiguous range of blocks
(or inodes) are available.  (ext2fs_*_bitmap_range).

Added new function (ext2_inode_has_valid_blocks) which returns true if
an inode has valid blocks.  (moved from e2fsck code).

Added new function (ext2fs_allocate_tables) which allocates the
meta-data blocks as part of initializing a filesystem.  (moved from
mke2fs code).

Added a new I/O manager for testing purposes.  It will either allow a
program to intercept I/O requests, or print debugging messages to
trace the activity of a program using the I/O manager.

The badblocks_list functions now store the bad blocks in a sorted
order, and use a binary search to speed up badblocks_list_test.

The inode scan function ext2fs_get_next_inode() may now return a soft
error returns: MISSING_INODE_TABLE and BAD_BLOCK_IN_INODE_TABLE in
those cases where part of an inode table is missing or there is a bad
block in the inode table.  

Added a new function (ext2fs_block_iterate2) which adds new arguments to
the callback function to return a pointer (block and offset) to the
reference of the block.

Added new function (ext2fs_inode_scan_goto_blockgroup) which allows an
application to jump to a particular block group while doing an inode
scan.

The badblocks list functions were renamed from badblocks_* to
ext2fs_badblocks_*.  Backwards compatibility functions are available
for now, but programs should be modified to use the new interface.

Some of the library functions were reorganized into separate files to
reduce the size of some programs which statically link against the
ext2 library.

Put in some miscellaneous fixes for the Alpha platform.


E2fsprogs 1.06 (October 7, 1996)
================================

Fixed serious bug in e2fsck: if the block descriptors are bad, don't
smash the backup copies in ext2fs_close().  (The problem was that when
e2fsck -p discovered the problem, while it was closing the filesystem
and exiting, it was also blowing away the backup superblocks on the
disk, which was less than friendly.)  We now make it the case that we
only write out the backup superblock and the back block descriptors if
the filesystem is completely free from problems.

Fixed a bug in block_interate in the lib/ext2fs library which caused
e2fsck to fail on GNU Hurd-created filesystems.

Add support for Linux/FT's bootloader, which actually uses
EXT2_BOOT_LOADER, and sets its mode bits which caused e2fsck to want
to clear the inode.

Add support for the "A" (no atime update) attribute.  (Note: this
attribute is not yet in production kernels.)

The test suite is not automatically run when doing a "make all" from
the top level directory.  Users should manually run "make check" if
they wish to run the test suite.

Upon a preenhalt(), make the printed message more explicit that
running e2fsck "MANAULLY" means without the -p or -a options.

In e2fsck, if a disconnected inode is zero-length, offer to clear it
instead of offering to connect it to lost+found.

In e2fsck, if a filesystem was just unmounted uncleanly, and needs
e2fsck to be run over it, change e2fsck to explicitly display this
fact.

For dumpe2fs and e2fsck, cause the -V option to print out which
version of the ext2fs library is actually getting used.  (This will
help detect mismatches of using a 1.06 utility with a 1.05 library,
etc.)

Programmers' notes:
-------------------

EXT2_SWAP_BYTES was changed to EXT2_FLAG_SWAP_BYTES, which better fits
the naming convention.

In ext2fs_initialize(), make sure the description for the inode bitmap
is correctly initialize.

Fixed minor type typo in ext2fs_allocate_generic_bitmap();

E2fsprogs 1.05 (September 7, 1996)
==================================

Add support for new fields in the ext2 superblock --- volume name,
volume UUID, and last mounted field.  Dumpe2fs displays these fields,
tune2fs and mke2fs allows you to set them.  E2fsck will automatically
generate a UUID for those volumes that don't have them.  

Put in support for e2fsck to recognize HURD specific ext2 features ---
most notably, the translator block.  The e2fsprogs tools will now use
the creator_os field in the superblock to correctly handle different
OS-specific variants of the ext2 filesystem.

E2fsck now fixes inodes which have a the deletion time set, but which
have a non-zero i_link_count field by offering to clear the deletion
time.  Previously e2fsck assumed that the inode was deleted (per 0.3c
ext2 kernel behavior) and offered to unlink the file.

If e2fsck sets the clean bit, but nothing else, set the exit code
FSCK_NONDESTRUCT.  After all, e2fsck did fix a filesystem error --- it
set the filesystem valid bit when it was previously cleared.  :-) This
was needed to make the HURD fsck driver happy.

If the  user  refuses to attach an  unattached  inode, e2fsck  will no
longer set the inode's link count.  Otherwise, the  inode would end up
getting marked as unused, which might cause loss of data later.

Make the message issued by e2fsck when the superblock is corrupt less
confusing for users.  It now mentions that another reason for the
"corrupt superblock" message might be that the partition might not be
an ext2 filesystem at all (it might swap, msdos filesystem, ufs, etc.)

Make the libext2 library more robuest so that e2fsck won't coredump on
an illegal superblock where the blocksize is zero.  (f_crashdisk is
the test case).

By default, create filesystems where the default checkinterval is 6
months (180 days).  Linux servers can be robust enough that 20 reboots
can be a long, long time.

Added configure flag --enable-old-bitops, which forces the bitops to
use the old (native) bitmask operations.  By default on the sparc
platform, the standard ext2 bit ordering is now used.

Added a new feature to e2fsck to byte-swap filesystems; this can be
used to convert old m68k filesystems to use the standard byte-order
storage for the superblock, inodes, and directory blocks.  This
function is invoked by using the '-s' option to e2fsck.

Debugfs's "dump" command has been enhanced so that it writes out the
exact size of the file so that the nulls at the end of the file are
eliminated.  The command also accept a new "-p" option which will
attempt preserve to preserve the ownernship, permissions, and
file modification/access times.

Debugfs has two new options, -f and -R.  The -R option allows the user
to execute a single debugfs command from the command line.  The -f
option allows the user to specify a "command file" containing debugfs
commands which will get executed.

Dumpe2fs now pretty prints the check interval, instead of just
printing the check interval as a number of seconds.

Fix bugs in debugfs: the params command when no filesystem is opened
no longer causes a core dump.  It is now possible to unlink a file
when a pathame containing a '/' is specified.

Tune2fs has a new -C option which sets the number of times the
filesystem has been mounted.

Fix the chattr '-v' option so that it actually works.  Chattr was
being buggy about the -v option parsing.

Programmers' notes:
-------------------

The directory lib/uuid contains a set of library routines to generate
DCE compatible UUIDs.  

Extended ext2fs_namei() to handle symbolic links.  Added new function
ext2fs_nami_follow() which will follow last symbolic link in the case
where the pathname points to a sym link.

The ext2fs_block_iterate function will now return the HURD translator
block, if present.  The new flag BLOCK_FLAG_DATA_ONLY will cause the
iterator to return data blocks only.  The ext2fs.h file now defines
constants BLOCK_COUNT_IND, BLOCK_COUNT_DIND, BLOCK_COUNT_TIND, and
BLOCK_COUNT_TRANSLATOR, which are the magic values passed in the block
count field of the iterator callback function.

The test script driver now takes an optional second argument, which is
the test case to be run.  This allows you to run a test case without
needing to run the entire test suite.

On Linux ELF systems, install the .so files in the correct places
(/usr/lib).  The .so files must be stored in the same directory as the
.a files.

Fixed miscellaneous HURD compilation issues with header file being
included in the right order.

Fixed debugfs so that it resets optind to zero, not one, since setting
optind to zero is more correct.


E2fsprogs 1.04 (May 16, 1996)
=============================

First "official" (1.03 was a limited release only) to support building
e2fsprogs under Linux 2.0 kernels (as well as late model 1.3 and 1.99
kernels).

This package includes a RPM specs file, that it can be built using the
RedHat Package Manager.

E2fsck now prints a hint that if there are lots of incorrectly located
inode bitmaps, block bitmaps, and inode table blocks, the user might
want to try using e2fsck -b 8193 first, to see if that fares any
better.

For ext2 filesystem written with the hurd, debugfs will now print out
the translator field when printing an inode structure.

Lots of miscellaneous linking/installation cleanups:

  Libraries are now linked using a relative pathname, instead of
  relying on -L working correct.  It doesn't, in many cases, including
  current versions of GNU ld.  This guarantees that the build tree is
  linking with the right libraries, instead of the ones installed in
  /usr/lib.

  Header files, man pages, and the et/ss shell scripts are now
  generated using a custom substitution script, instead of relying on
  the configure script.  This prevents needless recompilation of
  files; in addition, the custom substitution script is much faster.

  e2fsck may now be linked dynamically, by using the
  --enable-dynamic-e2fsck flag to configure.  This is not recommended,
  since it increases e2fsck's dependence on other files, but some
  people need to save disk space, and other critical programs on their
  systems were being linked dynamically anyway.

  Programs such as fsck which didn't need to be linked against
  libext2fs (or mke2fs which didn't need to be linked against libe2p)
  only link against libraries they actually need.  Otherwise, those
  programs would require the presense of libraries that otherwise
  could be removed from a rescuse diskette.

  The ss include files are now installed correctly so they can
  actually be used by another package.

  If the profiling libraries are built, they are now installed on a
  "make install-libs".


E2fsprogs 1.03 (March 27, 1996)
===============================

Change the m68k bit numbering for bitmasks to match the bit numbering
used by all other ext2 implementations.  (This change was requested by
the m68k kernel development team.)

Support (in-development) filesystem format revision which supports
(among other things) dynamically sized inodes.

Fixed a bug in the ext2 library so that an intelligent error is
returned if mke2fs is run with a ridiculously small number of blocks
for a partition.

Fixed a bug in the ext2 library which required that the device be
openable in read/write mode in order to determine its size.  This
caused e2fsck -n to require read/write access when it was not
previously necessary.

Fixed a bug in e2fsck which casued it to occasionally fail the test
suite depending on which version of the floating point library it was
using.

Fixed a bug in e2fsck so that it now halts with a fatal error when
certain superblock consistency checks fail.  Previously it continued
running e2fsck, with some potential confusing/damaging consequences.

Added new flag to fsck which allows the root to be checked in parallel
with other filesytems.  This is not the safest thing in the world to
do, but some system administrators really wanted it.

Fixed -Wall flames in lib/ss.


E2fsprogs 1.02 (January 16, 1996)
=================================

Fix to allow e2fsprogs to be compiled on recent 1.3 (pl45+) kernels.

Change e2fsck to print statistics of how many non-contiguous files are
on the system.  Note that a file which is larger than 8k blocks, it is
guaranteed to be non-contiguous.

In mke2fs, print a warning message if a user tries to format a whole
disk (/dev/hda versus /dev/hda1).  If a user really wants to format a
whole disk, the -F (force) option forces mke2fs to format a whole disk
as a filesytem.

Fix a bug in fsck where in some cases it might start checking
partitions in the next pass before it finishes checking partitions in
the current pass.  This still won't cause two partitions on the same
disk will be checked, so it's rarely a problem in real life.

Patch lsattr so that it won't hang when checking a named pipe.

Minor compilation fixes:
	* Fix the order of libraries that were linked in debugfs.
	* Allow the sources to be compiled with -ansi turned on.
