E2fsprogs 1.36-rc5 (January 27, 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.

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.

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.


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