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.
