e2fsprogs (1.43.3-1) unstable; urgency=medium

  * Fix e2fsck's handling of timestamps on 32-bit system (Closes: #836559)
  * E2fsck will sanity check and repair the extra isize fields in inodes
    and the superblock.
  * Fix sparc64 crashes when dereferencing unaligned integers in journal
    blocks when metdata checksums are enabled.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun, 04 Sep 2016 20:41:21 -0400

e2fsprogs (1.43.2-2) unstable; urgency=medium

  * Fix build reproducibility problems
  * Don't hide the linker flags for e2fsck.static

 -- Theodore Y. Ts'o <tytso@mit.edu>  Thu, 01 Sep 2016 23:30:55 -0400

e2fsprogs (1.43.2-1) unstable; urgency=medium

  * Change the default journal size to be larger for file systems larger
    than 128 GB to improve performance on metadata-heavy workloads
  * Clarify tune2fs's message when the user needs to run e2fsck
    (Closes: #828022)
  * Fix an alignment bug in e2fsck which caused sparc64 architectures to
    crash when replaying the journal on file systems with a 64-bit block
    number
  * Fix a typo in debugfs when printing out the dtime field on file
    systems with an extended timestamp
  * Fix the logic in e2fsck which decides when to repair legacy negative
    timestamp encodings.
  * Add a command to debugfs to copy the inode structure from one inode
    to another
  * Fix resize2fs so it will not crash if there is an extended
    attribute block but it doesn't need to migate any blocks during
    an off-line resize
  * Fix a crash when mke2fs or debugfs tries to copy in a directory
    hierarchy containing an empty directory
  * Fix a bug in e2fsck caused by a power failure during e2fsck's journal
    replay could leave the file system in a state where if the file
    system is mounted without doing a full e2fsck scan, the file system
    could get corrupted
  * Fix big endian bugs in the e2undo program
  * Fix debugfs's logdump so command so it can correctly handle journals
    which are larger than 2GB
  * Add new translations: Hugarian and Serbian
  * Update the Catalan, Chinese, Danish, Dutch, French, German, Polish,
    Swedish, Ukrainian translations

 -- Theodore Y. Ts'o <tytso@mit.edu>  Thu, 01 Sep 2016 00:55:13 -0400

e2fsprogs (1.43.1-1) unstable; urgency=medium

  * New upstream version
  * Fix the Direct I/O fallback code in the Unix I/O manager so it
    implements read-modify-write correctly.
  * The mke2fs program will now warn if the user specifies a label which
    is too long.  (Closes: #791630)
  * Clean up various man pages (Closes: #766379, #761144, #770750,
    #428361, #766127)
  * Fix bug so that debugfs's rdump command works on the root directory
    (Closes: #766125)
  * Fix various Debian packaging issues (Closes: #825868)
  * Build fully security hardened binaries

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue, 07 Jun 2016 23:09:55 -0400

e2fsprogs (1.43-3) unstable; urgency=medium

  * Fix various debian packaging nits
  * Fix spelling mistakes in the copyright files
  * Fix various spelling mistakes in man pages
  * Fix project quota bugs in e2fsck and mke2fs
  * Build binaries with hardening support
  * Improve e2fsck messages when the journal superblock is corrupt and
    the user declines to fix the journal.  (Closes: #768162)
  * Fix debugfs's handling of "set_bg <bg> checksum calc" on 64-bit file
    systems.
  * Simplify the debian rules file

 -- Theodore Y. Ts'o <tytso@mit.edu>  Wed, 25 May 2016 00:51:33 -0400

e2fsprogs (1.43-2) unstable; urgency=medium

  * Update watch file to check for the GPG signatures
  * Use dh_update_autotools_control to update config.{guess,sub}
    automatically when building the package.
  * Only try to run update-initramfs if it exists
  * Transition to dbgsym packages

 -- Theodore Y. Ts'o <tytso@mit.edu>  Fri, 20 May 2016 14:07:40 -0400

e2fsprogs (1.43-1) unstable; urgency=medium

  * New upstream version
  * Fix or improve offset support in mke2fs, e2undo, and libext2fs
  * Update debian policy version to 3.9.8

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue, 17 May 2016 01:04:28 -0400

e2fsprogs (1.43~WIP.2016.03.15-2) sid; urgency=low

  * Fix FTBFS on big-endian systems

 -- Theodore Y. Ts'o <tytso@mit.edu>  Thu, 17 Mar 2016 22:55:52 -0400

e2fsprogs (1.43~WIP.2016.05.12-1) unstable; urgency=medium

  * New upstream version
  * Clean up various man pages and usage messages
  * Fix up gcc and Coverity warnings
  * Stop building static binaries using dietlibc
  * Fix potential out-of-boundary memory access in resize2fs
  * Fix sparse_super2 bugs in mke2fs and resize2fs
  * The mke2fs program will now support multiple -O options
  * The e2image program now ignores checksum error so that debugging
    snapshots of a file system can be taken of a broken file system
  * E2fsck now more cleanly handles checksum errors while replaying the
    journal
  * Fix e2fsck to not try to set a UUID if the metadata_csum feature is
    enabled since this will break the checksums
  * Fix e2image so progress information won't get leaked to stdout
  * Fix bugs in "mke2fs -E offset=NNNN" (Closes: #803629)
  * Fix Hurd portability issues (Closes: #822576)
  * Update initramfs in e2fsprogs's postinst script so the initial
    ramdisk gets the updated e2fsprogs binaries (Closes: #804237)
  * Work around texi2dvi bug which can cause build failures (Closes: #822227)
  * E2fsck now prints "REBOOT SYSTEM" instead of "REBOOT LINUX" to
    assuage the sensibilities of Hurd users (Closes: #769838)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Thu, 12 May 2016 00:18:45 -0400

e2fsprogs (1.43~WIP.2016.03.15-1) unstable; urgency=low

  * New upstream release
  * Fix resize2fs bug that could leave block allocation bitmaps
    uninitialized
  * The tune2fs program will ask the user for confirmation before
    starting dangerous operations if the terminal is available, and it
    will replay the journal if necessary
  * Fix a bug which in rare cases would cause e2fsck -fD to corrupt an
    extent-mapped directory.
  * E2fsck will now check for extent mapped inodes with no extent header
    and clear them if found
  * E2fsck now checks to make sure the extended attribute header doesn't
    result in the xattr extending beyond the bounds of the inode
  * Teach mke2fs to parse a human-readable argument for -i option
  * Teach mke2fs to automatically handle creating file systems > 500T by
    automatically enable the meta_bg feature
  * Mke2fs will now prompt for user verification before rewriting a file
    system's superblock using the -S option
  * Mke2fs no longer complains if the user tries to create a file system
    using the entire block device (e.g., without using a partition).
    The minor number convention is not used by all block devices, and
    it's quite normal in some circumstances to create a file system
    on /dev/sdc instead of /dev/sdc1
  * Debugfs now can properly display and set extended timestamps
  * Add an ext2/3/4 FUSE server
  * Fix an "mke2fs -d" bug which could create inodes with invalid
    extended attribute blocks
  * Fix miscellaneous file encryption bugs
  * Fix miscellaneous MMP bugs in debugfs
  * The e2fsck program will no longer update the quota inodes when it is
    interrupted
  * The filefrag program now accounts for holes in sparse files created
    by the file punch operation as an expected/optimal mapping
  * Clean up gcc/clang warnings
  * Add support for the checksum seed feature
  * Add support for the project quota feature
  * Add fallocate support to libext2fs and to debugfs
  * Clean up various man pages (Closes: #798425)
  * Update debian policy compliance to 3.9.7

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue, 15 Mar 2016 01:34:14 -0400

e2fsprogs (1.43~WIP.2015.05.18-1) unstable; urgency=low

  * Merge in updates from the maint branch (changes from 1.42.13)
  * Add support for file encryption feature
  * Mke2fs will now create file systems with metadata_csum and 64bit
    enabled by default.
  * The resize2fs command can now convert file systems between 64-bit
    and 32-bit mode.
  * The new undo file format is much faster/efficent than before
  * E2fsck now has readahead support to speed up its behavior on RAID
    arrays.
  * E2fsck can now rebuild/optimize inode extent trees

 -- Theodore Y. Ts'o <tytso@mit.edu>  Mon, 18 May 2015 01:47:43 -0400

e2fsprogs (1.42.13-1) unstable; urgency=low

  * New upstream version
  * NMU acknowledge (Closes: #778948)
  * Fixed a bug which could cause e2fsck to corrupt Hurd file systems.
    (Closes: #760275)
  * Fixed a deadlock which occurs when using systemd and e2fsck.conf's
    logging feature.  (Closes: #775234)
  * Fixed a bug which could cause programs using libext2's inode table
    scanning functions from crashing on certain corrupted file systems.
    (Closes: #773795)
  * Fixed dumpe2fs so it won't crash if the user doesn't specify a block
    device (file system).  (Closes: #764293)
  * Fixed e2fsck so if it notices unexpected HTREE blocks in pass 2, it
    will report the correct directory inode containing the inconsistency.
  * If e2fsck fails to grow the dir_info structure due realloc(3) not
    having enough memory, it will now fail with explanatory message
    instead of staggering on failing with a confusing internal error
    messages.
  * The tune2fs program will zero out the superblock journal backup
    information when removing a journal from a file system.
  * The mke2fs program now enables the large_file feature by default.
  * Fixed a bug which could cause badblocks to crash if there are millions
    and millions of bad blocks.
  * Fixed some use-after-free bug in resize2fs and e2fsck.
  * Fixed some bigendian bugs that had crept into both indirect and extent
    handling inside libext2fs.
  * Updated/fixed various man pages.
  * Update Esperanto, German, and Spanish translations.  Added Danish
    translation.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun, 17 May 2015 20:38:27 -0400

e2fsprogs (1.43~WIP-2015-03-29-1) unstable; urgency=low

  * Merge in updates from the maint branch (changes from 1.42.12-1)
  * Add support for inline directories
  * Add support for the jbd2 checksum v3 format
  * New dumpe2fs format
  * Add support for file encryption feature

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun, 14 Dec 2014 22:49:03 -0500

e2fsprogs (1.42.12-1.1) unstable; urgency=high

  * Non-maintainer upload by the Security Team.
  * Fix CVE-2015-1572: incomplete fix for CVE-2015-0247 (closes: #778948).

 -- Michael Gilbert <mgilbert@debian.org>  Sun, 22 Feb 2015 01:50:57 +0000

e2fsprogs (1.42.12-1) unstable; urgency=low

  * New upstream version
  * Fix various e2fsck bugs when trying to repair bigalloc file systems.
  * E2fsck can now repair a file system with an overly large
    s_first_meta_bg field, which had previously caused all e2fsprogs
    programs to crash when trying to open such a file system.
  * Fix e2fsck so that it can correctly fix a number of rare file system
    corruptions that were discovered when using a file system fuzzer.
  * Fix e2fsck so it does not try to write back block group descriptors
    if they have not been modified.
  * The mke2fs program will now place metadata blocks in the last
    flex_bg so they are contiguous.  This reduces free space
    fragmentation in a freshly created file system, as well as allowing
    mke2fs commands which request extremely large flex_bg size to succeed.
  * Mke2fs now creates hugefiles more efficiently (with fewer extent
    tree blocks).
  * Fix a 32/64-bit overflow bug that could cause resize2fs to loop
    forever.
  * Reduce the memory consumption of resize2fs for very large file
    systems.
  * Fix a bug that could cause resize2fs to create a corrupted file
    system when shrinking a very large file system (typically > 16TB)
    that had been previously grown using resize2fs.  (Closes: #756922)
  * Fix tune2fs updating UUID's when manipulating file systems with
    external journals (both the file system and journal UUID).
  * Fix tune2fs so it can remove an external journal for file systems
    with a 1k block size.
  * Add a new debugfs command, "inode_dump", which prints the inode in
    hex and ASCII format.
  * The debugfs command "set_inode_field" will now automatically
    allocate blocks for indirect blocks and extent tree blocks.
  * Fix debugfs's "set_inode_field" so can properly handle
    "block[IND|DIND|TIND]".
  * The debugfs "rdump" command will now take multiple source arguments.
  * Fix debugfs's argument parsing for the freefrag command.
  * Fixed a double close(2) bug in "rdump" and "rdump -p".
  * Fix filefrag to properly handle using the FIBMAP ioctl (with -B).
  * e4defrag will now defrag backwards-allocated files
  * Clarified messages that were confusing users in debugfs, e2fsck,
    mke2fs, and resize2fs (Closes: #758029, #757543, #757544)
  * Dumpe2fs will now complain if extra arguments are given to it.
    (Closes: #758074)
  * Update/clarify various man pages (Closes: #726760)
  * Update Czech, Dutch, French, Polish, Spanish, Sweedish, Ukrainian,
    and Vietnamese translations

 -- Theodore Y. Ts'o <tytso@mit.edu>  Fri, 29 Aug 2014 08:50:48 -0400

e2fsprogs (1.42.11-2) unstable; urgency=low

  * Don't try to build lib/ext2fs/tst_ext2fs unless running "make
    check"; this fixes a MIPS FTBFS problem because mips has a special
    no-pics build needed for bootloaders where we only build libext2fs
    but not libss or other libraries (Closes: #754605)
  * Update French translation

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun, 13 Jul 2014 16:18:27 -0400

e2fsprogs (1.42.11-1) unstable; urgency=medium

  * New upstream version
  * NMU acknowledge (Closes: #752107)
  * mke2fs can now create hugefiles which are aligned to the beginning
    of the disk (instead of relative to the beginning of the partition),
    controlled via a mke2fs.conf configuration parameter.
  * Fix a bug which caused e2fsck to abort a journal replay on a file
    system with bigalloc enabled.  (Closes: #744953)
  * Fix mke2fs so it more correctly handles large flex_bg counts
  * Mke2fs will check the kernel version number and not just the sysfs
    feature flag to determine whether it is safe to enable lazy
    inode table initialization, so it won't get faked out if the ext4 is
    compiled as a mdoule which hasn't happened to be loaded yet.
  * E2fsck will now automatically fix a last mount time or last write time
    which is in the future in preen mode.
  * Mke2fs will now check the file system revision number requested by the
    command line, and reject it if it is too large.
  * If filefrag runs into an error, it will continue processing the rest
    of the files specified on thec ommand line, but then exit with an
    error code.
  * Filefrag now prints some additional new flags (such as
    FIEMAP_EXTENT_ENCODED), and print unknown flags as hex values.
  * Fixed support in filefrag for files with > 2**32 blocks on 32-bit
    platforms.
  * Fixed a file descriptor leak in debugfs when copying files.
  * Add Esparanto and Ukrainian translations, and update Czech, Dutch,
    French, German, Italian, Polish, Sweedish, and Vietnamese translations.
  * Fixed cross-compilation support.  (Closes: #753375)
  * Update/fix various man pages

 -- Theodore Y. Ts'o <tytso@mit.edu>  Wed, 9 Jul 2014 23:43:27 -0400

e2fsprogs (1.42.10-1.1) unstable; urgency=medium

  * Non-maintainer upload.
  * Add patch from upstream git that fixes creating filesystems in files
    larger than 2GB on 32 bit architectures (Closes: #752107)

 -- Hilko Bengen <bengen@debian.org>  Sat, 21 Jun 2014 12:57:25 +0200

e2fsprogs (1.43~WIP-2014-02-04-1) unstable; urgency=low

  * Merge in updates from the maint branch (changes from 1.42.10-1)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Wed, 04 Feb 2014 23:31:56 -0500

e2fsprogs (1.42.10-1) unstable; urgency=medium

  * New upstream version
  * The mke2fs program no longer requires a force (-F) option when
    when creating a file system in a regular file, since this is a very
    common use case when managing virtual machine images
  * The mke2fs program will now ask for confirmation before wiping out a
    pre-existing file system, partition label, or physical volume
  * Fix e2fsck so that it properly handles an inconsistent quota inode.
    Previously the quota inode could be completely corrupted, and
    missing quota records could be not noticed
  * Fix mke2fs so if packed metadata blocks are enabled that the block
    group checksum are set correctly
  * Debugfs has new commands to allow the quota inode to be queried directly
  * Tune2fs will allow removal of dirty journal with two "-f" options
    (Closes: #559301)
  * Fixed some off-line resize2fs bugs when relocating metadata blocks
    when growing or shrinking bigalloc file systems
  * Fixed resize2fs's calculation of the minimum required file system
    size.  This allows resize2fs -M to shrink the file system more
    aggressively
  * Fixed resize2fs to properly handle shrinking a very large and empty
    file system to a very very small size
  * Fixed e4defrag to work with 64-bit and bigalloc file systems
  * Fixed e2fsck to not issue a large number of very scary (but
    harmless) corruption messages when checking very large file systems
    when the file system has more inodes than the number of seconds
    since January 1, 1970.
  * E2fsck will now check the whole file system if file system problems
    are detected durings its initial "pass 0" sanity check
  * Filefrag now prints the "shared extent" flag which is used by some
    file systems such as btrfs
  * The mke2fs program would previously correctly omit the resize_inode
    feature when creating a file system > 16TB when the fs size was
    determined automatically.  It will now also do the right thing when
    the user explicitly specifies the file system size.
  * The message printed by logsave is now much less scary (Closes: #468821)
  * Fix spelling typo in the package descriptions
  * Update Czech, Dutch, French, German, Polish, Spanish, Sweedish, and
    Vietnamese translations (Closes: #703048)
  * Update/fix various man pages
  * Fix debian/rules compatibility problem with GNU make 4.0

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun, 18 May 2014 22:54:38 -0400

e2fsprogs (1.42.9-3) unstable; urgency=medium

  * Add the ability for mke2fs to create hugefiles
  * Add support for the sparse_super2 compat feature
  * Mke2fs can now force all of the metadata blocks to be at the
    beginning of the file system
  * Fix loopback mount detection (Closes: #497984)
  * Add support to mke2fs to create a file system at an offset
    (Closes: #417385)
  * Mention badblocks in the package description (Closes: #718725)
  * Update/fix various man pages (Closes: #719184, #719189)
  * Improve e2fsck's "superblock corrupt" message (Closes: #719185)
  * Miscellaneous Coverity clean ups

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue, 04 Feb 2014 22:17:22 -0500

e2fsprogs (1.42.9-2) unstable; urgency=low

  * Fix lintian warning: debian-changelog-has-wrong-weekday
  * Fix lintian warning: non-standard-dir-perm by using dh_strip's
    --dbg-package option instead of manually managing the debug files
  * Fix printf type format mismatch in e2image
  * Improved debugfs's error reporting when parsing block numbers
  * Use consistent configure options across the multiple e2fsprogs
    builds; this means that e2fsck.static will now use the blkid library
    shipped with util-linux, instead of the internal one shipped with
    the e2fsprogs sources.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Mon, 30 Dec 2013 16:56:50 -0500

e2fsprogs (1.42.9-1) unstable; urgency=low

  * New upstream version
  * NMU ack (Closes: #698879)
  * Fix cross-build support (Closes: #721365)
  * mke2fs will detect an attempt to create a file system on a
    loop-mounted image file
  * Fixed a large number of bugs in resize2fs, e2fsck, debugfs, to
    handle bigalloc and 64-bit file systems.
  * Tune2fs will no longer allow changing the uuid on a mounted file
    system with the uninit_bg feature enabled.
  * E2fsck will properly allocate a new extent tree block in the rare
    case where one is needed when rehashing an extent-mapped directory.
  * Mke2fs wil now properly set the LARGE_FILE feature when creating a
    journal > 2GB.
  * Debugfs will now correctly handle free a range of inodes using the
    freei command.
  * E2fsck will no longer complain if an external journal was exactly
    2**32 blocks.
  * E2fsck will not longer try to add a missing lost+found directory
    when run in read-only mode.
  * Fixed some buffer overrun bugs when creating standard e2image files
  * Mke2fs will not try to set both the meta_bg and resize_inode feature
    when the extended option "-E resize=NNN" is specified by the user.
  * Dumpe2fs will no longer abort when trying to print the journal
    information from an e2image-created image file.
  * Debugfs's "write" command can now create a sparse files
  * Debugfs can now support a command line which is up to 8k long
  * E2image will refuse to create a raw or qcomw image using a mounted
    file system unless the -f option is given.
  * E2image has been made more useful for efficiently copying file
    systems using the -ra options.  New options to help with this use
    case that were added: -o, -O, -p, and -c.
  * Fixed a regression introduced in 1.42.8 which would cause e2fsck to
    erroneously report uninitialized extents past i_size to be invalid.
  * Fixed cases where resize2fs could corrupt a file system, especially
    when shrinking a file system.  (Closes: #660793)
  * Fixed resize2fs and e2fsck to not crash when operating on a file
    system with the MMP feature enabled.
  * Fixed debugfs's write command to properly create a zero-length file
    (instead of creating an invalid inode).
  * Fixed e2fsck to not crash when trying to delete an invalid
    extent-mapped symlink.
  * Improved debugfs's help texts
  * Fixed a potential integer overflow problem in e2freefrag
    (Closes: #718205)
  * The config.guess and config.sub files have been updated to the
    latest to help with the ppcle port.  (Closes: #732076)
  * Updated/fixed various man pages.  (Closes: #586218, #669730,
    #698076, #731329)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sat, 28 Dec 2013 23:18:36 -0500

e2fsprogs (1.42.8-1) unstable; urgency=low

  * New upstream version
  * Work around Debian Bug #712530 (Closes: #708307)
  * Fix e2fsck so it can check a read-only root file system with an
    external journal.  (Closes: #707030)
  * Fix off-line resizing of file systems with flex_bg && !resize_inode
    (Closes: #696746)
  * Change mke2fs so that it does not set the root directory to the real
    uid/gid of the mke2fs process.  Add the extended option root_owner to
    override this behavior.
  * If an invalid journal size is given to mke2fs, it will now complain
    and exit sooner.
  * Fix resize2fs when shrinking file systems to make sure that bitmap
    blocks aren't left outside the bounds of the shrunken file system.
    This could happen with flex_bg file systems that were grown using
    the old online resizing algorithm.
  * E2fsck will now detect and repair corrupted extent trees which contain
    invalid extents at the end of the extent tree leaf block.
  * E2fsck will now longer complain about zero length extended attribute values.
  * Fix a regression introduced in e2fsprogs v1.42 which caused e2image -s
    to crash.
  * Add safety check so tune2fs will not attempt to set the inode size to
    be larger than the block size.
  * Enhance chattr to allow clearing the extent flag if the kernel allows it
  * Fix e2image with large (> 32-bit) file systems (Closes: #703067)
  * Mke2fs will not give warnings about the bigalloc and quota options in
    quiet mode.
  * Debugfs was erroneously giving spurious error messages for certain
    extent_inode subcommands which take arguments (split_node,
    replace_node, and insert_node).  This has been fixed.
  * Fix the parsing of the 's' (sectors) in parse_num_blocks2, which among
    other programs is used by mke2fs.
  * Fix texinfo incompatibilities (Closes: #712365)
  * Updated/fixed various man pages  (Closes: #712429, #712430, #707609)
  * Update German translation

 -- Theodore Y. Ts'o <tytso@mit.edu>  Thu, 20 Jun 2013 23:09:25 -0500

e2fsprogs (1.42.7-1) unstable; urgency=low

  * New upstream version
  * Add warning indicating that the quota and bigalloc features are
    still under development.
  * Added new options to filefrag to be consistent with the version from
    Lustre
  * Optimized e2fsck's CPU utilization
  * Fixed e2fsck so it detects and fixes inconsistencies in the interior
    nodes of an inode's extent tree
  * Fixed a potential memory corruption failure in e2fsck's error path if
    the call to ext2fs_open2() fails.
  * Fixed e2fsck if its logging function is enabled in e2fsck.conf, and
    the resulting file name for the log file is longer than 100 bytes,
    that it properly handles this situation instead of crashing.
  * E2fsck will now report the amount of memory that it attempted to
    allocate when a memory allocation request fails, to make it easier to
    track down the problem.
  * Fixed a bug in resize2fs which could cause severe file system
    corruption when growing an ext4 file system which was formatted with
    fewer-than-normal reserved gdt blocks
  * Fixed resize2fs to be able to handle off-line resizes of file
    systems with the flex_bg feature and without any reserved gdt
    blocks or if the file system did not have the resize_inode feature
  * Further optimize resize2fs so it doesn't use quite as much CPU when
    resizing very large file systems.
  * Fixed 32-bit overflow bugs which could cause resize2fs to fail and
    possibly corrupt the file system while resizing 64-bit file systems.
  * Fixed a big which could cause resize2fs to corrupt bigalloc file systems.
  * Fix a crash while mke2fs is parsing "-E resize=NNN" with the 64bit
    file system feature enabled
  * Added better error checking to mke2fs to check for invalid
    parameters when creating bigalloc file system.
  * When creating bigalloc filesystems, the -g option to mke2fs will now
    specify the number of clusters per block group.
  * Added the "symlink", "zap_block", "block_dump", and "extent_open"
    commands to debugfs
  * Fixed debugfs's htree command so that all its messages are sent
    through the pager.
  * Fixed debugfs's dump_file and cat functions so they work correctly
    on file systems with a block size greater than 8k.
  * Fixed mke2fs's handling of the mmp_update_interval option
  * Fixed e2freefrag so it works on 64-bit file systems, and so it uses
    much less memory.
  * E2image can now include all data blocks in the e2image output
    file when the user specifies the -a option.
  * Fixed debugfs's mknod command so that it updates the block group
    statistics
  * Document the bigalloc feature in the mke2fs man page.
    (Closes: #669730)
  * Update Czech, Dutch, French, German, Polish, Sweedish, and
    Vietnamese translations

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue, 21 Jan 2013 21:52:58 -0500

e2fsprogs (1.43~WIP-2012-09-22-1) unstable; urgency=low

  * Add metadata checksum feature

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sat, 22 Sep 2012 21:50:20 -0400

e2fsprogs (1.42.6-1) unstable; urgency=low

  * New upstream version
  * Fix build dependencies to avoid requiring dc, and to allow
    cross-building to work (Closes: #677497)
  * Updated/fixed various man pages
  * Mke2fs will now update its progress indicators at most once a second
    to avoid overwhelming serial consoles.
  * Resize2fs will support lazy_itable_init, speeding up off-line growth
    of uninit_bg file systems.
  * Resize2fs now supports on-line resizing 64-bit file systems beyond
    16TB.  A number of bugs in resize2fs which prevented this have been
    fixed.
  * Resize2fs now correctly handles resizing 32-bit file systems to 16TB.
  * Fixed a potential segfault in e2fsck when there is an I/O error
    while reading the superblock.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Fri, 21 Sep 2012 12:14:41 -0400

e2fsprogs (1.42.5-1.1) unstable; urgency=low

  * Non-maintainer upload.
  * e2fsck-static, e2fsprogs: let preinst remove a symbolic link in
    /usr/share/doc, that should have been replaced with a directory since
    1.39+1.40-WIP-2006.10.02+dfsg-1. (Closes: #698879).

 -- Nicolas Boulenguez <nicolas@debian.org>  Fri, 22 Feb 2013 23:14:59 +0100

e2fsprogs (1.42.5-1) unstable; urgency=low

  * New upstream version
  * Mark the e2fsprogs package as Multi-Arch: foreign, so if a package
    foo:i386 depends on e2fsprogs and is installed on an amd64 system,
    the native e2fsprogs will satisfy the dependency.  (Closes: #678395)
  * Fix a fd leak which could cause logsave (and hence a boot-time rc
    init script) to hang (Closes: #682592)
  * Fix a problem if e2fsck where if the root file system is mounted
    read-only, e2fsck would not clear an error indication in the journal
    superblock.  Combined with a kernel bug, this would cause the e2fsck
    to check the file system after every single boot
  * Fixed filefrag so it would not seg fault on virtual filesystems such
    as /proc: e.g., "filefrag /proc/partitions"
  * Fix filefrag so that it correctly reports the number of extents
  * Fixed a bug which caused "mke2fs -N 256 -t ext4 /tmp/foo.img 256m"
    to write blocks out until /tmp filled
  * Fixed a bug in how e2fsck would uniquify directory entry names
  * Change e2fsck so it will allow file systems mounted read-only to be
    checked with the -f option.
  * Fix e2fsck so that the file system is marked as containing an
    error if the user chooses not to fix the quota usage information.
  * Fix tune2fs so that it correctly removes the quota feature when
    the last quota inode is removed.
  * Fix tune2fs so that after removing a quota inode, the block bitmap
    is updated; otherwise, e2fsck would complain after running 'tune2fs
    -O ^quota <dev>'.
  * Fix tune2fs so that when converting a file system from using legacy
    quota files to the new quota file system feature with hidden quota
    files, the accounting for these files is handled correctly so that
    e2fsck doesn't complain.
  * The e4defrag program now allows device symlinks, such as
    /dev/mapper/testvg-testlv, instead of insisting on less
    human-friendly names such as /dev/dm-2
  * Updated/fixed various man pages  (Closes: #680114)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun, 29 Jul 2012 19:59:56 -0400

e2fsprogs (1.42.4-3) unstable; urgency=medium

  * Add the -C option to chattr's usage message
  * Fix e2fsprogs so it is blhc (build log hardening check) clean.  This
    fixed e2fsck.static which previously was not getting built with the
    security hardening flags.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Wed, 13 Jun 2012 16:03:24 -0400

e2fsprogs (1.42.4-2) unstable; urgency=medium

  * Fix FTBFS problem on the hurd and freebsd platforms

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue, 12 Jun 2012 18:26:40 -0400

e2fsprogs (1.42.4-1) unstable; urgency=medium

  * New upstream version
  * Fix 64-bit block number bugs in e2fsck, dumpe2fs, and debugfs which
    could corrupt file systems
  * Fixed e2fsck's handling of how errors propagate from the journal to
    the file system superblock
  * Fixed a false positive complaint from e2fsck if all of the extents
    in the last extent block are uninitialized and located after the
    end of the file.
  * dumpe2fs will display the journal's error indicator in the
    superblock if it is set
  * Fixed a  bug which caused e2fsck to incorrectly use O_EXCLUSIVE in
    some corner cases.
  * Fix truncation of extent-mapped inodes in e2fsck and libext2fs
  * Fixed i_blocks accounting in bigalloc file systems.
  * Add support for btrfs's No_COW flag to lsattr and chattr
  * Debugfs interprets the date strings of the form "@ddd" as ddd
    seconds after the epoch
  * Updated/fixed various man pages  (Closes: #674453, #674694)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue, 12 Jun 2012 18:20:55 -0400

e2fsprogs (1.42.3-1) unstable; urgency=low

  * New upstream version
  * Fix bugs on 32-bit systems which could corrupt > 16TB file systems
  * Quiet complaints in e2fsck when the total free blocks or inodes are
    incorrect in the superblock after an system crash, since we don't
    update nor depend on the superblock summaries at each commit boundary
  * Fixed support for (hidden) quota files built into ext4; in
    particular, don't rewrite the quota inode unless the quotas are
    inconsistent
  * Optimized reading and writing bitmaps if direct I/O was enabled
  * Update Czech, Dutch, French, German, Polish, Sweedish, and
    Vietnamese translations
  * Fixed incorrect indentation in tune2fs man page
  * Update debian policy compliance to 3.9.3

 -- Theodore Y. Ts'o <tytso@mit.edu>  Mon, 14 May 2012 14:43:09 -0400

e2fsprogs (1.42.2-2) unstable; urgency=low

  * Fixed e2fsck.conf's man page (Closes: #646963)
  * Fixed 32-bit binary compatibility problem for the libext2fs shared
    library introduced in 1.42.2
  * mke2fs will no longer fail if the /etc/mtab file is not present

 -- Theodore Y. Ts'o <tytso@mit.edu>  Mon, 09 Apr 2012 14:54:33 -0400

e2fsprogs (1.42.2-1) unstable; urgency=low

  * New upstream version
  * Fixed various man pages (Closes: #665427)
  * Speed up resize2fs for large file systems (Closes: #663237)
  * Be less strict about the EXT4_EOFBLOCKS_FL flag (which will
    eventually be going away in the ext4 file system format)
  * Teach mke2fs to use direct I/O if the -D option is given
  * Print errors returned by ext2fs_open2() and ext2fs_check_desc() so
    we can more easily diagnose memory allocation failures caused by
    insufficient memory and abort on memory allocation failures
  * E2fsck can now write log files containing the details of the
    problems that were found and fixed directly.
  * E2fsck can now limit the number of messages issued and printed on
    the console
  * The dumpe2fs, debugfs, and tune2fs now use rbtree bitmaps, which
    cause them to use much less memory for large file systems.
  * E2fsck will now check for zero-length extents, since older kernels will
    OOPS if they comes across one
  * Fix e2fsck's discard behaviour so it does not discard too many
    blocks, and it will not use discard if the device advertises
    that discard does not persistently zero data.  Also, if e2fsck is
    run in read-only mode, do not try to discard data.
  * Fix mke2fs -S so it does not corrupt the first block group's
    information.
  * Add pointer for e2fsprogs-udeb to libcomerr2.shlibs (Closes: #665885)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue, 27 Mar 2012 15:55:57 -0700

e2fsprogs (1.42.1-2) unstable; urgency=low

  * Fix the fact that dpkg-buildflags was being ignored due to a
    bash'ism in debian/rules.
  * Check the new /sys/class/power_supply/AC/online since
    /proc/acpi/ac_adapter/... is deprecated and may not be present on
    newer kernels.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Mon, 20 Feb 2012 19:12:20 -0500

e2fsprogs (1.42.1-1) unstable; urgency=low

  * New upstream release
  * dpkg-buildflags is now used if it is present.  This allows Debian
    Wheezy to build with security hardened build flags.  (Closes: #654457)
  * mke2fs and e2fsck now use much less memory for large file systems
  * Fixed mke2fs -S so it can be usefully used as a last ditch recovery
    command when for ext4 filesystems that have the uninit_bg feature enabled.
  * The mke4fs argv[0] is now recognized by mke2fs.
  * Fixed usage and help messages for mke2fs.
  * Eliminated spurious bad block group checksum warnings when e2fsck
    falls back to using the backup group descriptors.
  * Debugfs's ncheck command is now much more useful when used to
    diagnose badly corrupted file system.  Added a new -c option.
  * Fixed bug in e2image which could cause it to fail to set i_size
    correctly if the last hole in the file is an exact multiple of a
    megabyte.
  * Fixed a bug with resize2fs where for 1k and 2k file systems, the
    minimum file size used for resize2fs -M could be a block too small.
  * Fixed the badblocks program to honor the -s flag when in read-only -t
    mode.  (Closes: #646629)
  * Update Czech, Dutch, French, Polish, and Swedish translations

 -- Theodore Y. Ts'o <tytso@mit.edu>  Fri, 17 Feb 2012 15:07:13 -0500

e2fsprogs (1.42-1) unstable; urgency=low

  * New upstream release
  * Fixed hurd FTBFS (Closes: #649689)
  * Optimized e2fsck speed on large file systems when using [scratch_files]
  * Fixed e2fsck handling of blocks claimed by multiple inodes in
    bigalloc file systems
  * Fixed e2fsck's calculation of max file size for non-extent based
    files when huge_file is enabled
  * Update Czech and Swedish translations

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue, 29 Nov 2011 15:50:07 -0500

e2fsprogs (1.42~WIP-2011-11-20-1) unstable; urgency=low

  * New upstream release
  * Fix error checking so resize2fs works when using a 32-bit userspace
    and a 64-bit kernel (Closes: #644989)
  * e2fsck now returns additional status bits in its exit code if it
    aborts early in the e2fsck run
  * Fix potential stack overflow in debugfs
  * Avoid an infinite loop in ext2fs_find_block_device() if there are
    symlink loops in /dev caused by a buggy udev
  * Fix test failures on big-endian systems
  * Fix gcc -Wall complaints
  * Add freefrag and e2freefrag commands to debugfs
  * Add a read-only, metadata-only debugfs command called rdebugfs
  * Improve first-class quota support
  * Fix bigalloc support in e2freefrag
  * Clean up mmp handling
  * Fix a regression which caused mke2fs to not work correctly on files
    > 2GB.  (Closes: #647245)
  * Fix a namespace leak in libext2fs (tdb_null)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun, 20 Nov 2011 21:32:49 -0500

e2fsprogs (1.42~WIP-2011-10-16-1) unstable; urgency=low

  * New upstream release
  * Fix online resizing with resize2fs (Closes: #644989)
  * Fix bug which caused shrinking an empty file system file system to
    its minimal size to sometimes fail.
  * Don't look at the high 16 bits of i_file_acl if the 64-bit feature
    is not enabled; this fixes a Hurd compatibility field since this is
    used for the high 16 bits of i_mode on Hurd.
  * Update Sweedish, Polish, French, German, and Czech translations

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun, 16 Oct 2011 22:07:03 -0400

e2fsprogs (1.42~WIP-2011-10-09-1) unstable; urgency=low

  * New upstream release
  * Fixed infinite loop in filefrag (Closes: #644792)
  * Fixed various spelling and translation problems
  * Fixed various man pages
  * Fixed 64-bit block numbers in e2fsck's journal replay
  * Fixed mipsel FTBFS that was fixed for mips
  * Update Sweedish, French, and Czech translations
  * Convert to debian source 3.0 (quilt) format

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun, 09 Oct 2011 22:24:31 -0400

e2fsprogs (1.42~WIP-2011-10-05-2) unstable; urgency=low

  * Fix portability issues with non-Linux platforms and for the mips
    platform, which does some really strange things vis-a-vis
    32/64-bit support without actually having a 64-bit version of
    the architecture (Closes: #644502)
  * Fix dependency problem which causes the newer version of libcom_err2
    to get pulled in when upgrading to e2fsprogs, which needs the new
    interface exported by libcom_err2.  (Closes: #644425, #644584)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Fri, 07 Oct 2011 18:27:06 -0400

e2fsprogs (1.42~WIP-2011-10-05-1) unstable; urgency=low

  * Update translations: German (Closes: #520985)
  * Fixed usage and error text for mke2fs -C option
  * Updated e2fsprogs.pot file for translators
  * Added support for internationalized error strings for libcom_err
  * Fixed various portability nits that were causing FTBFS problems on
    Hurd and FreeBSD
  * Added "big" and "huge" types to mke2fs.conf, since they are needed
    for very large file systems
  * Fixed on-line resizing which had been broken in the 1.42 series
    (Closes: #451388)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Wed, 05 Oct 2011 02:10:53 -0400

e2fsprogs (1.42~WIP-2011-10-01-2) unstable; urgency=low

  * Update translations: French, German (Closes: #620659)
  * Fix compilation problems in hermetic environments
  * Fix on-line resizing in resize2fs (Closes: #451388)
  * Add definitions for "big" and "huge" filesystems to /etc/mke2fs.conf
  * Fix mke2fs when there are more than 2**32 block groups

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue, 04 Oct 2011 00:04:25 -0400

e2fsprogs (1.42~WIP-2011-10-01-1) unstable; urgency=low

  * New upstream release
  * Avoid unnecessary reboots when checking the root fs in some special cases
  * Fix an off-by-one error in filefrag -v's output
  * Make filefrag display the number of contiguous (not physical)
      extents (Closes: #631498)
  * Clarify the mke2fs.conf.5 man page (Closes: #634883)
  * Add a hurd-specific mke2fs.conf file (Closes: #629355)
  * mke2fs will set s_max_mnt_count to -1 instead of 0 by default to
      work around a bug in pre-3.0 kernels which caused a spurious
      message to be printed when the file system was mounted (Closes: #632637)
  * Fixed portability problems which was causing build failures on
      non-Linux/non-x86 systems.
  * Verify that the bad block inode looks sane before trusting it, to
      avoid it causing more harm than good.
  * Fixed the debian/rules file so that it build successfully if
      DEB_BUILD_OPTIONS contains "nostrip" (Closes: #627535)
  * Fixed some big-endian bugs in the MMP code

 -- Theodore Y. Ts'o <tytso@mit.edu>  Fri, 30 Sep 2011 22:33:41 -0400

e2fsprogs (1.42~WIP-2011-09-25-1) unstable; urgency=low

  * New upstream release
  * Fix FTBFS on big-endian architectures (Closes: #641838)
  * Add support for multiarch (Closes: #632169)
  * Clarify and update debian/copyright file (Closes: #614662)
  * Add support for Multi-Mount Protection (MMP)
  * Allow tune2fs to remove the external journal if the device is not found
  * Updated/clarified man pages (Closes: #642193)
  * Fix a potential FTBFS caused by overly long compile lines (Closes: #629883)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun, 25 Sep 2011 01:28:34 -0400

e2fsprogs (1.42~WIP-2011-09-16-1) unstable; urgency=low

  * New upstream release
  * Added support for the integrated quota feature
  * Improved 64-bit and bigalloc support
  * Mke2fs and tune2fs now allows setting the stride and stripe width to zero
  * Fixed tune2fs's mount options parsing  (Closes: #641667)
  * Fixed an ABI compatibility problem which broke the dump program
      (Closes: #636418)
  * Resize2fs has forward compatibility for a new on-line resize ioctl
      for > 16TB file systems.
  * Fixed a (very hard to hit) bug that could cause e2fsck to crash in
       pass 1 or pass 2
  * Debugfs has a new 'blocks' command
  * Mke2fs now gives a warning if the auto-detected block size exceeds
      the page size
  * Mke2fs and e2fsck now tries to use the punch hole command as a
      "discard" when operating on normal files
  * Mke2fs will not try to do any discard operations if -n is specified
      on the command line
  * Updated/clarified man pages (Closes: #639411)
  * Fixed parsing of MNTOPT_ options for tune2fs and debugfs (Closes: #641667)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Fri, 16 Sep 2011 10:33:59 -0400

e2fsprogs (1.42~WIP-2011-07-02-1) unstable; urgency=low

  * New upstream release
  * Add support for 64-bit file systems
  * Add support for bigalloc file systems
  * Fixed an e2fsck bug which caused "*** FILE SYSTEM WAS MODIFIED ***"
      without an explanation of what was fixed.
  * E2fsck will no longer attempt to clone an extended attribute block
      in pass1b handling if the file system does not support extended
      attributes.
  * E2fsck will be more careful accidentally asking the user to continue
      if the file system is mounted, so that an escape sequence won't
      cause a false positive.  (Closes: #619859)
  * E2fsck now uses less cpu time in pass 5
  * E2fsck will no longer segault when a corrupted file system has a bad
    extent, and removing it leads to a block needing to be deallocated.
  * E2fsck now supports an extended "discard" option which will cause
      e2fsck to attempt discard all unused blocks after a full check
  * The e2image program now supports the qcow2 format, a more efficient
      way of capturing file system metadata snapshots.
  * Mke2fs now supports the [devices] stanza in mke2fs.conf.
  * Mke2fs now supports the reserved_ratio relation in mke2fs.conf.
  * Mke2fs now creates extent-mapped directories for the root and
      lost+found directories.
  * Mke2fs will skip zero'ing the journal if the extended option
      "lazy_journal_init" is specified.
  * Mke2fs will now create file systems that enable user namespace
      extended attributes and with time- and mount count-based file
      system checks disabled.
   * Mke2fs will not set a stride or strip size of one block based on
       block bevice attributes obtained from sysfs.
   * Mke2fs now displays a progress report during the discard process.
   * Mke2fs now handles extreme file system parameters correctly which
       previously caused the inodes per group to drop below 8, leading
       to a segfault.
   * Debugfs's icheck will now correctly find inodes which use the
       searched-for block as an extended attribute block.
   * Debugfs now has a new "punch" command which remove blocks from the
       middle of an inode.
   * The badblocks program now correctly recovers from I/O errors when
       direct I/O is being used.  The badblocks command now also
       supports a -B option which forces the use of buffered I/O, and
       the -v option will provide a more detailed breakdown of read,
       write, and failed comparison errors.
   * Added e4defrag tool which uses the EXT4_IOC_MOVE_EXT ioctl.
   * Added support for journals larger than 2GB.
   * Support using both hard links and symlinks when installing e2fsprogs.
   * Add overflow checking to tune2fs -i's fsck interval, which must fit
       in a 32-bit field.
   * Filefrag will report 0 extents correctly in verbose mode.
   * Logsave's usage message has been fixed.  (Closes: #619788)
   * Update translations: French, Chinese, Germany, Indonesian, Swedish,
        Vietnamese, Polish, Dutch, Czech.
   * Updated/clarified man pages.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sat, 02 Jul 2011 22:38:57 -0400

e2fsprogs (1.41.14-1) experimental; urgency=low

  * New upstream release
  * Fixed a FTBFS on big-endian architectures
  * Fixed spurious warning in mke2fs
  * resize2fs now works correctly on devices exactly 16TB
  * resize2fs will no longer clear the resize_inode feature when the
    number of reserved GDT blocks reaches 0.  This allows a file
    system with the flex_bg feature to be subsequently shrunk.
  * e2fsck will no longer use the extended rec_len encoding for file
    systems whose blocksize is less than 64k, to catch fs inconsistencies
    which the kernel will complain about.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Wed, 22 Dec 2010 18:39:19 -0500

e2fsprogs (1.41.13-1) unstable; urgency=low

  * New upstream release
  * E2fsck can now do journal-only replays via "e2fsck -E journal_only"
  * E2fsck now understands UUID= and LABEL= specifiers for the -j option
    (Closes: #559315)
  * E2fsck.conf now supports a new config option, which forces the
    problem not to be fixed: problems/<problem code/force_no
  * Dumpe2fs now prints friendlier offsets for flex_bg file systems
  * Mke2fs will now fail if the user uses an file system type not
    defined in mke2fs.conf (Closes: #594609)
  * Resize now prints a clarified error message explaining that on-line
    shrinking is not supported at all.  (Closes: #599786)
  * Fixed a build error caused by bad static and profiled dependencies
    for the blkid library (Closes: #604629)
  * Fixed an e2fsck PROGRAMMING BUG error (Closes: #555456)
  * Fixed outdated mention of fsck in the e2fsprogs package (Closes: #588726)
  * Removed obsolete initrd script (Closes: #585041)
  * Fixed bad dependency on libblkid1 due to shlibs.local (Closes: #583551)
  * E2fsck now opens the external journal in exclusive mode to prevent
    clearing the journal of a mounted, snapshotted volume if the user
    accidentally tries to run e2fsck on the snapshot volume (Closes: #587531)
  * Fix a big in e2fsck so it correct test for whether the EOFBLOCKS_FL
    flag should be set or not.
  * Tune2fs can now set uninit_bg without requiring an fsck afterwards
  * Add support for the new ext4 default mount options added in 2.6.35
  * Add support for the ext4 error tracking superblock fields added in 2.6.36
  * Debugfs now uses a more concise format for listing extents in its
    stat command
  * Debugfs can now use direct I/O to access the file system with the -D option
  * Mke2fs will skip initializing the inode table if a device supports
    discard and the discard operation results in zero'ed blocks
  * Mke2fs's handling of logical and physical sector sizes has been
    significantly improved.
  * Debugfs will correctly show the progress bar even when UTF-8
    characters are used in its translation files (Closes: #583782, #587834)
  * E2freefrag will now display the total number of free extents.
  * Resize2fs -P now longer requires a freshly checked file system
  * Fixed a floating point precision error that can cause segfaults in
    e2fsck and resize2fs in extremely rare cases
  * Fixed a bug in e2fsck which caused it to fail if both the original
    and backup superblocks were invalid in some way
  * Fixed a bug in e2freefrag which caused getopt parsing to fail on
    architectures with unsigned chars
  * Clarified mke2fs and e2fsck error messages when given incorrect
    options/values by the user
  * Updated/clarified man pages (Closes: #580236, #594004, #589345, #591083)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Mon, 22 Nov 2010 16:00:50 -0400

e2fsprogs (1.41.12-2) unstable; urgency=high

  * Allow tune2fs to set uninit_bg without requiring an fsck
  * Fix test in e2fsck to correctly check for EOFBLOCKS files
  * Fix dependencies for libuuid and libblkid (Closes: #583551)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Thu, 03 Jun 2010 09:30:36 -0400

e2fsprogs (1.41.12-1) unstable; urgency=low

  * New upstream release
  * mke2fs now gives the correct error message if the external journal
    is device is not found
  * The resize2fs program will refuse to print the minimum size needed
    for a file system if it is not clean.
  * E2fsck now tests for extents that begin at physical block 0 and
    rejects them as invalid.
  * Fixed a bug in e2fsck which could cause it to crash when trying to
    remove an invalid extent and the block bitmaps hadn't yet been loaded.
  * E2fsck will now completely skip time-based checks if the system
    clock looks insane or if the broken_system_clock option is set
    in /etc/e2fsck.conf.  (Closes: #549861, #540152)
  * Fixed a bug in e2fsck which caused e2fsck to complain about i_blocks
    with a 4T file created using posix_fallocate()
  * E2fsck will now correctly mark a sparse journal as invalid and will
    delete and recreate the journal to address the problem.
  * Fixed e2fsck not to ask permission from the user to abort if it's
    going to abort regardless of what the user is going to say...
  * E2fsck can now continue even if it fails to recreate the resize inode
  * E2fsck will now avoid removing directory entries for inods found in
    the unused region of the inode table until after it restarts the fs
    check to avoid removing valid data.
  * E2fsck will now longer try to set the block group checksums if it
    is interrupted.
  * Mke2fs will check both the physical and logical blocksizes of a
    device to better support 4k sector drives.
  * Mke2fs will accept the valid (but rarely useful) flex_bg size of 1
  * E2fsck will check for cases where the EOFBLOCKS_FL is set whe nit is
    not needed, and offer to clear it.
  * The com_err library will now only output a CR character if the
    stderr is connected to a tty in raw mode.
  * Update Czech, Chinese, Dutch, French, Germany, Indonesian, Polish,
    and Vietnamese translations (from the Translation Project)
  * Add an fsck.ext4 symlink in the e2fsprogs-udeb package (Closes: #571247)
  * Fix makefile dependency so dpkg-buildpackage -j2 works (Closes: #563487)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Mon, 17 May 2010 19:43:52 -0400

e2fsprogs (1.41.11-1) unstable; urgency=medium

  * New upstream release
  * Add Heimdal function com_right_r() to libcom_err (Closes: #558910)
  * Allow e2fsck to run even if the physical device has more than 2**32 blocks
  * Debugfs's "logdump -b <blk>" now properly shows the allocation status
    of the block <blk>.  (Closes: #564084)
  * Make e2fsck's "the filesystem is mounted" message is now more scary
    to hopefully dissuade users from thinking, "surely that message
    doesn't apply to *me*"  :-(
  * e2fsck -n will now always open the file system read-only.   We now
    disallow certain combination of options which previously were manual
    exceptions; this is bad because it causes users to think they are
    smarter than they really are.   So "-n -c", "-n -l", "-n -L", and
    "-n -D" are no longer supported.
  * If the partition is badly aligned, have mke2fs just print a warning
    message and continue.  Previously mke2fs would ask to confirm, and
    this broke distro installation scripts.
  * Fix a bug in libext2fs caused the creation of very large journals
    for ext4 to be _very_ slow.
  * E2fsck now understands the EOFBLOCKS_FL flag which will be used in
    2.6.34 kernels to make e2fsck not complain about blocks deliberately
    fallocated() beyond an inode's i_size.
  * Fix a bug in e2fsck which could cause e2fsck -D to corrupt
    non-indexed directories.  (Closes: #572453)
  * debian/rules: can be compiled statically with stack protector now.
    (Closes: #573923)
  * Update debian policy compliance to 3.8.4

 -- Theodore Y. Ts'o <tytso@mit.edu>  Mon, 15 Mar 2010 00:16:35 -0400

e2fsprogs (1.41.10-1) unstable; urgency=low

  * New upstream release
  * Fix resize2fs bug which causes it to access invalid memory
  * Add libss support for libreadline.so.6
  * Fix e2fsck's check for extent-mapped directory with an incorrect file type
  * Add new e2fsck.conf configuration option:
    default/broken_system_clock for system with broken CMOS hardware
    clocks.  (Closes: #559776)
  * Fix flex_bg inode table placement algorithm used by mke2fs for
    certain specific file system sizes
  * Add source lintian overrids for weak-library-dev-dependency
  * Fix FTBFS problem caused by texi2html changing (again) its output
    location.  (Closes: #552934)
  * Make e2fsck to avoid rehashing directories which can fit in a
    single directory block.
  * Fix how e2fsck fixes sparse directories which are extent-mapped.
  * Fix some big-endian bugs in e2fsck and libext2fs
  * Teach e2fsck to detect and fix sparse extent-mapped directories
  * Fix filefrag from core dumping on file systems with 8k block sizes
  * E2fsck was depending on i_size to be correct to detect and fix
    certain directory problems before actually fixing the
    directory's i_size.  This caused certain rare corruptions to
    require two runs of e2fsck to address.
  * Update Czech, Indonesian, Polish and Vietnamese translations
    (from the Translation Project)
  * Fix e2fsck to find and correct duplicate directory entries in
    non-indexed directories.
  * Add support for calling BLKDISCARD to mke2fs.
  * Enhance libext2fs so it works around bug in Linux version 2.6.19
    and earlier where the /proc/swaps file was missing the header on
    the first line.
  * Fix resize2fs so it works correctly on file systems with external journals
  * Fix libss so that it does not seg fault when using a readline
    library which does not supply a readline_shutdown() function.
  * Add a pre-depends for util-linux-ng (Closes: #551795)
  * Update and clarify various man pages.
  * Corrected dumpe2fs's usage message
  * Teach libext2fs to ignore the high 32 bits of the i_blocks field
    when huge_file file system feature is set, but the inode does not
    have the HUGE_FILE_FL flag set.
  * Change e2fsck to accept superblock times to be fudged by up to 24
    hours by default.  Most distributions have fixed their init scripts,
    but apparently now they have buggy virtualization scripts.  :-(  I
    give up, too many buggy user space set ups out there.  (Closes: #557636)
  * Fix e2fsck to correctly print > 32-bit i_blocks numbers in problem reports
  * Improve e2fsck so it prints "Illegal indirect block" instead of
    "Illegal block #-1"
  * Teach mke2fs to get device topology information from blkid and use
    it to populate the superblock stride and stripe sizes and warn if
    the block device is misaligned
  * Fix a file descriptor leak in debugfs when sourcing a command file
  * Fix a file descriptor leak in fsck
  * Round up the bitmap size to prevent spurious segmentation faults on
    BSD platforms.
  * Fix resize2fs to correctly calculate the minimum size needed, when
    flex_bg is enabled, to prevent resize2fs -M from failing.
  * Dumpe2fs now displays more information about the contents of the journal
  * Make sure the libblkid1 and libblkid1-dbg packags have changelogs
  * On low memory systems, e2fsck can print some very scary looking
    error messages.  Clean up them up to avoid user panic.  (Closes: #509529)
  * Enhance blkid to support .ko.gz files in the modules.dep parser
  * Fix tune2fs -j for mounted exted-enabled file systems
  * Use the feature name "extent" instead of "extents" in mke2fs.conf.
    Both work, but the latter is what is documented in the man page.
    (Closes: #540111)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun, 07 Feb 2010 20:56:47 -0500

e2fsprogs (1.41.9-1) unstable; urgency=low

  * New upstream release
  * Fix tune2fs -I to work correctly in the face of bad blocks and
    filesystems formatted for RAID arrays, and ENOSPC errors
  * Require the user to only answer one question instead of multiple
    ones for multiple bad block group checksums, or when an inode
    table needs to be moved.
  * Fix e2fsck to handle moving inode tables in FLEX_BG filesystems more
    gracefully by looking in the entire flex_bg for space, instead of
    just in the block group; if that doesn't work, try looking for
    space in the entire filesystem.
  * Fix the filefrag code to avoid printing the extent header if it
    needs to fallback to using the FIBMAP ioctl.
  * Fix filefrag to print the correct number of extents for zero-length
    files when using FIBMAP.  (Closes: #540376)
  * Add a filefrag -B option to make it easier to debug the FIBMAP
    support.
  * Allow e2fsprogs programs to allocate from uninitalized block groups.
  * Add a new program, e2freefrag, which displays information about the
    free space fragmentation in an ext2/3/4 filesystem.
  * E2fsck will now print much fuller information when the last mount
    time or last written time is in the future, since most people can't
    seem to believe their distribution has buggy init scripts, or they
    have a failed CMOS/RTS clock battery.
  * Update French, Polish, Czech, and Sweedish translation from the
    Translation Project.
  * Enhance debugfs's 'stat' command to print basic extent information
    for extent-mapped inodes, and add a new command, 'dump_extents'
    which prints detailed information about an inode's extent tree.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun, 23 Aug 2009 10:08:52 -0400

e2fsprogs (1.41.8-2) unstable; urgency=low

  * Fix regression in ext2fs_extent_set_bmap() which caused e2fsck -fD
    to fail on ext4 filesystems if the directory needs to shrink by more
    than a block (Closes: #537510)
  * Fixed filefrag for non-extent based files
  * Fix use of apostrohe's in package descriptions
  * Don't use dietlibc when building for mips and mipsel architectures

 -- Theodore Y. Ts'o <tytso@mit.edu>  Mon, 20 Jul 2009 09:38:21 -0400

e2fsprogs (1.41.8-1) unstable; urgency=low

  * New upstream release
  * Fix resize2fs bugs when shrinking ext4 filesystems
  * Update debian policy compliance to 3.8.2
  * Update package descriptions to mention ext3 and ext4 filesytems
      (Closes: #535530)
  * Update French, Polish, Czech, Indonesian, and Sweedish translation
      from the Translation Project.
  * If the resize2fs operation fails, the user will be told to fix up
    the filesystem using e2fsck -fy.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sat, 11 Jul 2009 17:26:16 -0400

e2fsprogs (1.41.7-2) unstable; urgency=low

  * Fix online resizing using resize2fs (Closes: #535452)
  * Fix the filefrag program for files with more than 144 extents
  * Update and clarify various man pages.
  * Fix potential filesystem corruptions caused by using resize2fs to
    shrink filesystems with extents enabled.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue, 07 Jul 2009 23:21:46 -0400

e2fsprogs (1.41.7-1) unstable; urgency=low

  * New upstream release
  * Fix memory leaks in e2fsprogs, including a very large memory leak
    which can cause e2fsck to run out of memory when checking very large
    filesystems using extents.
  * Fix a bug in libext2fs which can cause e2fsck and resize2fs to write
    uninitalized data into the portion of the inode beyond the first 128
    bytes when operating on extents; potentially corrupting filesystems.
  * The logsave program will now filter out the ^A and ^B characters when
    writing to the console.
  * Update/clarify man pages (Closes: #531385, #523063)
  * Fix filefrag progam so it correctly checks for errors from the
    fiemap ioctl.
  * Change badblocks to allow block sizes larger than 4k.
  * Fix libext2fs to properly initialize i_extra_size when creating the
    journal and resize inodes.
  * Resize2fs will now update the journal backup fileds in the
    superblock if the journal is moved; this avoids an unnecessary full
    fsck after resizing the filesystem.
  * Use the same encoding as the kernel for rec_len == 64k in 64k block
    filesystems.
  * Fix lsattr to exit with a non-zero status when it encounters errors.
  * Enhance badblocks to print the currently tested block number when
    interrupted with ^C.
  * Fix debugfs from core dumping if the logdump command fails to open the
    output file.
  * Harden ext2fs_validate_entry() so that lsdel will not read beyond the
    end of the block even if the directory block is corrupted.
  * Update Chinese and Czech translation from the Translation Project.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Mon, 29 Jun 2009 15:12:14 -0400

e2fsprogs (1.41.6-1) unstable; urgency=low

  * New upstream release
  * Update and clarify man pages
  * Fix a number of Lintian warnings, including to updating to debian
    policy 3.8.1
  * Update config.guess and config.sub to the latest (2009-04-17)
    version so that e2fsprogs will build on the avr32 platform
    (Closes: #528330)
  * Add an explicit error message if the /etc/mtab file is missing
    when running e2fsck or resize2fs (Closes: #527859)
  * Enhance e2fsck to handle the case where the primary block group
    descriptors need fixing, and the backup superblock is corrupt.
    (Closes: #516820)
  * Add an "-a" option to debugfs's close_filesys command
  * e2fsck will no longer abort a preen operation if an inode's
    i_file_acl_hi field is non-zero.  (Closes: #526524)
  * The chattr program can now migrate inodes from using direct/indirect
    blocks to extent trees.
  * Speed up e2fsck if there are multiple block groups with inodes in
    use in the unused portion of the block group's inode table.
  * Update Chinese translation from the translation project
  * Fix resize2fs so it won't corrupt ext4 filesystem when asked to
    shrink a filesystem smaller than the minimum suggested size.
  * Fix e2fsck regression which can corrupt ext4 filesystems when
    replaying the journal.
  * Add support to e2fsck for handling I/O errors while replaying the
    journal
  * Fix a bug in e2fsck which could cause it to crash if an inode has a
    corrupt extent header, and the user declines to clear the inode.
  * Fix blkid to prefer the /dev/mapper/<name> device names over the
    private /dev/dm-N device names.
  * Add support for the FIEMAP ioctl to the filefrag program
  * Further speed up e2fsck by skipping journal checks if the filesystem
    is mounted read-only and is marked as not needing journal replay.
  * Add a build depends in the control file indicating that dietlibc
    must be newer than version 0.30 (Closes: #506064)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Fri, 30 May 2009 13:26:23 -0400

e2fsprogs (1.41.5-1) unstable; urgency=low

  * New upstream release
  * E2fsck will now detect and fix inodes that have a non-zero
    i_file_acl_high field on 32-bit filesystems.
  * Update build-depends to indicate that dietlibc 0.30 doesn't work.
    (Closes: #506064)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Fri, 24 Apr 2009 08:52:47 -0400

e2fsprogs (1.41.4-3) unstable; urgency=low

  * Update/clarify man pages (Closes: #365619)
  * Fix a problem where the 'device names' for pseudo-filesystems in
    /proc/mounts could confuse the e2fsprogs into thinking that a
    filesystem image stored in a regular file was mounted when it was not
  * Remove whole-disk entries from the blkid cache when partitions are found
  * Reduce the number of disk reads needed when the filesystem is clean
  * Add Chinese (simplified) translation from the Translation Project

 -- Theodore Y. Ts'o <tytso@mit.edu>  Thu, 23 Apr 2009 01:35:22 -0400

e2fsprogs (1.41.4-2) unstable; urgency=low

  * Update the debian copyright files to point at the version-specific
    GPL and LGPL files.
  * Update the debhelper compat level to 7
  * Fix a number of filesystem corruption bugs in resize2fs when growing
    or shrinking ext4 filesystems off-line (i.e., when the ext4
    filesystem is not mounted).
  * Clarify tune2fs man page  (Closes: #515693)
  * Add homepage field to the debian control file (Closes: #506279)
  * Fix Hurd compilation problem (Closes: #521602)
  * Debugfs can now set i_file_acl_high via the set_inodes_field command
  * Debugfs will now display a 64-bit file acl block
  * Fix various gcc compilation warnings and other programming cleanups
  * Make sure libuuid closes all file descriptors before starting the
    uuidd daemon.
  * Avoid running e2fsck unnecessarily after doing an online resize
  * Mke2fs -S will now avoid trying to create the journal
  * Update the Czech translation from the translation project.
  * Fix support for external journals (which was broken in e2fsprogs 1.41.4)
  * Fix a compatibility issue with libext2fs info page and makeinfo 4.12
  * Fix a segfault in debugfs when running stat without an open filesystem
  * Teach the blkid library that starting in 2.6.29, ext4 can support
    filesystems without journals.
  * Add error check preventing the reserved_ratio argument to mke2fs and
    tune2fs from being negative.  (Closes: #517015)
  * Add support for tracking the number kilobytes written to the
    filesystem via the superblock field s_kbytes_written

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun, 19 Apr 2009 23:05:53 -0400

e2fsprogs (1.41.4-1) unstable; urgency=low

  * New upstream release
  * Fix bug which could sometimes cause blkid to return an exit value of
    zero for a non-existent device (Closes: #502541)
  * Fix spelling mistake in Debian changelog (Closes: #502323)
  * Fix blkid to deal with an ext3 filesystem with the test_fs flag
  * Fix debugfs's ncheck output to suppress extra characters at the end
    of the file name
  * Tune2fs now updates the block group checksums after changing the
    filesystem's UUID
  * Speed up tune2fs's inode resizing code so it is no longer vastly
    inefficient for moderate to large filesystems
  * Fix dumpe2fs so it doesn't attempt to print the inline journal
    information on filesystems with an external journal
  * Update the Catalan translation
  * Filter out linux-vdso.so lines when determining the library
    dependencies while building the initial ramdisk (Closes: #503057)
  * Fix e2fsck so an errant INODE_UNINIT flag set in a block group
    doesn't cause e2fsck to abort.
  * E2fsck now distinguishes between fragmented directories and
    fragmented files in verbose mode statistics and in the fragcheck
    report.
  * Avoid double-counting non-contiguous extent-based inodes in the
    verbose mode statistics.
  * E2fsck now leaves slack space when repacking directories so that a
    few new directory entries won't cause leaf nodes to become split
    right away.
  * E2fsck was previously not handling the case of a corrupted interior
    node in the extent tree, and would crash in that case.  It now will
    handle this and related failures robustly.
  * E2fsck problem descriptions involving the journal are no longer
    referred to as "ext3" problems, since ext4 filesystems also have
    journals.
  * Fix a long-standing bug in e2fsck which would cause it to crash when
    replying journals for filesystems with block sizes greater than 8k.
  * Fix a regression in debugfs's logdump command so it works for
    filesystems with 32-bit block numbers.  This was accidentally broken
    when the header files were changed to support the 64-bit block numbers.
  * Fix resize2fs for ext4 filesystems.  Some blocks that that need moving
    when shrinking filesystems with uninit_bg feature would not be
    moved.  In addition, blocks and inode table blocks were not being
    correctly freed when shrinking filesystems with the flex_bg feable,
    which caused resize2fs -M to fail.  Finally, when blocks are moved,
    make sure the uninitialized flag in extents is preserved.
  * Add mkfs.ext4 symlink to the e2fsprogs-udeb package (Closes: #511207)
  * Resize2fs now reserves some extra block when calculating the minimum
    size to shrink the filesystem in case some extent allocation trees
  * Add a "set -e" to uuid-runtime's prerm script to make Lintian happy
  * The blkid library will now recognize btrfs filesystems and swap
    devices currently used by user-level software suspend.
  * tune2fs will not allow changing the inode size for filesystems that
    have the flex_bg feature enabled, since the code currently assumes
    the each block group's portion inode table is located in its own
    block group.
  * Fix tune2fs -I so it won't corrupt ext3/ext4 filesystem configured
    for RAID storage devices.
  * Mke2fs now understands a -U option which allows the UUID to be
    specified for the new filesystem.
  * Mke2fs will now treat devices with exactly 16TB as if they have 16TB
    minus one block, since many users expect ext4 to support 16TB
    devices, and the true maximum size is 16TB-1.
  * E2fsck will now flag filesystems that have an insane s_first_ino
    field in their superblock.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue, 27 Jan 2009 11:50:49 -0500

e2fsprogs (1.41.3-1) unstable; urgency=low

  * New upstream release
  * Fix e2fsck so it prints the correct inode number for uinit_bg
    related problems.
  * E2fsck will offer to clear the test_fs flag if the ext4 filesystem
    is available.
  * Fix a file descriptor leak in libblkid
  * Avoid a potential infinite loop in e2fsck when there are disk I/O
    errors while trying to close a filesystem.
  * Fix a potential infinite loop in resize2fs when a bogus new size of
    0 blocks is specified on the command line.
  * Add an early check to see if a device is read-only to avoid lots of
    confusing error messages.
  * Fix debugfs's ncheck command so it prints all of the names of
    hardlinks in the same directories.
  * Fix a bug in libblkid so it correctly detects whether the ext4 and
    ext4dev filesystems are available, so that the ext4dev->ext4
    fallback code works correctly.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun, 12 Oct 2008 22:45:34 -0400

e2fsprogs (1.41.2-1) unstable; urgency=low

  * New upstream release
  * Fix e2fsck's automatic blocksize detection.  This fixes a regression
      added in e2fsprogs 1.40.7 where e2fsck's -b option would not
      work if a blocksize wasn't also specified via the -B option.
  * Fix a potential file descriptor leak in libcom_err if the
      application exec's another program.
  * Fixed badblocks output for "badblocks -sw"
  * debugfs: Fix ncheck to print all pathnames for all of the specified inodes
  * Use dietlibc when possible for building e2fsck.static, to reduce the
      size of the static binary.
  * debugfs: Add the ability to specify the hash seed and to specify the
      hash algorithm by name to the "hash" command.
  * Add documentation for the file I/O functions to libext2fs.texinfo.
      (Closes: #484877)
  * Fix a bug in e2fsck where if a translation file is being used and
      e2fsck needs to print problem report with a custom question (such as
      "Run journal anyway?"), the PO file's header would get spewed onto
      the terminal.
  * Update Swedish, Vietnamese, Dutch, Indonesian, German, Czech translations
  * Fixed spelling mistakes in man pages  (Closes: #498100, #498101,
      #498102, #498103)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Thu, 02 Oct 2008 08:54:16 -0400

e2fsprogs (1.41.1-3) unstable; urgency=low

  * badblocks -v will now display the time and percentage complete
      (Closes: #429739)
  * Reordered debian/rules when building udebs to avoid a Lintian warning
  * Fixed dependencies fields in the udeb packages (Closes: #497619)
  * Avoid linking various programs with unneeded libraries
  * Fixed a typo'ed bold font specifier in mke2fs's man page
  * Fixed the pkg-config files so the include directory needed by the
      various libraries is included, and to use Requires.private to
      avoid unnecessary linking of dynamic libraries.
  * Add more historical information to the debian/*.symbol files

 -- Theodore Y. Ts'o <tytso@mit.edu>  Fri, 05 Sep 2008 11:11:03 -0400

e2fsprogs (1.41.1-2) unstable; urgency=low

  * Make sure ext4_swab64() is defined on all platforms (Closes: #497515)
  * Badlocks: Use O_LARGEFILE so it will run on files greater than 2GB

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue, 02 Sep 2008 09:53:46 -0400

e2fsprogs (1.41.1-1) unstable; urgency=low

  * New upstream release
  * mke2fs and tune2fs now use half-md4 as the default hash algorithm
       In addition the default hash algorithm can be via mke2fs.conf for
       mke2fs, and via a command-line option for tune2fs.
  * Add support for on-line resizing of ext4 filesystems with the
       flex_bg filesystem feature.
  * e2fsck now creates the journal in the middle of the filesystem,
       which can speed up fsync-heavy workloads.
  * Make the blkid library more efficient for devicemapper devices,
       mostly by no longer using the libdevmapper library.
  * Fix various namespace leakages by the libblkid, libe2p and libext2fs
       libraries.
  * Fix support for empty directories in 64k blocksize filesystems.
  * Add supported_features command to debugfs
  * Improve libblkid detection of JFS and HPFS filesystems
  * The test I/O manager is now compiled in by default, but to avoid its
    overhead, it is only enabled when the TEST_IO_FLAGS or TEST_IO_BLOCK
    environment variables are set.
  * Fix filefrag's ideal extent calculation (Closes: #458306)
  * Fix postinstall scripts when the user/group is in LDAP (Closes: #497010)
  * Add Indonesian and update French, Polish, Dutch, German, Sweedish,
       Czech, and Vietnamese Translations.  (Closes: #313697, #401092)
  * Update/clarified man pages
  * Add dpkg-gensymbols support to track ABI changes to the libraries
  * Add lintian overrides for uuid-runtime and libuuid1
  * Remove (no longer needed) lintian overrides for e2fsck-static
  * Add debian/watch file

 -- Theodore Y. Ts'o <tytso@mit.edu>  Mon, 01 Sep 2008 11:30:21 -0400

e2fsprogs (1.41.0-4) unstable; urgency=low

  * mke2fs will issue a warning if mke2fs.conf hasn't been updated and
    the user tries to create an ext3, ext4, or ext4dev filesystem,
    since it depends on the mke2fs.conf file in order to create the
    filesystem properly with the appropriate features.
  * Fix the maximum journal size message in mke2fs and tune2fs to be
    consistent/correct.  (Closes: #491620)
  * Add detection for hfsx filesystem and add label and uuid detection
    for hfs, hfsplus, and hfsx filesystems in libblkid.
  * Fix cosmetic issue in resize2fs when a progress bar doesn't finish
    with a newline for pass 4 (when the inode references are updated).
  * Teach resize2fs to move blocks when extents are present (when
    shrinking a filesystem and/or if resize_inode is not present).
  * Teach resize2fs to work correctly with the uninit_bg when blocks
    need to be moved or allocated.
  * Fix and optimize extent manipulation in libext2fs for resize2fs.
  * Fix "dumpe2fs -i" and "debugfs -i".  (Closes: #495830)
  * Fix resize2fs incorrectly managing directory in-use counts when
    shrinking filesystems and directory inodes need to be moved.
  * Fix spurious e2fsck complaints with i_size with extents and large
    files and preallocated blocks.
  * Make sure the creation timestamp is set by mke2fs and by new inodes
    created by the libext2fs in general.
  * Fix ind/dind/tind statistics when extents are present, and add
    extent tree depth statistics.
  * Add a fragmentation report extended option to e2fsck.
  * Fix blkid cache validation and some possible blkid crashes
    (Closes: #493216)
  * Teach debugfs's htree command to work with extent-based directories.
  * Improve the error message for "tune2fs -I".
  * Fix miscellaneous strings and usage messages pointed out by the
    translators.  (Thanks, translators!)
  * Enforce that mke2fs won't allow features for revision 0 filesystems.
  * Optimize inode table allocation in mke2fs for flex_bg filesystems.
  * Update/clarified man pages
  * Fix minor typo in uuid-runtime's debian package description
  * Wrap debian/copyright files to avoid "line too long" lintian warnings

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sat, 23 Aug 2008 08:56:47 -0400

e2fsprogs (1.41.0-3) unstable; urgency=medium

  * Fix mips-specific FTBFS problem in debian/rules file
  * Synchronize section and priority levels in control file with the
    FTP masters' override file.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue, 15 Jul 2008 11:38:59 -0400

e2fsprogs (1.41.0-2) unstable; urgency=medium

  * Don't try to check the group descriptor checksum if the GDT_CSUM
    feature is not present.  (Closes: #490637)
  * Add a new blkid -L option which pretty-prints the currently
    available block devices.  (Closes: #490527)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun, 13 Jul 2008 19:18:08 -0400

e2fsprogs (1.41.0-1) unstable; urgency=medium

  * New upstream version
  * Make e2fsck detect corrupted block group descriptors that would
    cause it to relocate inode tables, causing more damage to the
    filesystem, and make it try the backup superblock/block group
    descriptors first.
  * Fix resize2fs to clean up the resize_inode if all of the reserved
    gdt blocks are consumed during an off-line resize.
  * Enable huge_file, dir_nlink, extra_isize feautres for mke2fs and tune2fs.
  * Enable huge_file, dir_nlink, extra_isize, and uninit_bg by default
    in mke2fs.conf.
  * Fix badblocks terminology in man page and program output.
    (Closes: #440983, #440981)
  * Clarify stripe-width and stride-size in mke2fs man page.  (Closes: #487849)
  * mke2fs: Dumb down filesystems for GNU Hurd (Closes: #471977)
  * Add bash-static to the list of shells recommended for e2fsck-static
    (Closes: #490003)
  * mke2fs: Fix flex_bg metadata default layout to avoid a hole between
    the bitmaps and inode tables.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Thu, 10 Jul 2008 17:25:32 -0400

e2fsprogs (1.41~WIP-2008-07-07-1) experimental; urgency=low

  * New upstream version (pre-release for e2sprogs 1.41)
  * Update to indicate compliance with debian policy version 3.8.0.0.
  * Fix e2fsck to not truncate valid extent files that are larger than
    what is supported by indirect files.
  * Add -dbg packages which contain the debugging information.
  * mke2fs: Print a better error message when a device is too big.
    (Closes: #488663)
  * Create external journal devices with a default blocksize of 4k
  * Fix bug in badblocks which caused crash when lots of -t patterns are
    given.  (Closes: #487298)
  * Fix blkid handling of stale entries.  (Closes: #487758, #487783)
  * Update Vietnamese, Polish, French, Spanish, German, Catalan,
    Dutch, Czech translations from the translation project.
  * Fix FTBFS problem on MIPS (Closes: #487675)
  * Fix bug in libuuid1.postinst which would cause it to blow up if
    there were spaces around the equals sign in /etc/adduser.conf.
    (Closes: #487443)
  * Update/clarified man pages.  (Closes: #393313)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Mon, 07 Jul 2008 16:30:43 -0400

e2fsprogs (1.41~WIP-2008-06-17-1) experimental; urgency=low

  * New upstream version (pre-release for e2fsprogs 1.41)
  * New options to badblocks allow it to limit how quickly it reads
    from disk (for background scrubbing) and abort after a finding
    giving a number of errors.
  * Add support for ext4 filesystem features.  (Closes: #388452, #425477)
  * Tune2fs can migrate a filesystem from using 128 byte inodes to
    larger inode sizes so the user can take full advantage of ext4)
  * E2fsck and mke2fs can optionally record an undo log which can be
    replayed by the e2undo program.
  * E2fsck will display a less cryptic message when the last check field
    in the superblock is in the future.  (Closes: #446005)
  * Improve blkid probes for LVM volumes and swap partitions
  * Mke2fs has a much more sophisticated system for controlling the
    parameters of newly created filesystems.  The -t option now is used
    to specify the filesystem type.  See the mke2fs and mke2fs.conf man
    pages for more details.
  * Resize2fs will now print the minimum needed filesystem size if given
    the -P option, and will resize the filesystem to the smallest possible
    size if given the -M option.
  * E2fsck now performs more extensive and careful checks of extended
    attributes stored in the inode.
  * Mke2fs will always make sure that lost+found always has at least 2
    blocks, even for filesystems with very large blocksizes (i.e., 64kb).
  * The debugfs "ls" command now supports the -p option, which causes
    filenames to be printed surrounded by double quotes.
  * Fix a potential off-by-one buffer overflow in e2image
  * The chattr program will now return a non-zero exit code in case of
    failures.
  * This version of e2fsprogs removes support for legacy big-endian
    filesystems and for MASIX filesystems.
  * Add I/O statistics reporting to e2fsck.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue, 17 Jun 2008 23:57:08 -0400

e2fsprogs (1.40.11-1) unstable; urgency=low

  * Change mke2fs, tune2fs and resize2fs to use floating point precision
    when calculating the number of reserved blocks.  (Closes: #452639)
  * Update Spanish and Catalan translations.
  * Fix ext2fs_swap{16,32,64} for external applications.  (Closes: #484879)
  * Improve uuid-runtime package description.  (Closes: #483962)
  * Improve e2fsprogs package description.  (Closes: #483023)
  * Add support for detecting ZFS volumes to libblkid.
  * Clarify debugfs man page.  (Closes: #486463)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue, 17 Jun 2008 21:59:21 -0400

e2fsprogs (1.40.10-1) unstable; urgency=low

  * Fix a very rare potential data corruption bug in e2fsck's journal
    replay.
  * Updated German, Dutch, Sweedish, and Vietnamese translations.
  * Force blkid to revalidate a device if its mtime is newer than the
    last validation time in the cache.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Wed, 21 May 2008 13:35:12 -0400

e2fsprogs (1.40.9-1) unstable; urgency=low

  * Fix fsck so that if multiple filesystems are being checked in
      parallel, the progress bar for subsequent filesystems will be
      correctly displayed.  (Closes: #432865)
  * Fix fsck -Cn for n!=0 for better Ubuntu boot-time support
  * debugfs: Don't bother using a pager of stdout is not a tty
  * Fix tune2fs and debugfs to correctly parse time strings during
      daylight savings time.  (Closes: #471882)
  * Teach fsck to treat ext4 and ext4 filesystems as ext* filesystems
  * Logsave will now propagate SIGINT and SIGTERM signals to its child
      process.
  * Mke2fs will not allow the illogical combination of the resize_inode
      and meta_bg filesystem features.
  * Use UID/GID ranges from adduser.conf if present, even though we
      don't use adduser to add users/groups.  (Closes: #473179)
  * Updated German, Czech, Dutch, French, Polish, Sweedish, and
      Vietnamese translations.
  * Update/clarified the mke2fs man page

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun, 27 Apr 2008 00:35:20 -0400

e2fsprogs (1.40.8-2) unstable; urgency=low

  * One more big-endian swap fix needed for resize2fs to work correctly
      with in-inode extended attributes.
  * Fix minor security issues identified in uuidd.
  * Remove e2fsprogs preinstall script which contained stuff not needed
      in well over two stable releases.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Fri, 14 Mar 2008 14:25:54 -0400

e2fsprogs (1.40.8-1) unstable; urgency=low

  * Fix e2image -I so it works on image files which are larger than 2GB.
  * Fix e2fsck's handling of directory inodes with a corrupt size field.
  * Fully fix a resize2fs bug where extended attributes in large inodes
      could get dropped on big-endian systems.
  * Update Czech, Dutch, Polish, Sweedish, and Vietnamese translations.
  * Significantly updated German translation!  Thanks to Philipp Thomas
    from Novell for stepping up to be our new German translation
    maintainer!  (Closes: #302512, #370247, #401092, #412882)
  * Fixed mke2fs man page to document new default inode size.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Thu, 13 Mar 2008 20:00:09 -0400

e2fsprogs (1.40.7-1) unstable; urgency=low

  * New upstream release
  * tune2fs no longer will remove the sparse_super feature, as it is dangerous
  * Update/clarified various man pages
  * Fix bug where large nodes were not getting fully copied when
      shrinking a fileystem using resize2fs.
  * Allow mke2fs and tune2fs to manipulate the large_file feature flag
  * Suppress fsck's warning message about an old-style fstab if the
      fstab file is empty.  (Closes: #468176)
  * E2fsck will no longer clear the large_files feature flag
      automatically when there are no more large files in the system.
  * Fix blkid code to avoid segfaulting when a device mapper volume
      disappears out from under it.
  * Enhance e2fsck's reporting of unsupported filesystem features
  * Fix dumpe2fs command syntax for explicit superblock/blocksize parameters
  * Teach tune2fs to clear the resize_inode feature flag
  * Fix libuuid1 postinstall script to explicitly pass 100 to UID_MIN
      and GID_MIN, to make it clear we are not trying to allocate an
      uid/gid in the globally reserved range.  (Closes: #466929)
  * Fix memory leak in ext2fs_alloc_block()
  * Teach blkid to recognize LVM2 physical volumes
  * Add support to dumpe2fs, mke2fs, and tune2fs for specifying and
      printing the RAID stride and stripe width.
  * Add support for new superblock fields to debugfs's set_super_value command
  * Teach debugfs to print "mostly-printable" xattr strings, such as is
      used by SELinux.
  * Add support in fsck to ignore mounted filesystems when given the -M option
  * Fix uuidd so it creates the pid file with the correct pid number
  * Update Czech, Dutch, Polish, Sweedish, and Vietnamese translations
      from the Translation Project.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Thu, 28 Feb 2008 22:27:39 -0500

e2fsprogs (1.40.6-1) unstable; urgency=low

  * New upstream release
  * Add support for returning labels for UDF filesystems in the blkid
      library.
  * Fix bug in the blkid library where cached filesystems was not being
      flushed when opening USB devices returned the error ENOMEDIUM.
      (Closes: #463787)
  * Add logic to the blkid library to automatically choose whether a
      filesystem should be mounted as ext4 or ext4dev, as appropriate.
  * Allow tune2fs to set and clear the test_fs flag on ext4 filesystems.
  * Document the BLKID_FILE environment variable in the libblkid man page
  * Update Vietnamese and Czech translations from the translation project
  * Fix dependency problem caused by dpkg 1.14.16 (Closes: #436058)
  * Use thread local storage to fix a theoretical race condition if two
      threads try to format an unknown error code at the same time in
      the com_err library.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun, 10 Feb 2008 00:06:02 -0500

e2fsprogs (1.40.5-2) unstable; urgency=low

  * Fix debian/control and debian/rules so that they work correctly
    after a change in dpkg-gencontrol's behavior after version 1.14.16
    of dpkg.  This fixes bad version dependencies for comerr-dev,
    uuid-dev and ss-dev. Thanks to Don Armstrong for the explanation and
    Margarity Manterola for a proposed patch. (Closes: #463058)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Wed, 30 Jan 2008 07:17:27 -0500

e2fsprogs (1.40.5-1) unstable; urgency=low

  * New upstream release.
  * Mke2fs will now create new filesystems with 256 byte inodes and the
      ext_attr feature flag by default.  This allows for much better
      future compatibity with ext4 and speeds up extended attributes
      even on ext3 filesystems.
  * Teach mke2fs and tune2fs to set a "test_fs" flag, which indicates
      that it is ok to use the filesystem on in-development kernel
      code (i.e., ext4dev)
  * E2fsck now optimizes non-htree directories by sorting them by inode
      number.
  * Add support for detecting HFS+ and ext4/ext4dev filesystems in blkid
  * Fix blkid's ntfs UUID handling so it is compatible with vol_id
  * Avoid a floating point exception when blkid tries to probe a corrpt
      reiserfs filesystem.
  * Fix potential overflow problem in e2image if the device name is
      too long.
  * Cause e2image to exit immediately with an error message on a disk
      full situation.
  * Fix a minor typos in the resize2fs and uuidd manpages.
  * E2fsck will no longer backup superblocks when the kernel makes
      certain "safe" feature set changes behind the user's back.
  * Fix debugfs's lsdel command so it works on large files
  * Allow a user to undelete an inode with linking to a destination
      directory.
  * Update Swedish translation file from the Translation Project
  * The libuuid1 and uuid-runtime packages requires passwd package, so
      declare it as a dependency.  (Closes: #459403)
  * Fix a FTBFS problem on x86_64 caused by the fact that dietlibc
      doesn't provide llseek on the x86_64.  (Closes: #459614)
  * Don't use dietlibc on platforms that don't support it (Closes: #459475)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun, 27 Jan 2008 16:57:34 -0500

e2fsprogs (1.40.4-1) unstable; urgency=low

  * Make sure that programs like tune2fs, when modifying a mounted
      filesystem do not write the backup superblocks with the
      NEEDS_RECOVERY flag, to avoid e2fsck from needlessly forcing a
      full fsck because it thinks the feature flags need to be backed up
      from the master to the backup superblocks.  (Closes: #454926)
  * Improve time-based UUID generation to guarantee uniqueness even when
      UUID's are being generated at very high rates on SMP systems.  To
      do this we use an optional setuid helper daemon (uuidd) which is
      started by libuuid when it is needed.  The uuidd daemon is
      packaged in the (new) uuid-runtime package, which now also includes
      the uuidgen program (which had been previously been included as
      part of the e2fsprogs package).
  * Fix fsck to only treat '#' characters at the beginning of /etc/fstab
      lines as starting a comment.  This avoids spurious warnings printed
      for filesystems such as fuse that often use '#' as part of the
      filesystem specifier (i.e., wdfs#https://dav.hoster.com/foo).
  * Enhance the blkid program to pretty-print control and meta
      characters to avoid garbage filesystem labels from screwing up the
      user's terminal
  * Fix potential integer overflows passed to malloc() in resize2fs
  * Update Dutch, Polish, and Vietnamese translations from the
      Translation Project.  Remove the Rwandan translation upon advice
      of the Translation Project.
  * Fix cross-compilation support for non-Linux architectures
        (Closes: #451172, #437720)
  * Clarified and improved man pages (Closes: #444883, #441872)
  * Fix potential divide by zero error when libblkid tried probing an
      invalid FAT filesystem.
  * Make error_message() in libcom_err DTRT when when a 64-bit sign-extended
      error code is passed to it.
  * Build the e2fsck-static package so that e2fsck.static will not use
      TLS and hence will run correctly on back-level Debian systems
      using a 2.4 Linux kernel.  (Closes: #458017)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Mon, 31 Dec 2007 22:40:42 -0500

e2fsprogs (1.40.3-1) unstable; urgency=medium

  * New upstream release
  * libext2fs: Add checks to prevent integer overflows passed to
      malloc().  Fixes security issue related to Xen's pygrub: CVE-2007-5497
  * libss: Fix parallel build failure
  * e2fsprogs: fix blkid whole-disk scanning heuristics
  * libext2fs: Fix a corner case bug in ext2fs_unlink
  * fix check_mntent_file() to pass mode for open(O_CREAT)
  * Fix errors in test_ss.c so it can be an example application and test case
  * e2image in raw-mode appends an extra byte to image-file
  * Fix typo in the summary section of the blkid man page
  * mke2fs: Change usage message to use -E instead -R, which is deprecated
  * libblkid: recognize squashfs filesystems on BE systems.
  * libblkid: detect squashfs
  * e2fsck: backup superblocks if key constants have changed
  * e2fsck: update the backup superblocks if the feature bitmasks are changed
  * ext2fs_dblist_dir_iterate: Fix ABORT propagation logic
  * libblkid: Add more magic numbers that might mean there is a FAT filesystem
  * e2fsck: Don't mark the filesystem invalid because of time errors
  * Work around lame Ubuntu init scripts / installer bugs
  * fsck: Ignore /etc/fstab entries for bind mounts
  * e2fsck: If the superblock is corrupt, automatically retry with the backup sb
  * Don't crash if s_inode_size is zero
  * Use sscanf instead of atoi when parsing e2fsck options
  * Add Catalan translation and update Spanish, French, and Dutch
      translations from the Translation Project.  (Closes: #411562)
  * Fix typo and clarify the uuidgen man page
  * Make sure $prefix/etc is created before installing mke2fs.conf
  * e2fsck: Allow i_size to be rounded up to the size of a VM page
  * Fix a bug in ext2fs_initialize() which causes mke2fs to fail while
       allocating inode tables for some relatively rare odd disk sizes.
  * Fix big-endian byte-swapping bug in ext2fs_swap_inode_full()

 -- Theodore Y. Ts'o <tytso@mit.edu>  Wed, 05 Dec 2007 20:04:28 -0500

e2fsprogs (1.40.2-1) unstable; urgency=low

  * New upstream release
  * e2fsck: Fix salvage_directory when the last entry's rec_len is too big
  * Update Turkish, Polish, Dutch, and Vietnamese PO files from the
      Translation Project
  * Fix a bug which would cause e2fsck segfault on very badly damaged
      filesystems
  * Update tune2fs man page to include more discussion of reserved
      blocks (Addresses Ubuntu Launchpad bug #47817)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Thu, 12 Jul 2007 22:18:51 -0400

e2fsprogs (1.40.1-1) unstable; urgency=low

  * New upstream release
  * Clarify mk_cmds' error reporting
  * e2fsck: Detect recursive loops in @-expansions
  * Compile the default mke2fs.conf into mke2fs program
  * Fix bogus strip permission errors when building under Debian
  * Update Vietnamese, French, and Dutch PO files from the Translation Project
  * Fix bug which could cause libblkid to loop forever (Closes: #432052)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun,  8 Jul 2007 20:25:08 -0400

e2fsprogs (1.40-1) unstable; urgency=low

  * New upstream release
  * Remove RFC-4122 logic from Debian build rules (Closes: #407107)
  * Fix com_err.texinfo so that the install-info command will remove
      the com_err info file from the /usr/share/info/dir file when the
      comerr-dev package is removed and purged (Closes: #401711)
  * Fix divide-by-zero error in blkid's NTFS proving logic
  * Add new blkid -g option which causes the blkid cache to be garbage
      collected
  * libblkid: Fix bug which could cuase bid_type to be corrupted
  * mke2fs: Add santy check to make sure inode_size * num_inodes isn't too big
  * Fix additional Coverity bugs in mke2fs and e2fsck
  * Improve sanity check in e2fsck's algorithm for finding a backup superblock
  * Fix e2fsck get_size logic so that it will work with the Linux floppy
      driver (Closes: #410569)
  * Fix error checking of badblock's last-block and start-block arguments
      (Closes: #416477)
  * e2fsck: avoid writing overwriting the backup superblocks until the
      master superblock is confirmed to be sane
  * Make the blkid library more paranoid about concluding a partition
      contains a NTFS filesystem.  (Addresses Launchpad Bug: #110138)
  * Enhance e2fsck so it will recreate the ext3 journal if the original
      journal inode was cleared to due being corrupt
  * Fix e2fsck so that if the backup journal information is used, that
      this is written out to the journal inode
  * Make e2fsck check all of the blocks in the journal inode for validity
  * blkid: Add support for detecting LUKS encrypted partitions
  * e2fsck: added sanity check for xattr validation
  * Fix byte-swapping bug for filesystems with large inodes
  * Clarify the copyright licenses used by the various libraries in COPYING
  * Remove RFC-4122 from upstream (Closes: #407107)
  * Fix info-dir line which prevented install-info from removing
      com_err entry from from /usr/share/info/dir when the comerr-dev
      package is purged (Closes: #401711)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun, 29 Jun 2007 22:40:27 -0400

e2fsprogs (1.39+1.40-WIP-2007.04.07+dfsg-2) unstable; urgency=low

  * Allow the journal to up to 10,240,000 blocks
  * Fix blkid library to recognize MD 0.90 superblock on little endian
      systems
  * Fix blkid library to report the correct UUID from MD superblocks
  * Fix signed vs. unsigned problem in debugfs' setb/testb/freeb commands
  * Enhance debugfs's date parser so it acccepts integer values
  * Fix e2fsck's pass1c accounting so it doesn't terminate too early
      if a file with multiply claimed blocks is hard linked. or not at
      all if the root directory contains shared blocks
  * Enhance debugfs so it can modify the block group descriptors using
      the command set_block_group_descriptor
  * Improve e2fsck's reporting of I/O errors so it's clearer what it
      was trying to do when an error happens
  * Fix a bug in how e2fsprogs byte swaps inodes containing fast
      symlinks that have extended attributes.
  * Fix potential file descriptor leak in ext2fs_get_device_size()
  * Fix minor typo in e2fsck.conf.5 man page
  * Cleanup udeb dependency (Closes: #419605)
  * Rebuilding with libdevmapper 1.02.1 (Closes: #421022 and #421668)
  * Add dependency on comerr-dev to ss-dev (Closes: #408352)
  * Make mke2fs use sane defaults when /etc/mke2fs.conf doesn't exist
  * Fix mke2fs and debugfs to support large (> 16 bit) uid's and gid's
  * Fix spelling typo in debian package description for libblkid1
    (Closes: #399155)
  * Remove -WIP language from the debian copyright file.  (Closes: #415560)
  * Remove check in e2fsck which required EA's in inodes to be sorted
    (We should get this back-ported to the stable branch since
    filesystems with large inodes will have EA's erroneously
    removed, which will for example toast an SELinux system.)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun,  6 May 2007 19:44:35 -0400

e2fsprogs (1.39+1.40-WIP-2007.04.07+dfsg-1) unstable; urgency=low

  * Add libreadline.so.5 support to libss.
  * Impove badblocks -n/-w exclusive usage message.
  * Add debugging code (via the COMERR_DEBUG env. variable) to the
      com_err library
  * Fix dump_unused segfault in debugfs when a filesystem is not open
  * Add versioned dependency in Debian's shlibs for libblkid.
      (Closes: #413208)
  * Fix memory leak in blkid library.  (Closes: #413661)
  * Let the debugfs lcd command work even if a filesystem is not open
  * Fix large number of miscellaneous Coveriy bugs.  (None were
      security-security).
  * Fix e2fsck to clear i_size for special devices with a bogus i_blocks
      field on the first pass.
  * Fix e2fsck to set the file type of the '..' entry when connecting
      a directory to lost+found.
  * Enhance e2fsck to recover directories whose modes field were
      corrupted to look like special files.
  * Allow debugfs to dump > 2GB files.  (Closes: #412614)
  * Misc. man page cleanups.  (Closes: #379695)
  * Fix resize2fs parsing of size parameter (Closes: #408298)
  * Fix infinite loop in e2fsck on really big filesystems (Closes: #411838)
  * Fix memory leak in ext2fs_write_new_inode()
  * Add support for using a scratch files directory to reduce e2fsck's
      memory utilization on really big filesystems.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sat,  7 Apr 2007 10:38:40 -0400

e2fsprogs (1.39+1.40-WIP-2006.11.14+dfsg-1) unstable; urgency=low

  * Fix spurious error from e2fsck -c and mke2fs -c caused by the fix
    to #386475.
  * Add dirhash signed/unsigned hint to superblock.  (Closes: #389772)
  * Allow unix_io offsets greater than 2 gigabytes
  * Make sure mk_cmds and compile_et work even in strange locales
  * Fix type-punning bug which caused dumpe2fs to crash on the Arm platform
    (Closes: #397044)
  * Add explanatory message to badblocks that -n and -w are mutually
    exclusive.  (Closes: #371869)
  * New +dfsg source tarball that has useful documentation REALLY
    removed to satisfy the DFSG License Nazi's.  (Closes: #390664)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue, 14 Nov 2006 23:45:34 -0500

e2fsprogs (1.39+1.40-WIP-2006.10.02+dfsg-2) unstable; urgency=low

  * Add failsafes against duplicate UUID generation caused by threads
  * Fix potential e2fsck -n crash caused by corrupt htrees
  * Reorder the library line for static linking, to fix undefined
    references to pthreads on amd64.  (Closes: #393680)
  * Fix mke2fs's error checking when creating revision 0 filesystems.
    (Closes: #392107)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun, 22 Oct 2006 00:19:44 -0400

e2fsprogs (1.39+1.40-WIP-2006.10.02+dfsg-1) unstable; urgency=low

  * New +dfsg source tarball that has useful documentation removed to
    satisfy the DFSG License Nazi's.  (Closes: #390664)
  * Remove dependency on e2fsprogs from the e2fsck-static package
    (Closes: #383521)
  * Fix badblocks interpretation of its first optional argument (last-block)
    (Closes: #386475)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue,  3 Oct 2006 23:36:05 -0400

e2fsprogs (1.39+1.40-WIP-2006.10.02-2) unstable; urgency=low

  * Build using the sid version of libc, not experimental!

 -- Theodore Y. Ts'o <tytso@mit.edu>  Mon,  2 Oct 2006 21:43:44 -0400

e2fsprogs (1.39+1.40-WIP-2006.10.02-1) unstable; urgency=low

  * Previous NMU acknowledged (Closes: #388718)
  * Fix debugfs to print unsigned values for EA's
  * Minor man page fixes (Closes: #373004, #369761)
  * Allow the default inode size to be specified in mke2fs.conf
  * Require mke2fs -F -F for really dangerous operations
  * Add Vietnamese translation
  * Update French and Dutch translations
  * Fix debugfs coredump when lsdel is run without an open filesystem
    (Closes: #378335)
  * Fix spelling error in e2fsck output
  * Fix overflow problems when the number of inodes and blocks is
    close to 2**32-1
  * Add GFS/GFS2 support to the blkid library.
  * Fix blkid support of empty FAT filesystem labels
  * Avoid recursing forever due to symlinks in /dev by the blkid library
  * Fix bogus error messages from resize2fs caused by the filesystem
    not containing a resize inode.  (Closes: #380548)
  * Fixed device-mapper probing (it was failing due to an extra '/dev' being
    added to the device pathname)
  * Make sure the default minimum size journal is big enough to support
    on-line resizing.
  * Add a versioned build-dep on texi2html (Closes: #389554)
  * Remove useful UUID specification thanks to License Nazi's (Closes: #390664)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Mon,  2 Oct 2006 13:04:27 -0400

e2fsprogs (1.39-1.1) unstable; urgency=low

  * Non-maintainer upload
  * Added -pthreads to devmapper libraries (Closes: #388718)

 -- Ben Hutchings <ben@decadent.org.uk>  Sat, 30 Sep 2006 12:49:47 +0100

e2fsprogs (1.39-1) unstable; urgency=low

  * New upstream version
  * Fix debugfs's dump_unused command so it will not core dump on
    filesystems with a 64k blocksize
  * Clarified and improved man pages, including spelling errors
    (Closes: #368392, #368393, #368394, #368179)
  * New filesystems are now created with directory indexing and
    on-line resizing enabled by default
  * Fix previously mangled wording in an older Debian changelog entry
  * Fix doc-base pointer to the top-level html file (Closes: #362544, #362970)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Mon, 29 May 2006 11:07:53 -0400

e2fsprogs (1.38+1.39-WIP-2006.04.09-2) unstable; urgency=low

  * Resize2fs automatically detects the previously used RAID stride
    parameter so that resized filesystems can be more optimally laid
    out for RAID filesystems.
  * Fix mke2fs -cc and e2fsck -cc (Closes: #366017)
  * Fix initrd script to fix failure with 2.4 kernels (Closes: #364516)
  * Mke2fs now uses an improved layout for RAID filesystems when the
    stride parameter is specified.
  * Fix the debugfs commands htree_dump, dx_hash, and list_dir so they
    print a usage message when an illegal option character is given.
  * Speed up mke2fs and e2fsck by writing inode and block bitmaps in one pass
  * Fix filefrag to be 32-bit clean by using unsigned long instead of
    a signed integer for block numbers.
  * Fix a bug in the e2p library which could cause dumpe2fs to
    (rarely) fail to print out the journal or hash seed UUID.
  * Fix memory leak in e2fsck's error paths.
  * Fix comerr-dev's doc-base pointer to the top-level html file

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun, 14 May 2006 18:09:20 -0400

e2fsprogs (1.38+1.39-WIP-2006.04.09-1) unstable; urgency=low

  * Update config.guess and config.sub to latest version (2006-02-23) from FSF
  * Update French, Dutch, Polish, Swedish, and Turkish translations
  * Fix asm/types.h type conflicts on AMD64 to fix FTBFS problems.
      (Closes: #360661, #360317)
  * Fix bug which caused mke2fs -j to fail with an EBUSY error.  (Closes
      #360652)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun,  9 Apr 2006 23:04:15 -0400

e2fsprogs (1.38+1.39-WIP-2006.03.29-2) unstable; urgency=low

  * Added missing build dependency on libdevmapper-dev.  (Closes: #360046)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Thu, 30 Mar 2006 12:33:30 -0500

e2fsprogs (1.38+1.39-WIP-2006.03.29-1) unstable; urgency=low

  * Add udeb: lines to the Debian's shlibs files (Closes: #356293)
  * Enhance dumpe2fs to print the size of the journal
  * Fix e2sprogs so that it is 32-bit clean on x86 platorms.
  * Fix mklost+ound so that it creates a full-sized directory on 4k and
    larger block sizes.
  * Add mke2fs.conf coniguration file to conigure mke2fs's defaults
  * Add devmapper support to the blkid library.
  * E2fsck, resize2fs and mke2fs will now open the filesystem device in
    exclusive mode
  * Fix documentation and man pages.  (Closes: #351268, #357951, #347295,
    #316040)
  * Cix "mke2fs -O resize_inode" for very large filesystems (Closes: #346580)
  * Add on-line resizing support into resize2fs
  * Fix blkid's handling of verification timeouts when the system clock is
    insane
  * Fix library Makefiles so they work with GNU make 3.81 as well as GNU
    make 3.80.
  * Enhance the blkid library to display the uuid of external journals for
    ext3 filesystems
  * Enhance e2fsck so it will fix the external journal hint in the
    superblock if it is out of date.
  * Fix debugfs's icheck to correctly report the owner of an EA block
  * Update Sweedish translation
  * Add a configuration parameter to e2fsck.conf to control whether or not
    filesystem checks are done when the system is running on battery power.
  * Print an explanation when skipping a check due being on battery
    (Closes: #350306)
  * Update French translation (Closes: #341911, #300871, #316604, #316782,
     #330789)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Wed, 29 Mar 2006 20:37:27 -0500

e2fsprogs (1.38+1.39-WIP-2005.12.31-1) unstable; urgency=medium

  * New upstream version
  * Update profile library code base
    - Allow tag and section names to have quoted strings
    - Make the profile library support reading files in a conf.d directory
    - Slightly change the parser to support comments at the end of all lines
    - Add syntax error reporting
    - Simplify profile code
    - Add E2FSCK_CONFIG environment variable which overrides where to
      find /etc/e2fsck.conf
    - Make e2fsck's filesystem problem handing configurable
    - Fix FTBFS bug if comerr-dev is not installed.  (Closes: #345519)
  * Update Dutch, Polish, and Swedish translations.  (Closes: #343149)
  * Fix a fd leak across an exec in libuuid.  (Closes: #345832)
  * Address override file disparities
  * Make urgency be medium to accelerate a workaround to Debian's buggy
    initscripts (See Debian bugs: #343662, #343645)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Fri,  6 Jan 2006 21:41:06 -0500

e2fsprogs (1.38+1.39-WIP-2005.12.10-2) unstable; urgency=low

  * Make resize2fs expand or truncate a file containing a filesystem.
    (Closes: #271607)
  * Add support for lib64ext2fs-nopic.a for the mips architecture
    (Closes: #329074)
  * Deal with the fact that Debian's boot sequence bogusly doesn't set the
    time correctly until very late in the boot process; so if the
    superblock's last mount or write time is in the future, don't treat
    this as a fatal error.  (Closes: #343662, #343645)
  * Move the blkid and uuidgen binaries out of libblkid1 and libuuid1 and
    into the e2fsprogs package to support soname transitions and
    simulaneous installs of multiarch flavors to coexist.  (It's not worth
    creating two whole new packages for two separate binaries, so we just
    fold them into e2fsprogs.)  (Closes: #330737, #330736)
  * Optionally allow the user to interrupt e2fsck "safely" during a boot
    sequence without causing the boot scripts to abort.  (Closes: #150295)
  * Update and clarify man pages (Closes: #312515)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sat, 31 Dec 2005 01:05:35 -0500

e2fsprogs (1.38+1.39-WIP-2005.12.10-1) unstable; urgency=low

  * Update and clarify man pages (Closes: #329859, #322188, #316811)
  * Fix bug creating external journals on big-endian machines.
  * Detect if the superblock's last mount time or last write time is in
    the future, and offer to fix it if this is the case (Closes: #327580)
  * Add new debugfs command, set_current_time which sets the time used to
    update the filesystems's time fields.
  * Fix display bug in badblocks -sw when printing the "done" message.
    (Closes: #322231)
  * Improve blkid's FAT/VFAT filesystem detection code so that it can find
    labels stored the root directory and to be more correct/paranoid.
  * Add support to extract iso9660 label information to the blkid library.
  * Add support to detect the reiser4 filesystem to the blkid library.
  * Add support for detecting software suspend partitions to the blkid library.
  * Fix the blkid library to notice when an ext2 filesystem is upgraded to
    ext3.
  * Fix debugfs's set_inode_field so that successfully sets the i_size field
  * Updated Dutch translation
  * E2fsck will stop and print a warning if the user tries running a
    read/write badblocks test on a read-only mounted root filesystem.
  * Add resize2fs and badblocks to the e2fsprogs udeb
    (Closes: #290429, #310950)
  * Avoid trying to mount the root device if it is an NFS device.
    (Closes: #310428)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sat, 10 Dec 2005 22:49:47 -0500

e2fsprogs (1.38-2) unstable; urgency=low

  * Previous NMU acknowledged (Closes: #317862, #320389)
  * Fix debugfs's set_inode_fields command so it doesn't silently fail
    when setting certain inode fields.
  * Fix e2fsck from segfaulting on disconnected inodes that contain one or
    more extended attributes.  (Closes: #316736, #318463)
  * Allow mke2fs and tune2fs to take fractional percentages to the -m
    option in mke2fs and tune2fs.  (Closes: #80205)
  * Fix a compile_et bug which miscount the number of error messages if
    continuations are used in the .et file, and fix compatibility problems
    with MIT Kerberos 1.4
  * Add extra sanity checks to protect users from unusual cirucmstances
    where /etc/mtab may not be sane, by checking to see if the device is
    reported busy (works on Linux 2.6) kernels.  (Closes: #319002)
  * Fix use-after-free bug in e2fsck when finishing up the use of the
    e2fsck context structure.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun, 21 Aug 2005 23:35:29 -0400

e2fsprogs (1.38-1.1) unstable; urgency=low

  * NMU for RC bug durring bug squishing party
  * Fix for changes to texi2html, patch by Matt Kraai
    (Closes: #317862, #320389)
  * version build-depend on texi2html, won't work with older one anymore

 -- Blars Blarson <blarson@blars.org>  Fri,  5 Aug 2005 04:46:54 +0000

e2fsprogs (1.38-1) unstable; urgency=low

  * New upstream version
  * Fix ia64 core dump bug caused by e2fsprogs running afoul of C99 strict
    type aliasing rules on newer gcc compilers.  (Addresses Red Hat
    Bugzilla ##161183.)
  * Fix minor typo's in tune2fs man page.
  * Mke2fs will refuse to create filesystems greater than 2**31-1 blocks,
    unless forced, to avoid kernel bugs that still need to be fixed as
    of this release.
  * Update French, Dutch, Polish, Swedish, and Turkish translations.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Wed, 30 Jun 2005 20:02:42 -0400

e2fsprogs (1.37+1.38-WIP-0620-1) unstable; urgency=low

  * Update and clarify man pages.
  * Clarify and clean up e2fsck's problem descriptions
  * Add Dutch translation, and update French, Polish, Swedish, and
    Turkish translation.
  * mke2fs and badblocks will check to see if the device appears to be
    busy and abort if so; this feature only works on Linux 2.6 systems.
    (Closes: #308594)
  * Fix filefrag so that it works on 64-bit platforms where the size of
    an integer != the size of a long.  (Closes: #309655)
  * Change the default journal size to be bigger for larger filesystems,
    given modern memory sizes.
  * Fix com_err library so it is compatible with MIT krb5 1.4.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Mon, 20 Jun 2005 17:11:29 -0400

e2fsprogs (1.37+1.38-WIP-0509-1) unstable; urgency=low

  * Make the blkid library much more efficient when a new device is added
    on systems with a huge number of disks.
  * Fix handling of the PAGER and SS_READLINE_PATH environment variables
    in the ss library, and the TEST_IO_* environemnt vaiables for the
    test_io io_manager, which was accidentally broken in 1.37-1.
  * Fix libblkid's recognition of cramfs filesystems, and add support for
    cramfs labels.
  * Fix filefrag to give correct results when the first block found is an
    indirect block.  (Closes: #307607)
  * Fix debugfs seg fault when the stat command is given and a filesystem
    is not open.
  * Improve environment variable paranoia checks.
  * Fix e2fsck's handling of multiply claimed blocks involving the resize
    inode.
  * When determining the libraries needed for the initrd, unset LD_PRELOAD
    and LD_LIBRARY_PATH and filter out libraries found in
    /etc/ld.so.preload.  (Closes: #304003)
  * Update Swedish translation, and added translation for Rwanda.
  * Minor man page spelling/typo fixes.  (Closes: #304591, #304592,
    #304594, #304597, #304593)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Mon,  9 May 2005 09:10:20 -0400

e2fsprogs (1.37-2) unstable; urgency=low

  * Fix filefrag so that it works non ext2/3 filesystems again.
    (Closes: #303509)
  * Make sure we include stdlib.h to fix a core dump bug in mke2fs on the
    IA64 architecture (or other platforms where sizeof(ptr) > sizeof(int))
    (Closes: #302200)
  * Add missing return values so that we don't return garbage in certain
    error cases in ext2fs_write_new_inode() and ext2fs_read_int_block().
  * Fix minor spelling typo in the mke2fs man page
  * Avoid doing the LOW_DTIME checks if the superblock last mount time
    indicates that the system clock may not be set correctly.
  * Add further paranoia checks to the blkid, ext2fs, and ss libraries to
    make them safe to call from setuid or setgid applications.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sat,  9 Apr 2005 11:08:04 -0400

e2fsprogs (1.37-1) unstable; urgency=low

  * New upstream release.
  * Fixed a bug in e2fsck so it would notice if a file with an extended
    attribute block was exactly 2**32 blocks, such that i_blocks wrapped
    to zero.
  * Fixed a bug in filefrag which caused it to falsely report a
    discontinuity when there are one or more unallocated blocks at the
    beginning of a file.
  * Fix the missing translations (caused by a bug in the gen-tarball
    script).  (Closes: #296769)
  * Add support in e2fsck and debugfs for extended attributes in inodes.
  * Fix the missing translations (caused by a bug in the gen-tarball script).
    (Closes: #296769)
  * Force compile_et and mk_cmds to use /usr/bin/awk so that we will work
    on any Debian system regardless of which version of awk is installed.
    (Closes: #299341)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Thu, 21 Mar 2005 22:31:08 -0500

e2fsprogs (1.36release-1) unstable; urgency=low

  * New upstream release.
  * Make filefrag print the first and last blocks when in verbose mode.
  * Drop sparc assembly bitops; it's less efficient than gcc 3.4's
    generated code, and it triggers compiler warnings on sparc 64.
    (Closes: #232326)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Fri,  4 Feb 2005 20:58:35 -0500

e2fsprogs (1.36rc5-1) unstable; urgency=low

  * Make blkid -t work more consistently even when the cache file is not
    available or set to /dev/null.  (Closes: #292425)
  * Don't ever use a blocksize greater than 4k, since not all 2.6 kernels
    will support this.
  * Fix bug where mke2fs would not correctly create filesystems greater
    than 4TB.
  * Fix e2fsck so it won't delete symlinks that contain an extended
    attribute after the ext_attr feature flag has been cleared.
  * Fix e2fsck's resize inode handling in some additional corner cases.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Thu, 27 Jan 2005 22:44:31 -0500

e2fsprogs (1.36rc4-1) unstable; urgency=low

  * Fix a bug in resize2fs where we don't release the blocks belonging to
    the old inode table blocks when we move the inode table.
    (Closes: #290894)
  * Make sure that we don't write garbage when writing a large inode.
  * Check NTFS ahead of other filesystems since Windows doesn't always
    clearing enough of the partition to avoid false positives with older
    filesystems.  (Closes: #291990)
  * E2fsck now checks the summary filesystem accounting information, and
    if any of the information is obviously wrong, it will force a full
    filesystem check.  (Closes: #291571)
  * Clarified and updated tune2fs and blkid man pages
  * 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 blkid -t to display all devices that match the specified criteria,
    not just the first one.  (Closes: #290530)
  * Add support for the blkid library to recognize Oracle ASM volumes.
  * Add set_super_value jnl_blocks[] in debugfs.
  * Fix the filefrag program so that it works correctly with sparse files.
  * Fix portability problems with FreeBSD, Solaris, and Intel C++ 8.1.
  * Add support for FreeBSD and Lites as OS Creator values.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Wed, 26 Jan 2005 10:22:02 -0500

e2fsprogs (1.36rc3-2) unstable; urgency=low

  * Remove debugging printf's from e2image's -s code.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Wed, 19 Jan 2005 02:25:53 -0500

e2fsprogs (1.36rc3-1) unstable; urgency=low

  * New upstream release
  * Update Italian, French, and Turkish translations
  * Fixed file descriptor leak in the filefrag program
  * Add -s option to e2image which scrambles directory entries when making
        raw image files
  * Make sure e2fsck doesn't crash if /proc/acpi/ac_adapter does not
        exist
  * Added Solaris, FreeBSD portability fixes

 -- Theodore Y. Ts'o <tytso@mit.edu>  Wed, 19 Jan 2005 00:33:31 -0500

e2fsprogs (1.36rc2-1) unstable; urgency=low

  * New upstream release
  * Update Italian translation
  * Add support for swap partition labels and uuid's

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue, 11 Jan 2005 14:12:17 -0500

e2fsprogs (1.36rc1-1) unstable; urgency=low

  * Fix a FTBFS bug for amd64/gcc-3.0 (Closes: #289133)
  * Minor man page clarifications.  (Closes: #273679)
  * Add support for online resizing via the resize inode.
  * Badblocks will now correctly display block numbers greater than
        999,999,999 in its progress display.
  * tune2fs 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 blocks 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.  (Closes: #287455)
  * The fsck program will now accept an optional filedescriptor argument
        to the -C option.
  * 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 or gigabytes (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 will now accept blocksizes up to 65536; kernel support on
        the x86 doesn't exist, but it is useful on other architectures.
  * 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
  * Updated Italian translation file
  * E2fsck will now recover from a journal containing illegal blocks.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Fri,  7 Jan 2005 20:22:36 -0500

e2fsprogs (1.35-9) unstable; urgency=low

  * Minor man page clarifications.  (Closes: #273679)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue, 28 Sep 2004 10:29:29 -0400

e2fsprogs (1.35-8) unstable; urgency=low

  * Remove double "//" when listing attributes in the root directory or
       when there is a trailing '/' in the directory name.  (Closes: #272943)
  * Make sure the configure files are newer than configure.in the
       debian/rules file so that a dpkg-source created patch won't
       trigger an attempt rebuild of the configure script.
       (Closes: #272558, #273242)
  * Make sure /usr/lib/e2initrd_helper is in the e2fsprogs package.
       (Closes: #272698, #272728, #273161, #273163)
  * Only use blocksizes > 4k on Linux 2.6 and newer systems.  (Closes: #271064)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sat, 25 Sep 2004 07:37:52 -0400

e2fsprogs (1.35-7) unstable; urgency=low

  * Make sure "done" gets correctly translated in badblocks(8), and update
      French translation (Closes: #252836)
  * Always build the fsck wrapper on Debian systems (Closes: #248050)
  * Filter out linux-gate.so, which is a pseudo entry for the 32->64bit
      translation for amd64 systems, in the initrd creation script.
      (Closes: #253595)
  * Change the initrd scripts to be use a helper program which avoids
       needing to mount the root filesystem and use awk to query the
       /etc/fstab file.  (Closes: #247775)
  * Add support for the ocfs2 filesystem to the blkid library.
  * Various portability fixes for Hurd and FreeBsd, as well as
        removing XSI:isms.  (Closes: #256669, #264630, #269044, #255589)
  * Update config.guess and config.sub from the FSF.
  * Minor manual page clarifications (Closes: #268148)
  * Fix write ordering problems to make e2fsck more robust in the face
       of system crashes while replaying the journal, etc.
  * Fix debugging printf in resize2fs.  (Closes: #271605)
  * 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.
  * Change e2fsck to accept directories greater than 32MB.
  * Add test_io mechanisms to abort after reading or writing to a
       particular block.
  * Fix blkid file descriptor and memory leak.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sat, 18 Sep 2004 09:58:46 -0400

e2fsprogs (1.35-6) unstable; urgency=low

  * In the mkinitrd script, make sure the directories exist before
    trying to copy in the needed shared libraries.  (Closes: #244058, #246480)
  * In the mkinitrd script, use LD_ASSUME_KERNEL=2.4 if necessary.
    (Closes: #245931)
  * In the mkinitrd script copy in /usr/bin/awk instead of /usr/bin/mawk.
    (Closes: #245670)
  * In the initrd script, fail quietly if /mnt/etc/fstab does not exist.
    (Closes: #246917)
  * Minor updates to German translation (Closes: #244105)
  * Since woody's sysvinit package is before the initscripts were broken out
    we need an explict Conflict: sysvinit (<< 2.85-4) header. (Closes: #243829)
  * Update the UUID library man pages
  * Fix a Y8.8888K potential problem with the uuid library
  * Minor updates to the german translation
  * Clarified/corrected the copyright statements of the UUID and blkid
    libraries in the Debian copyright files.
  * Added sanity check to the blkid library so that if current time is
    less than last time a device is verified, force a reverification since
    it means the system time is not trustworthy.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue,  4 May 2004 16:23:06 -0400

e2fsprogs (1.35-5) unstable; urgency=low

  * Add uuid_unparse_upper() and uuid_unparse_lower() functions to the
    uuid library.
  * Address GNU/KFreeBSD portability issues (Closes: #239934)
  * Use unsigned for 1 bit wide bitfields in header files to avoid
    Intel C++ compiler warnings.
  * Use C99 stdint.h types in the uuid library
  * Fix up and cleanup uuid man pages
  * Change the licensing of the uuid man pages to be 3-clause BSD.
  * Fix the initrd scripts so that the automatic ext3 journal
    conversion actually works correctly; also allow conversion of the root
    filesystem from ext3 back to ext2  (Closes: #241183)
  * Minor man page fixes (Closes: #241940, 242995)
  * Use the DEBUGFS_PAGER environment variable in preference to PAGER
    (Closes: #239547)
  * Added French translation
  * Be flexible about the name of the ACPI device that cooresponds to
    the AC adapter (Closes: #242136)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Mon, 12 Apr 2004 12:38:34 -0400

e2fsprogs (1.35-4) unstable; urgency=low

  * Fix bug in the blkid library (introduced in 1.35-3) which caused
    the probe function to completely malfunction.  (Closes: #239191)
  * Make the debugfs command's link command set the filetype information
    correctly.
  * Update the Polish, Swedish, and Turkish translations
  * Add an -o option to the blkid program which allows the user to
    control the output format of blkid.
  * Fixed and cleaned up the tune2fs and blkid man pages (Closes: #238741)
  * Improve UUID generation algorithm (use all 14 bits in the clock sequence)
  * Change the license on the UUID library to be 3-clause BSD.
  * Remove the only-partially-implemented -p option to blkid.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun, 21 Mar 2004 20:17:03 -0500

e2fsprogs (1.35-3) unstable; urgency=low

  * Mention e2image's limitation in writing a normal image file to
    stdout (Closes: #236383)
  * Only use BLKGETSIZE64 on Linux 2.6 since it is unreliable on Linux 2.4.
    (Closes: #236528)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Mon,  8 Mar 2004 14:19:15 -0500

e2fsprogs (1.35-2) unstable; urgency=low

  * Use 64-bit ioctl's if present to determine the 64-bit size of a device
  * Add tune2fs to the e2fsprogs udeb package (Closes: #235639)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue,  2 Mar 2004 10:13:39 -0500

e2fsprogs (1.35-1) unstable; urgency=low

  * New upstream version.
  * Fix "badblocks -t random". (Closes: #234828)
  * Fix "e2fsck -k".  (Closes: #234993)
  * Change badblock's default number of blocks tested at once from
    16 to 64.  (Closes: #232240)
  * ss-dev and comerr-dev now use a versioned dependency for libss2 and
    libcomerr2, respectively.  (Closes: #235280)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sat, 28 Feb 2004 10:14:19 -0500

e2fsprogs (1.34+1.35-WIP-2004.01.31-2) unstable; urgency=low

  * Add a new -k option to e2fsck which keeps the existing badblocks
    list when using the -c option.  (Closes: #229103)
  * Update debugfs to support new large major/minor device numbers
    supported by Linux 2.6.  (Closes: #865289)
  * Fix makefiles so that it will build correctly with --enable-profile.
  * Add -mieee when compiling with GCC on an Alpha.
  * Fix e2fsck preen mode messages using pass 1B/C/D.
  * Fix the debugfs man page.  (Closes: #232406)
  * Fix the ext2fs.h header file to work correctly with C++.
  * e2fsck and debugfs now correctly deals with symlinks that have
    extended attribute information, such as those created by SE Linux.
    (Closes: #232328)
  * Make sure filefrag actually gets compiled under Linux (Closes: #230992)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue, 24 Feb 2004 00:16:43 -0500

e2fsprogs (1.34+1.35-WIP-2004.01.31-1) unstable; urgency=medium

  * 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.  (Closes: #228723)
  * Chattr now stops processing options when it sees '--'.  (Closes: #225188)
  * Add FreeBSD port fixups
  * Use the DEBUGFS_PAGER environment variable in preference to PAGER.
    Document that less is a really, really, really bad pager to use
    for debugfs (unfortunately, Debian policy says we must use
    /usr/bin/pager even if it results in very annoying behaviour for
    the user since 'less' is used in preference to 'more' unless it is
    globally overriden via update-alternatives(8).  Oh, well.  Debian
    users are encouraged to set DEBUGFS_PAGER to be "more" in their
    dot files to avoid this brain damage).
  * Fix libuuid1-udeb so that it provides libuuid1.  (Closes: #229633)
  * 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.
  * Install the filefrag program.
  * Don't try to compile filefrag on non-Linux platforms. (Closes: #226456)
  * Minor manual page clarifications (Closes: #222606, #214920)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sat, 31 Jan 2004 20:57:35 -0500

e2fsprogs (1.34+1.35-WIP-2003.12.07-2) unstable; urgency=low

  * Fix test for /etc/mkinitrd/scripts/e2fsprogs to make sure it gets
    removed.  (Closes: #213275)
  * Debugfs now searches for the appropriate pager to use, beginning
    with /usr/bin/pager, and then falling back to 'less' and 'more'.
    (Closes: #221977)
  * Fixed mangled encoding in Czech locale file.  (Closes: #214633)
  * Fix bug where using debugfs to copy a file from /dev/null caused
    in correct mode bits.  (Closes: #217456)
  * Fixed a bug where e2fsck would bomb out if a journal needed to be
    replayed when using an alternate superblock.
  * Minor manual page fixups/cleanups.
  * Debugfs's mkdir command will automatically expand the directory if
    necessary.  (Closes: #217892)
  * Fix a bug in e2fsck which caused it to incorrectly fix a filesystem
    when reconnecting a directory requires creating a lost+found
    directory.  (Closes: #219640)
  * Add Spanish translation.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Wed, 24 Dec 2003 14:24:14 -0500

e2fsprogs (1.34+1.35-WIP-2003.12.07-1) unstable; urgency=medium

  * Added regression tests for mke2fs and dumpe2fs.
  * Support 2.6 kernel header files.  (Closes: #221778)
  * Fix bug which could a core dump if a non-existent LABEL or UUID
    specifier is passed to e2fsck or tune2fs.
  * Fix handling of corrupted indirect blocks in the bad block inode.
  * If the number of mounts until the next forced filesystem check is less
    than 6, mention this to the user.  (Closes: #157194)
  * E2fsck will try to avoid doing a forced filesystem chcek if a system
    is running on batteries according to APM or ACPI.  (Closes: #205177)
  * Fix problems in the German translation.  (Closes: #2000086)
  * Updated Swedish translation and added Polish translation.
  * Fix signed vs unsigned bug which could cause the com_right function to
    seg fault.  (Closes: #213450)
  * Add libuuid1-udeb (Closes: #221777)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sat, 22 Nov 2003 11:51:13 -0500

e2fsprogs (1.34+1.35-WIP-2003.08.21-3) unstable; urgency=low

  * Adjust the man page descriptions so that "apropos ext2" or
    "apropos ext3" will find all of the e2fsprogs man pages.
    (Closes: #206845)
  * Protect against a potential core dump in e2fsck when printing a
    message about a backup superblock.
  * Fix a bug in mke2fs which caused -T largefile or -T largefile4 to
    core dump due to a division by zero error.  (Closes: #207082)
  * Force e2fsprogs to use the matched version of e2fslibs.  (Closes: #208103)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun, 31 Aug 2003 21:49:52 -0400

e2fsprogs (1.34+1.35-WIP-2003.08.21-2) unstable; urgency=low

  * When moving the journal or backing up the journal inode
    information, make sure e2fsck updates all the superblocks, and not
    just the master superblock.
  * Change the priority of libblkid1-udeb to be required instead of
    standard, to match the override file.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Thu, 21 Aug 2003 08:50:34 -0400

e2fsprogs (1.34+1.35-WIP-2003.08.21-1) unstable; urgency=low

  * Fix compile_et to output the correct prototype for
    initialize_xxx_err_table_r() in the header file.  (Closes: #204332)
  * E2fsck will avoid printing ^A and ^B characters bracketing the
    progress bar when stdout is a tty device.  (Closes: #204137)
  * Add support for storing the journal inode location in the superblock
    so that e2fsck can recover from a corrupted inode table after a power
    failure.
  * Move the initrd script from /etc/mkinitrd/scripts to
    /usr/share/initrd-tools/scripts so that mkinitrd will not remove
    the file when it is uninstalled.  (Closes: #204019)
  * Remove unneeded files in debian directory: blkid-dev.substvars and
    e2fsprogs-bf.lintian-overrides.  (Closes: #203914)
  * Support "noopt" in DEB_BUILD_OPTIONS instead of "debug".
    (Closes: #203914)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Thu, 21 Aug 2003 01:47:58 -0400

e2fsprogs (1.34+1.35-WIP-2003.08.01-1) unstable; urgency=low

  * Fix O_DIRECT test to prevent badblocks from screwing up after
    finding a bad block.  (Closes: #203713)
  * Add Heimdal compile_et extensions from Philipp Thomas (pthomas@suse.de)
  * Fix potential pointer aliasing bugs caused by type-punning and gcc 3.x

 -- Theodore Y. Ts'o <tytso@mit.edu>  Fri,  1 Aug 2003 13:44:58 -0400

e2fsprogs (1.34-2) unstable; urgency=low

  * Fix erroneous reference to /usr/share/doc/e2fsprogs/html-info in
    /usr/share/doc-base/libext2fs (Closes: #203157)
  * Explicitly specify the version of libblkid1 needed in
    e2fsprogs.shlibs.local in order to avoid picking up the wrong depedency.
    (Closes: #203157)
  * Changed priority of libblkid1-udeb to be standard, not required.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Wed, 30 Jul 2003 19:47:32 -0400

e2fsprogs (1.34-1.1) unstable; urgency=low

  * Non-maintainer upload.
  * don't call ldconfig in udebs.
  * fix dependencies of e2fsprogs-udeb.

 -- Bastian Blank <waldi@debian.org>  Tue, 29 Jul 2003 12:11:54 +0200

e2fsprogs (1.34-1) unstable; urgency=low

  * New upstream version.
  * Fixed bug in fsck which caused it to waste CPU by spinning while
    waiting for a child fsck process under some circumstances.
  * Fixed bug in blkid library which would cause it to spin forever if
    /proc is not mounted and /etc/blkid.tab is not present.
  * Improved the blkid library's UDF's probing functions.
  * Fixed the blkid library so it will remove delete the LABEL
    attribute from its cache when a filesystem that previously had a
    label no longer has one.
  * Added Swedish translation.
  * Remove debugging printf in badblocks program (Closes: #201499)
  * Split shared libraries out of the e2fsprogs package into separate
    packages: libss2, libcomerr2, libuuid1, and e2fslibs.  (Closes: #201155,
    #201164)
  * Warn the user when creating a filesystem with a journal and a blocksize
    greater than 4096, since some kernels don't support ext3 with large
    block sizes.  (Closes:  #193773)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sat, 26 Jul 2003 01:01:55 -0400

e2fsprogs (1.33+1.34-WIP-2003.05.21-2) unstable; urgency=low

  * Set up FreeBSD configuration defaults (Closes: #195274)
  * Clarify resize2fs man page (Closes: #195616)
  * Fix resize2fs to deal with filesystem with bad blocks
  * Fix spelling error in e2fsck
  * Add workaround for intl library on Darwin
  * Fix gcc -Wall nitpicks
  * Round down the default size of the filesystem for mke2fs and
    resize2fs to be a multiple of the pagesize to work around a potential
    Linux kernel bug
  * Fix bug in mke2fs where it could die with a floating exception if
    the device does not support the BLKSSZGET ioctl (Closes: #196734)
  * Add conflicts against older versions of sysvinit that don't correctly
    handle an exit code that has the bit #2 set.  (Closes: #183675)
  * Badblocks will attempt to use O_DIRECT if it is safe to do so.
    (Closes: #198006)
  * Use symbolic links for fsck.ext{2,3} and mkfs.ext{2,3} in the udeb
    package since busybox tar can't deal with hard links.  (Closes: #196508)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sat, 12 Jul 2003 03:16:08 -0400

e2fsprogs (1.33+1.34-WIP-2003.05.21-1) unstable; urgency=low

  * Fix problems with compiling e2fsprogs with NLS support on woody
    (Closes: #193372)
  * Remove the extraneous de-utf.po file.
  * Add get-text to build-depends.
  * Use ngettext (abbreviated with P_()) to simplify the statistics reporting.
  * Fix badblocks to be able to support arbitrary 4 byte test patterns.
  * Fix bug which caused us to accidentally include the EVMS plugin in
    the e2fsprogs package (which doesn't work, but causes confusing messages
    to show up when the evms client is started).
  * If the hardware sector size of a device is larger than the default
    blocksize, use the hardware sector size as the blocksize when creating
    a filesystem, to solve problems with s/390 DASD's.
  * Add a shared library dependency to libuuid to libblkid (Closes: #194094)
  * Add initial implementation of a dump_unused command (Closes: #79164)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun, 18 May 2003 01:24:16 -0400

e2fsprogs (1.33-5) unstable; urgency=low

  * Clarify blocksize units when displaying messages in resize2fs, and
    support using suffixes (sectors, kilobytes, megabites, gigabytes)
    to the size parameter to indicate units.  (Closes: #189814)
  * Fix debugfs core-dumping problem caused by getopt.  (Works around: #192834)
  * Add package dependency to shlibs for comerr to indicate support
    for kth compatibility.  (Closes: #193096)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue, 13 May 2003 23:45:08 -0400

e2fsprogs (1.33-4) unstable; urgency=low

  * Add replaces field to comerr-dev to resolve a file conflict with
    /usr/include/com_err.h and the libkrb5-dev package.  (Closes: #192277)
  * Add -t option to badblocks to control the test pattern used.
  * Remove e2fsprogs-bf package, as it is obsolete. (Closes: #183453)
  * Remove NLS support from e2fsprogs-udeb.  Save 5.5k on the boot
    floppies / install media.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Thu,  8 May 2003 10:25:05 -0400

e2fsprogs (1.33-3) unstable; urgency=low

  * Add full Heimdall/Kerberos4-kth compatibility to com_err routines.
  * Declare comerr-dev as replacing << e2fslibs-dev 1.33-2, to avoid
    errors when upgrading to the new versions of comerr-dev and
    e2fslibs-dev

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue,  6 May 2003 00:29:47 -0400

e2fsprogs (1.33-2) unstable; urgency=low

  * Fix up NLS support
     - Fix message abbreviations support (i.e., @g --> group)
     - Update to gettext 0.11.5
     - Add Czech translation
     - Install message catalogs
     - Other miscellaneous NLS bug fixes
  * Add new debugfs command, imap, which prints the location of a
    specified inode in the inode table.
  * Put /usr/include/com_err.h in comerr-dev instead of e2fslibs-dev.
    (Closes: #191899)
  * Add support for OV-style continuations in compile_et.  (Closes: #191900)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Mon,  5 May 2003 18:13:12 -0400

e2fsprogs (1.33-1) unstable; urgency=low

  * New upstream version (Closes: #189687)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Mon, 21 Apr 2003 13:49:52 -0400

e2fsprogs (1.32+1.33-WIP-2003.04.14-1) unstable; urgency=low

  * New upstream version
     - Add new utility program, logsave, to capture the output of fsck
       during the boot sequence
  * Add support for the -a and -s options to logsave.
  * Change e2fsck to bracket its progress bar output with ctrl-A and ctrl-B
    characters, so that logsave -s can omit writing the progress bar output
    to the log file.
  * Avoid printing the version banner for mke2fs if the -q option is
    specified.  (Closes: #172716)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Wed, 16 Apr 2003 15:27:20 -0400

e2fsprogs (1.32+1.33-WIP-2003.03.30-3) unstable; urgency=low

  * Provide /usr/include/com_err.h, which was previously provided by the
    libkrb5-dev package
  * Change the sectoin of com_err-dev, ss-dev, uuid-dev, libblkid-dev,
    e2fslibs-dev to libdevel
  * Add libblkid1-udeb package for the Debian Installer.
  * Use the SS_READLINE_PATH environment variable to control the search
    for a suitable readine library.
  * Fix bug in mke2fs, which was was incorrectly checking the argument
    to the -g option if the default block size is used.  (Closes: #188319)
  * Update man pages.  (Closes: #188318)
  * Mke2fs can be given a minimum block size by passing in a negative
    number to the -b option.
  * Update to standards 3.5.9

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sat, 12 Apr 2003 02:52:17 -0400

e2fsprogs (1.32+1.33-WIP-2003.03.30-2) unstable; urgency=low

  * Fix XFS superblock definition.  Add support to extract UUID and
    labels for JFS and ROMFS.
  * Make the random number generator more paranoid about potentially buggy
    /dev/random devices.
  * The badblocks program now flushes its output as it discovers bad blocks.
  * Imported bug fixes to EVMS driver from the EVMS 2.0 tree.  Fixed a
    few potential hangs, and eliminated a file descriptor leak.
  * E2fsck now updates the global free block and inode counters from
    the block group specific counters quietly.  This is needed for an
    experimental kernel patch which improves SMP scalability by not
    locking the entire filesystem during block or inode allocation; if
    the filesystem is not unmoutned cleanly, the global counts may not
    be accurate.
  * Fix a bug in fsck which can cause it to hang trying to access the
    floppy disk if there the floppy drive has filesystem type of
    'auto'.  (Closes: #187812)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun,  6 Apr 2003 23:13:50 -0400

e2fsprogs (1.32+1.33-WIP-2003.03.30-1) unstable; urgency=low

  * Change compile_et to generate header files that use <et/com_err.h>
    instead of <com_err.h>, so the current version of the header file
    is used.  Remove legacy K&R, varargs, and pre-POSIX signal support.
  * Fix (one more time!) Apple Darwin port in blkid/getsize.c

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun, 30 Mar 2003 23:34:55 -0500

e2fsprogs (1.32+1.33-WIP-2003.03.25-1) unstable; urgency=low

  * New maintainer
  * New upstream release (Closes: #176814, #174766, #166048, #179671,
    #173612, #175233, #175113, #170497, #185945)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun, 16 Mar 2003 18:05:08 -0500

e2fsprogs (1.32-2) unstable; urgency=high

  * Applied upstream patch to fix htree problems, and to deactivate it by
    default in mke2fs (Closes: #181615, #179043)
  * Be sure removal of libe2fsim doesn't fail, as it's not built on hurd
    (Closes: #164117).

 -- Yann Dirson <dirson@debian.org>  Fri, 21 Feb 2003 00:21:44 +0100

e2fsprogs (1.32-1) unstable; urgency=low

  * New upstream release (Closes: #167108).

 -- Yann Dirson <dirson@debian.org>  Tue, 19 Nov 2002 00:18:09 +0100

e2fsprogs (1.29+1.30-WIP-0930-2) unstable; urgency=low

  * Made mkinitrd script to skip commented-out lines (Closes: #163251).

 -- Yann Dirson <dirson@debian.org>  Tue, 15 Oct 2002 00:16:08 +0200

e2fsprogs (1.29+1.30-WIP-0930-1) unstable; urgency=low

  * New upstream prerelease.
  * Replaced in mkinitrd script "tune2fs -j" with "tune2fs -O
    has_journal", as suggested by Theodore Ts'o (Closes: #162949).
  * Remove --disable-debugfs from mips-nopic flags (Closes: #162674).

 -- Yann Dirson <dirson@debian.org>  Thu,  3 Oct 2002 00:05:36 +0200

e2fsprogs (1.29-1) unstable; urgency=low

  * New upstream release (Closes: #159423).
  * Fixed typo in chattr manpage (Philipp Matthias Hahn, Closes:
    #162297).
  * Generate udeb package for debian-installer (Martin Sjoegren, Closes:
    #162212).
  * Fixed installation of mkinitrd script (don't use dh_install).  Remove
    it from the wrong location where it was, in preinst.  Hopefully noone
    noticed.
  * Also have old scripts/e2fsprogs.mkinitrd removed.
  * Bumped Standards-Version to 3.5.6, no change.  3.5.7 will need a bit
    of work but not tonight.

 -- Yann Dirson <dirson@debian.org>  Thu, 26 Sep 2002 01:46:25 +0200

e2fsprogs (1.28-5) unstable; urgency=low

  * The "this time it will work ! (famous last words)" release.
  * Now that it builds, ensure the dir in which we install this damn mips
    non-pic lib exists.

 -- Yann Dirson <dirson@debian.org>  Tue, 17 Sep 2002 00:04:49 +0200

e2fsprogs (1.28-4) unstable; urgency=low

  * Moved setting of CFLAGS to the correct place when building the special
    mips non-pic lib (Closes: #159757 again).

 -- Yann Dirson <dirson@debian.org>  Sun, 15 Sep 2002 21:19:19 +0200

e2fsprogs (1.28-3) unstable; urgency=low

  * Don't use special cflags at configure time when building the special
    mips non-pic lib, in yet another attempt to fix my adaptation of the
    patch from the mips team.  Also added --disable-nls which was present
    in the original patch.
  * Remove debian/BUILD-MIPS on clean.
  * Install mkinitrd script as scripts/e2fsprogs, not as
    scripts/e2fsprogs.mkinitrd.

 -- Yann Dirson <dirson@debian.org>  Mon,  9 Sep 2002 23:01:31 +0200

e2fsprogs (1.28-2) unstable; urgency=low

  * Fixed my adapation of the mips non-pic build (Closes: #159757).

 -- Yann Dirson <dirson@debian.org>  Fri,  6 Sep 2002 00:03:45 +0200

e2fsprogs (1.28-1) unstable; urgency=low

  * New upstream release.

 -- Yann Dirson <dirson@debian.org>  Mon,  2 Sep 2002 23:34:55 +0200

e2fsprogs (1.27+1.28-WIP-0817-1) unstable; urgency=low

  * New upstream pre-release.  Closes: #138003, #144621, #145044, #151990,
    #152029, #152891, #155007, #131350, #147256, #153102.
  * New binary: findfs.
  * Added execute permissions to the mkinitrd script (thanks lintian).
  * Don't ship FSIM for EVMS for now.

 -- Yann Dirson <dirson@debian.org>  Sun, 25 Aug 2002 19:32:12 +0200

e2fsprogs (1.27+1.28-WIP-0626-2) experimental; urgency=low

  * Remove bogus shlibs deps on "e2fsprogs (>= <current>)"

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sat, 17 Aug 2002 17:59:17 -0400

e2fsprogs (1.27+1.28-WIP-0626-1) experimental; urgency=low

  * New upstream pre-release:
  ** Supports v2 ACL format (Closes: #138160).
  * Removed explicit --mandir flag, as it now uses FHS man location by
    default.
  * Added mkinitrd script, "upstream-contributed" ;) by Ted Ts'o (Closes:
    #148064).
  * Build a no-pic version of libext2fs.a on mips and mipsel, patch by
    Florian Lohoff, adapted for style consistency (Closes: #145432).
  * Removed presumably-useless and presumably-broken CFLAGS propagation.
    If someone misses that, I'll add ${CFLAGS} to --ccopts.

  * Switched to debhelper v4.
  * Added ${misc:Depends} to all packages' Depends field.

  * Fixed typos in fsck.8, added an example for clarity (Closes:
    #145044).
  * Fixed typo in chattr manpage (Closes: #141938).
  * Fixed typo in tune2fs manpage (Closes: #148514).

 -- Yann Dirson <dirson@debian.org>  Tue, 23 Jul 2002 00:12:33 +0200

e2fsprogs (1.27-2) unstable; urgency=medium

  * Urgency medium since this fixes a RC bug.
  * Generate the shlibs file instead of just copying it in place, and make
    it produce deps on "e2fsprogs (>= <current>)" as well, to cope with
    new functions introduced in the libs (Closes: #139274).
  * Added a note on this in README.Debian.

 -- Yann Dirson <dirson@debian.org>  Thu, 21 Mar 2002 23:58:48 +0100

e2fsprogs (1.27-1) unstable; urgency=low

  * New upstream release (Closes: #136737).
  * No more use for dh_link'ing *.ext[23], it's now done by upstream
    Makefiles.
  * Only include (new) inode_io.o from libext2fs when fileio.o is, or the
    BF build fails because of this additional (unused) member (upstream
    hint).

 -- Yann Dirson <dirson@debian.org>  Mon, 11 Mar 2002 00:17:32 +0100

e2fsprogs (1.26-3) unstable; urgency=low

  * Simple rebuild after fixing the settings of my computer's clock, so
    that katie accepts to install the package.

 -- Yann Dirson <dirson@debian.org>  Sat, 23 Feb 2002 14:53:15 +0100

e2fsprogs (1.26-2) unstable; urgency=low

  * Applied upstream patch dealing with the rlimit filesize variation
    among archs and kernel versions (Closes: #133909).
  * Create fsck.ext3.8 symlink (Closes: #121526).

 -- Yann Dirson <dirson@debian.org>  Sat, 23 Feb 2002 06:44:02 +0100

e2fsprogs (1.26-1) unstable; urgency=low

  * This uploads fixes 10 bugs, including data-corruption problems, and
    adds much to the ease of maintainance and problem tracking.  Good
    choice for woody.

  * New upstream release (Closes: #106622, #116975, #118443, #119624,
    #120171, #120077, #129828, #132764).
  ** Fixes for data-corruption bugs not reported to the BTS: e2fsck
    trashed external journals needing to be replayed, e2fsck now hides
    visible journal files (data corruption problems when not excluded from
    a backup and then restored) (Closes: #132654).
  ** Other noticable bugs fixed include: e2fsck null pointer
    dereferencing, fsck did not finds LVM volumes by UUID or by label,
    largefile support (ie. dealing with filesystems inside 2GB+ files) was
    broken in several programs.
  * Switch to debhelper v3 to get ldconfig automatically handled
    (lintian reported that it was broken).  Now call dh_makeshlibs, but
    still override its generated shlibs file with ours, to get compiled
    packages depend of the correct virtual packages, which include
    full sonames.
  * Removed call do dh_installman (Closes: #115526).
  * Cleaned up maintainer scripts with dead code - most things are now
    more properly handled by debhelper.  Removed an "exit 0" lurking in
    preinst - can't find a reason for it in the changelog, it was probably
    here for ages.
  * Remove obsolete maint-scripts in binary-arch, as they are provided by
    upstream.
  * Also remove upstream-shipped config.cache before configuring.  That
    shouldn't impact us, but well, that makes lintian happy :)

 -- Yann Dirson <dirson@debian.org>  Fri,  8 Feb 2002 06:12:35 +0100

e2fsprogs (1.25-1) unstable; urgency=high

  * New upstream bugfix release (Closes: #112414), targeted to woody.
  * com_err.info provided again now that it was fixed upstream.
  * Added metainfo to com_err.texinfo so that it gets indexed correctly
    (thanks lintian).  Moved @setfilename and @settitle to the top so that
    things get output as expected.
  * Added lintian overrides for -bf and -static packages.
  * Put all stamp files in debian/stampdir.

 -- Yann Dirson <dirson@debian.org>  Sat, 22 Sep 2001 16:22:47 +0200

e2fsprogs (1.24a-1) unstable; urgency=high

  * New upstream release (Closes: #109577).
  ** The only new code in there is in codepaths that
    are only visited when previously unsupported features are used, so
    they add virtually no risk.  Support for raw image files will be of
    great help to debug users' problems.  Urgency set to "high" to make
    sure this version gets released with woody.

  ** Fsck prints a warning message if now valid filesystems are passed to
    it. (Closes: #107458).
  ** Fsck -A will not try to interpret device names for filesystems which
    have a pass number is 0. (Closes: #106696).
  ** If -O none is passed to mke2fs, it will now not set the sparse_super
    feature (Closes: #108165).
  ** Tune2fs has been fixed to make sure that only error messages go to
    stderr, and normal message go to stdout (Closes: #108555).
  ** Minor man pages updates (Closes: #30833, #108174).
  ** Doc fixes (Closes: #110621).

 -- Yann Dirson <dirson@debian.org>  Tue,  4 Sep 2001 23:44:56 +0200

e2fsprogs (1.22-2) unstable; urgency=medium

  * This is only a trivial patch to stop some user confusion, and would be
    great to have in woody, hence the urgency.
  * Applied upstream patch to e2fsck to warn user when some errors were
    not corrected due to user answering "no" (Closes: #104502).

 -- Yann Dirson <dirson@debian.org>  Sat, 28 Jul 2001 23:01:49 +0200

e2fsprogs (1.22-1) unstable; urgency=low

  * Final 1.22 release:
  ** Fixes build problems on big-endian (Closes: #101686, #101798).

 -- Yann Dirson <dirson@debian.org>  Sat, 23 Jun 2001 14:03:17 +0200

e2fsprogs (1.21+1.22-WIP-0620-1) unstable; urgency=low

  * New upstream pre-release, critical for big-endian platforms
    (Closes: #101752).
  * Re-applied hurd fix again.
  * Build e2fsprogs-bf with -Os to gain more space.

 -- Yann Dirson <dirson@debian.org>  Fri, 22 Jun 2001 00:18:40 +0200

e2fsprogs (1.21-1) unstable; urgency=low

  * Final 1.21 release.
  * Re-applied hurd fix that did not came quickly enough to make it in
    1.21.
  * Fixed name of copyright file in e2fsprogs-bf.

 -- Yann Dirson <dirson@debian.org>  Wed, 20 Jun 2001 22:32:08 +0200

e2fsprogs (1.20+1.21-WIP-0614-2) unstable; urgency=low

  * Don't build PIC libs, build a reduced version of the libs instead, in
    package e2fsprogs-bf.  Made this new package conflict with e2fsprogs.
  * Compilation fix for the Hurd (Closes: #101361).

 -- Yann Dirson <dirson@debian.org>  Tue, 19 Jun 2001 23:33:25 +0200

e2fsprogs (1.20+1.21-WIP-0614-1) unstable; urgency=low

  * New upstream pre-release (Closes: #100559, #100304).
  * Fixed lib/ext2fs/Makefile.in for installation of new generated .h
    file.

 -- Yann Dirson <dirson@debian.org>  Thu, 14 Jun 2001 16:14:11 +0200

e2fsprogs (1.20+1.21-WIP-0608-1) unstable; urgency=low

  * New upstream pre-release (critical ext3 bugfix mostly).
  * Correctly use dh_installinfo.
  * Adjusted various things accordingly.

 -- Yann Dirson <dirson@debian.org>  Sat,  9 Jun 2001 00:25:51 +0200

e2fsprogs (1.20-4) unstable; urgency=low

  * Cleanup generated substvars files now that debhelper uses other
    names (may cause problems on other archs).  Build-dep on debhelper
    3.0.30 or newer to be sure it won't cause broken uploads.  Allows to
    get rid of hairy dep, but cannot build straightforwardly on potato any
    more...

 -- Yann Dirson <dirson@debian.org>  Wed,  6 Jun 2001 02:33:32 +0200

e2fsprogs (1.20-3) unstable; urgency=low

  * Create all symlinks to uuid-generate.3 (Closes: #99573).
  * Somewhat modernized debian/rules (debhelper v2, etc.).
  * Fixed libss2 copyright file.
  * Fixed e2fslibs-pic short description.

 -- Yann Dirson <dirson@debian.org>  Wed,  6 Jun 2001 01:19:19 +0200

e2fsprogs (1.20-2) unstable; urgency=low

  * Added support for building pic libs to Makefile.elf-lib.
  * New package e2fslibs-pic for boot-floppies team (Closes: #99285).
  * Use -N on dh_gencontrol instead of lots of -p.

 -- Yann Dirson <dirson@debian.org>  Thu, 31 May 2001 23:59:51 +0200

e2fsprogs (1.20-1) unstable; urgency=low

  * Final 1.20 release.
  * Added new zsh-static to the list of possible static shells recommended
    by e2fsck-static.

 -- Yann Dirson <dirson@debian.org>  Mon, 28 May 2001 21:39:06 +0200

e2fsprogs (1.19+1.20-WIP-0520-1) unstable; urgency=low

  * New upstream pre-release snapshot:
  ** Extended "fsck -t" syntax (Closes: #89483).
  ** Fix handling of devices for which fsck can't determine a physical
    spindal, causing lockup when checking LVM volumes (Closes: #98103).
  ** Fixed typo in e2fsck-static description - thanks Ted :).
  * Fixed small compilation bug in fsck.c

 -- Yann Dirson <dirson@debian.org>  Mon, 21 May 2001 20:47:10 +0200

e2fsprogs (1.19+1.20-WIP-0514-2) unstable; urgency=low

  * Tighten dependency on debhelper.

 -- Yann Dirson <dirson@debian.org>  Tue, 15 May 2001 21:38:47 +0200

e2fsprogs (1.19+1.20-WIP-0514-1) unstable; urgency=low

  * New upstream pre-release snapshot:
  ** new program: e2image.
  ** e2fsck validates file descriptor specified in -C (Closes: #55220)
  ** Fix multiple progress bar fsck bug (Closes: #65267)
  ** Add devfs support to fsck (Closes: #94159)
  ** Fix debugfs dump cmd looping on disk errors (Closes: #79163)
  ** Miscellaneous manual page clarifications (Closes: #63442, #67446,
    #87216)
  ** Compilation fixes for Hurd (Closes: #52045).
  ** New config.{guess,sub} for parisc support (Closes: #94690).
  ** Improved ext3 support
  ** tune2fs can now safely modify mounted filesystems
  * Added missing @dircategory entry to libext2fs.info (lintian)
  * Moved debugfs back from /usr/sbin/ to /sbin/ (Closes: #97035).
  * Moved e2label back to /sbin/ as well, as it is now a hard link to
    tune2fs.
  * New binary package with statically linked e2fsck, recommending a
    statically linked shell (Closes: #62611).
  * All deps against e2fsprogs itself now versionned (lintian).
  * Updated copyright file (upstream location, packaging copyright notice
    for previous maintainers and for Alcove).
  * Remove call to dh_testversion, use versionned build-dep instead
    (lintian).
  * Support for DEB_BUILD_OPTIONS debug/nostrip for policy 3.2
    compliance.
  * Use dh_shlibdeps -l instead of setting LD_LIBRARY_PATH explicitely -
    necessary for new versions of fakeroot, and requires debhelper 3.0.23
    for a fix.  Well finally 3.0.23 is buggy, leave this for later.
  * Avoid to call ldconfig at "make install" time, too costly.
  * Get rid in control files of references to never-released standalone
    lib files (split attempted in 1997/98).
  * Bumped Standards-Version to 3.5.4.

 -- Yann Dirson <dirson@debian.org>  Tue, 15 May 2001 14:28:39 +0200

e2fsprogs (1.19-4) unstable; urgency=medium

  * Added texinfo to build-deps (Closes: #87685).

 -- Yann Dirson <dirson@debian.org>  Tue,  3 Apr 2001 09:03:13 +0200

e2fsprogs (1.19-3) unstable; urgency=low

  * Drop findsuper binary, and suggest gpart (Closes: #74034).
  * Drop flushb and extend at upstream request (Closes: #39506).
  * Applied upstream fix for chattr on large files (Closes: #72690).
  * Applied clarification patch to tune2fs.8 (Closes: #67446).
  * Applied typo patch to compile_et.1 (Closes: #63786).
  * Include <sys/mount.h> in e2fsck/journal.c (Closes: #71775).
  * Suggest parted.

 -- Yann Dirson <dirson@debian.org>  Mon,  4 Dec 2000 22:08:06 +0100

e2fsprogs (1.19-2) unstable; urgency=low

  * Clarified libuuid copyright to LGPL-2, excluding LGPL-2.1.
  * Added build-dependency on debhelper (Closes: #67532).
  * Don't paralelize fsck runs on same drive for hd[efgh] (Closes:
    #59103).
  * Upload pristine source, -1 was erroneously uploaded as a
    debian-specific package.

 -- Yann Dirson <dirson@debian.org>  Thu,  3 Aug 2000 00:30:49 +0200

e2fsprogs (1.19-1) unstable; urgency=low

  * New upstream release:
  ** new program: resize2fs.
  ** ext3 support.
  ** NLS support (non-default, activated).
  ** Compression support (non-default, activated).
  ** Progress bar nice to serial console (Closes: #66079)
  ** Ensure filetype feature is turned off for Hurd filesystems (Closes:
    #61863)
  * Updated main copyright file for a number of things.
  * Fixed NLS support for flushb and extend.
  * Started to add build-depends.
  * Include new e2p header.

 -- Yann Dirson <dirson@debian.org>  Wed, 19 Jul 2000 01:55:27 +0200

e2fsprogs (1.18-3) frozen unstable; urgency=medium

  * Fix Y2K display-only bug in debugfs - "ls -l" displayed raw tm_year,
    causing 2000 to be displayed as "100" (Closes: #57135).  Potato should
    be y2k-clean.
  * Remove empty dirs /usr/share/et/ and /usr/share/ss/ from package
    e2fsprogs (Closes: #52900).

 -- Yann Dirson <dirson@debian.org>  Mon, 21 Feb 2000 23:06:47 +0100

e2fsprogs (1.18-2) unstable; urgency=low

  * Test for "__sparc__" instead of "sparc" as a cpp macro in mke2fs.c
    (tests in other places are correct) (Closes: #50012).

 -- Yann Dirson <dirson@debian.org>  Fri, 12 Nov 1999 21:40:27 +0100

e2fsprogs (1.18-1) unstable; urgency=low

  * New upstream (bugfix) release.

 -- Yann Dirson <dirson@debian.org>  Fri, 12 Nov 1999 17:27:20 +0100

e2fsprogs (1.17-2) unstable; urgency=low

  * Applied upstream patch to fix segfault (Closes: #49535).

 -- Yann Dirson <dirson@debian.org>  Tue,  9 Nov 1999 22:14:53 +0100

e2fsprogs (1.17-1) unstable; urgency=low

  * New upstream (bugfix) release.

 -- Yann Dirson <dirson@debian.org>  Wed, 27 Oct 1999 23:46:39 +0200

e2fsprogs (1.16-2) unstable; urgency=low

  * Fixed build of a link list in fsck.c (Closes: #48312).

 -- Yann Dirson <dirson@debian.org>  Tue, 26 Oct 1999 01:17:36 +0200

e2fsprogs (1.16-1) unstable; urgency=low

  * New upstream release.
  * Re-applied Hurd patches that did not seem to have been received
    upstream.

 -- Yann Dirson <dirson@debian.org>  Sun, 24 Oct 1999 16:11:59 +0200

e2fsprogs (1.15-3) unstable; urgency=low

  * Fixed minor typo for the Hurd.
  * Fixed various Hurd defines to __GNU__ (Closes: #44407).
  * Switched doc/ and info/ to FHS.
  * Cleaned up debian/rules to use new debhelper features.
  * Bounced Standards-Version to 3.0.1.
  * Do not install buggy com_err.info, shipped as HTML.
  * Removed partinfo from the package, following the wish of upstream
    author, because of duplicate functionality with "fdisk -l" (Closes:
    #42139).

 -- Yann Dirson <dirson@debian.org>  Mon, 20 Sep 1999 23:04:06 +0200

e2fsprogs (1.15-2) unstable; urgency=medium

  * Changed build directory do debian/BUILD/ - related cleanups in
    debian/rules.
  * Fixed partinfo.c to have it compiled, and fixed display of partition
    device in error messages.
  * Added /usr/sbin/partinfo to the package (Closes: #42139).
  * Added note about uuidgen(1) in README.Debian.
  * Documented in manpage that default mke2fs behaviour is now -r1 -s1
    (Closes: #44478).
  * Documented in mke2fs.8 that -r1 forces -s1, thus ignoring -s0.
  * Added warning message when -s0 is ignored because of -r1.
  * Documented -n option of mke2fs.
  * Fixed display buglet causing trailing commas in list of superblock
    backups when sparse flag is on and last group has no superblock
    backup.
  * Closes: #42434, #43134.

 -- Yann Dirson <dirson@debian.org>  Wed,  8 Sep 1999 00:46:38 +0200

e2fsprogs (1.15-1) unstable; urgency=low

  * New upstream release (Closes: Bug#41763).
  * All changes to upstream files in 1.14-3 were integrated upstream.
  * Separated libuuid-dev from e2fslibs-dev because it now has manpages.
  * Fixed debian/rules for POSIX "rmdir -p"
  * Corrected the location of the GPL in copyright file.
  * Moved the manpages to /usr/share/.
  * Bumped Standards-Version to 3.0.0.

 -- Yann Dirson <dirson@debian.org>  Fri, 23 Jul 1999 01:37:51 +0200

e2fsprogs (1.14-3) unstable; urgency=low

  * Fail with error message when /dev/null cannot be opened (Fixes:
    Bug#35595).
  * Fixed typo in e2fsck/unix.c (Fixes: Bug#36960).
  * Added "emeregency help" options summary to e2fsck (Fixes: Bug#11372).
  * Prepared debian/rules for usr/share/man/.

 -- Yann Dirson <dirson@debian.org>  Tue,  1 Jun 1999 23:37:12 +0200

e2fsprogs (1.14-2) unstable; urgency=low

  * Fixed fsck(1) not to coredump when it does not find its argument in
    /etc/fstab (Fixes: Bug#33533, Bug#34320, part of Bug#34131).
  * Fixed spelling of upstream author's name.
  * Cleaned debian/*.files up.
  * Undid the <linux/types.h> changes.
  * Changed "rmdir -p" invocations in debian/rules into "-rmdir -p" to
    turn around changed behaviour in fileutils_4.0.

 -- Yann Dirson <dirson@debian.org>  Fri, 12 Mar 1999 23:50:47 +0100

e2fsprogs (1.14-1) unstable; urgency=low

  * New upstream release (Fixes: Bug#33113).
  * All patches we used for 1.12 are obsoleted by 1.14.
  * Still have to install com_err.info from debian/rules though.
  * Incorporated patches from Gordon Matzigkeit for hurd cross-compilation:
  * - configure.in: Change cross-compile default for sizeof (long
      long) to 8, so that __s64 and __u64 get defined in ext2fs.h.
      (BUILD_CC): Discover a native compiler if we are cross-compling
      (used for util/subst).
    - Include linux/types.h instead of asm/types.h, so that
      non-Linux platforms use the stubbed version provided with this
      package.
    - misc/Makefile.in (findsuper): Add a rule so that findsuper gets built
      with the right compiler flags.
    - etc.

 -- Yann Dirson <dirson@debian.org>  Wed, 10 Feb 1999 23:23:03 +0100

e2fsprogs (1.12-4) frozen unstable; urgency=low

  * Ship flushb(8) and extend(8) were missing in all 1.12 packages
    (Fixes: Bug#28771).
  * Add extend.8 link to undocumented.7.
  * Replaced my (ad-hoc) fix for Bug#25684 with (really better) one
    from upstream.

 -- Yann Dirson <dirson@debian.org>  Mon,  2 Nov 1998 20:53:28 +0100

e2fsprogs (1.12-3) frozen unstable; urgency=low

  * Fixed <ext2fs/ext2fs.h> to use angle brackets instead of double
    quotes when including files from /usr/include/.
  * Made e2fslibs-dev depend on comerr-dev (Fixes: Bug#26282,
    Bug#27497).
  * Fixed mke2fs' display with inode numbers > 9999 (Fixes: Bug#25684).
  * Use -D__NO_STRING_INLINES on powerpc to allow building the boot
    blocks in QUIK, the powermac boot loader - reported by Matt
    McLean.
  * Removed unsupported info and texi entries from docbase files.

 -- Yann Dirson <dirson@debian.org>  Mon, 19 Oct 1998 23:32:41 +0200

e2fsprogs (1.12-2.1) unstable; urgency=low

  * Non-maintainer upload
    config.guess and config.sub files modified, to recognize a Arm
    architecture.

 -- Turbo Fredriksson <turbo@debian.org>  Thu, 13 Aug 1998 19:15:56 -0400

e2fsprogs (1.12-2) unstable; urgency=low

  * Really install e2label.8 manpage.
  * Removed path from ldconfig invocation, obeying packaging manual.
  * Improved the subst.c patch (thanks to Peter Moulder).

 -- Yann Dirson <dirson@debian.org>  Thu, 14 Jul 1998 14:10:06 +0200

e2fsprogs (1.12-1) unstable; urgency=low

  * New upstream release - at last out of alpha status !
  * Removed some obsolete files from debian/attic.
  * Patched util/subst.c to expand env variables, and MCONFIG.in to
    have ${prefix} exported to the `subst' process, so that we get
    correct paths in mk_cmds and compile_et.  Forwarded upstream.
  * Debian-specific /usr/share/comerr/ renamed to /usr/share/et/, now
    installed upstream.
  * Removed -isp from dh_gencontrol invocation - now the default.
  * Passed lintian 0.5.0.

 -- Yann Dirson <dirson@debian.org>  Fri, 10 Jul 1998 22:49:18 +0200

e2fsprogs (1.10-17) frozen unstable; urgency=low

  * Commented out obsolete code in fsck.c that assumed fstab entries
    declared `noauto' should not be checked - successfully forwarded
    upstream (Fixes: Bug#17244).

 -- Yann Dirson <dirson@debian.org>  Fri, 15 May 1998 01:14:54 +0200

e2fsprogs (1.10-16) frozen unstable; urgency=low

  * Changed <linux/types.h> to <asm/types.h> in lib/uuid/uuidP.h to
    allow compilation with glibc 2.0.7pre1 (Fixes: Bug#22039).
  * Use "build-stamp" as a stamp file instead of "build".
  * Restored "Provides: e2fslibsg" in order to allow upgrade from
    unstable hamm.  Documented in README.Debian so that it does not
    get removed again (Fixes: Bug#22019).

 -- Yann Dirson <dirson@debian.org>  Mon,  4 May 1998 21:11:38 +0200

e2fsprogs (1.10-15) frozen unstable; urgency=low

  * Added call to ldconfig in e2fsprogs.postinst.
  * Fixes checks for install-docs in postinst/prerm (Fixes: Bug#20303,
    Bug#20304, Bug#20590).
  * Removed e2fslibsg from what e2fsprogs provides (was just forgotten).
  * Passed lintian 0.4.2.

 -- Yann Dirson <dirson@debian.org>  Sun, 26 Apr 1998 22:27:11 +0200

e2fsprogs (1.10-14) frozen unstable; urgency=low

  * Fixed checks for install-docs to use -x.
  * Applied patch for sparc from Juan to fsck.c to compile with glibc
    2.1 (Fixes: Bug#20841).

 -- Yann Dirson <dirson@debian.org>  Tue, 14 Apr 1998 17:12:19 +0200

e2fsprogs (1.10-13) frozen unstable; urgency=low

  * test for /usr/sbin/install-docs before trying to run it in
    postinst and prerm (Fixes: Bug#19461, Bug#19469, Bug#19949,
    Bug#20006).
  * comerrg-dev now suggests doc-base.
  * moved binary packages ss2g, comerr2g and e2fslibsg back into
    binary package e2fsprogs.
  * use new virtual packages libcomerr2, libss2, libext2fs2, libe2p2,
    libuuid1 in shlibs and dependencies.
  * Changed e2fsprogs dependency on libs to a Pre-Depends (Fixes:
    Bug#18221).
  * Not conflicting with old ss2g and comerr2g - these will have to be
    removed by hand.
  * Turned around dpkg's bug #17624 in e2fsprogs.preinst.
  * Updated README.Debian to explain the new package architecture.
  * Passed lintian 0.3.4.

 -- Yann Dirson <dirson@debian.org>  Fri, 20 Mar 1998 13:03:11 +0100

e2fsprogs (1.10-12) unstable; urgency=low

  * Corrected doc menu entries to point to the real documents' places.
  * Fixed mk_cmds to really find its support scripts (Fixes: Bug#18779).
  * Made mk_cmds and compile_et use "sh -e".
  * Have missing file /usr/include/ss/ss_err.h installed (Fixes: Bug#18778).
  * Corrected typo in Description (Fixes: Bug#18890).
  * Fixed descriptions for ss* packages, thanks to Greg Stark (Fixes:
    Bug#18373, Bug#18447).
  * Added description of e2p and uuid libs in e2fslibsg-dev description.
  * Included texinfo sources.
  * Added doc-base support - suppressed direct menu/dwww support.
  * Complies with standards version 2.4.0.0.
  * Passed lintian 0.3.0:
  *  removed .du control file.
  *  updated FSF address.
  *  fixed in *.files nasty ldconfig-symlink-before-shlib-in-deb's.
  *  turned relative links from /usr/lib into /lib into absolute ones.

 -- Yann Dirson <dirson@debian.org>  Sun,  8 Mar 1998 19:42:58 +0100

e2fsprogs (1.10-11) unstable; urgency=low

  * Switched to debhelper (Fixes:Bug#16307).
  * Updated standards to 2.3.0.1
  * Changed maintainer's mail address.
  * Added conflicts with old versions of dump and quota.
  * Added html-converted texi docs for libs, with menu(dwww) support.
  * Added findsuper.8 link to undocumented.
  * Changed version number of lib packages to reflect the lib versions.
  * Moved libss into its own packages; added mk_cmds script and
    support files for libss development (Fixes:Bug#17233).
  * Added README.Debian file documenting all those dependency stuff.
  * Included example error tables from libext2fs and libss in
    comerr-dev.
  * Included example command tables from debugfs in ss-dev.
  * Added section/priority files in packages (-isp).
  * Changed names/relations for doc dirs to comply with policy.
  * Removed call to ldconfig from e2fsprogs.postinst.

 -- Yann Dirson <dirson@debian.org>  Thu, 29 Jan 1998 18:10:03 +0100

e2fsprogs (1.10-10) unstable; urgency=low

  * Added patch from Michael Alan Dorman for compilation on alpha-Linux
    (Closes:Bug#15596).
  * Added '-fsigned-char' to COPTS to allow compilation on ppc-Linux
    (Closes:Bug#15976).
  * Suppressed Essential flag on libs, as well as useless Replaces
    (Closes: Bug#16480).
  * Suppressed reference to obsolete package `e2fsprogsg' in control
    info, but Conflicts for security (Closes:Bug#16791).

 -- Yann Dirson <dirson@univ-mlv.fr>  Wed,  7 Jan 1998 22:35:08 +0100

e2fsprogs (1.10-9) unstable; urgency=low

  * Fixed comerr2g.shlibs to reflect package-name change.
  * Fixed problem with ss include files being removed from /usr on make
    install (indeed fixed in 1.10-8).
  * Added changelog file to comerr2g package (indeed fixed in 1.10-8).
  * Corrected link from flushb.8 to undocumented (Closes:Bug#15335,Bug#15660,Bug#15675).
  * Added /sbin/findsuper (Closes:Bug#15224).
  * Fixed /usr/bin/compile_et script (Closes:Bug#15487).
  * Included awk scripts in /usr/share/comerr, for use by compile_et.
  * Changed back the name from "e2fsprogsg" to "e2fsprogs" to get better
    dependencies.
  * Strip libraries (Closes:Bug#15667).

 -- Yann Dirson <dirson@univ-mlv.fr>  Tue,  9 Dec 1997 22:52:42 +0100

e2fsprogs (1.10-8) unstable; urgency=low

  * Added latest patch from Ted for autodetection of llseek() proto.
  * Switched to libc6, without libc5 compatibility (yet ?).
  * Turned Pre-Depends into Depends to allow installation. Dirty
    though. But what were Pre-Depends for anyway ?

 -- Yann Dirson <dirson@univ-mlv.fr>  Sun, 23 Nov 1997 23:03:02 +0100

e2fsprogs (1.10-7) unstable; urgency=HIGH

  * Turned "#if (__GLIBC__ == 2)" into "#if 1" to turn around missing llseek()
    prototype in libc_5.4.33-5 as well as libc6.

 -- Yann Dirson <dirson@univ-mlv.fr>  Tue, 21 Oct 1997 12:53:27 +0200

e2fsprogs (1.10-6) unstable; urgency=low

  * Official libc6 patches from Ted.
  * Converted to debstd - let it do the stripping stuff.
  * Separated libcomerr into a standalone lib - includes full doc and tools.
  * Separated development files into e2fslibs-dev, which Provides the 4 other
    -dev packages.
  * Now Provides the 4 other lib packages, to make it possible not to depend
    upon e2fsprogs itself. These libs WILL be taken out of "progs" in the
    next release.

 -- Yann Dirson <dirson@univ-mlv.fr>  Wed, 24 Sep 1997 10:46:00 +0200

e2fsprogs (1.10-5.1) experimental; urgency=low

  * Applied patch from Ted for libc6 compatibility, for test purpose.

 -- Yann Dirson <dirson@univ-mlv.fr>  Thu, 11 Sep 1997 09:09:42 +0200

e2fsprogs (1.10-5) unstable; urgency=medium

  * Switched back to libc5 because of possible bug in libc6-2.0.4-provided
    llseek() causing problem with partitions > 2Gb.
  * Switched back to libc-provided llseek().

 -- Yann Dirson <dirson@univ-mlv.fr>  Tue,  5 Aug 1997 16:54:40 +0200

e2fsprogs (1.10-4.1) unstable; urgency=low

  * Make use of shipped llseek instead of glibc's which seems buggy
    [unreleased - could not compile due to possible gcc bug].
  * Corrected compiler-options handling in debian/rules (use CCOPTS instead
    of CFLAGS which is messed with in configure.in).

 -- Yann Dirson <dirson@univ-mlv.fr>  Mon, 28 Jul 1997 19:47:02 +0200

e2fsprogs (1.10-4) unstable; urgency=low

  * Switched to libc6.
  * Added calls to update-info in postins/prerm.
  * Misc changes to debian/rules; some cleanup in Makefiles.

 -- Yann Dirson <dirson@univ-mlv.fr>  Thu, 10 Jul 1997 19:42:54 +0200

e2fsprogs (1.10-3) stable unstable; urgency=low

  * New maintainer (closed many obsolete bug-reports).
  * updated "copyright" to show new location on tsx-11.
  * started debian/rules cleanup, towards new policy conformance.
  * Added flushb.8 link to undocumented.7 (bug #8644).
  * Added {fsck,mkfs}.ext2.8 links to existing manpages (bugs #5598,
    #6286).

 -- Yann Dirson <dirson@univ-mlv.fr>  Wed, 25 Jun 1997 14:59:58 +0200

e2fsprogs (1.10-2) frozen unstable; urgency=low

  * Add 'ldconfig' to postinst (should fix #9020).
  * Define HAVE_NETINET_IN_H on alpha/glibc.

 -- Klee Dienes <klee@debian.org>  Tue, 29 Apr 1997 17:24:12 -0400

e2fsprogs (1.10-1) frozen unstable; urgency=medium

  * Upstream bug-fix release.

 -- Klee Dienes <klee@debian.org>  Thu, 24 Apr 1997 14:54:12 -0400

e2fsprogs (1.09-1) frozen; urgency=medium

  * Upstream bug-fix release.

 -- Klee Dienes <klee@debian.org>  Thu, 24 Apr 1997 14:54:12 -0400

e2fsprogs (1.06-4) unstable; urgency=low

  * Added empty entries to shlibs.local, to neatly solve the pre-depends
    problem, as suggested by Ian Jackson.

 -- Michael Nonweiler <mrn20@cam.ac.uk>  Wed, 13 Nov 1996 08:13:28 +0000

e2fsprogs (1.06-3) unstable; urgency=low

  * Hard coded Pre-Depends line, as a temporary fix for the pre-depends
    contains e2fsprogs problem.

 -- Michael Nonweiler <mrn20@cam.ac.uk>  Sat, 9 Nov 1996 12:57:44 +0000

e2fsprogs (1.06-2) unstable; urgency=low

  * New packaging format
  * Fixes packaging bugs -
      Files in /lib are now stripped of all unneeded symbols (Bug#5121)
      Calls to ldconfig in maintainer scripts have been removed (Bug#4247)

 -- Michael Nonweiler <mrn20@cam.ac.uk>  Tue, 5 Nov 1996 21:14:54 +0000

e2fsprogs (1.01-1) unstable; urgency=low

  * upgraded to latest upstream version, to 1.06 from 1.05
  * upgraded to latest upstream version, to 1.05 from 1.04
  * gzip manpages
  * minor changes to debian.rules

 -- Michael Meskes <meskes@debian.org>  Fri, 18 Oct 1996 00:00:00 +0000

e2fsprogs (1.04-1) unstable; urgency=low

   * upgraded to latest upstream version, to 1.04 from 1.02
   * another tidy-up of debian.rules
   * section and priority added to debian.control, since this is an
     essential base package.

 -- Michael Nonweiler <mrn20@cam.ac.uk>  Sun, 23 Jun 1996 00:00:00 +0000

e2fsprogs (1.02-1) unstable; urgency=low

  * upgraded to latest upstream version, to 1.02 from 1.01
  * copied "configure" usr_prefix change (see below), into configure.in
  * updated debian.control file, added Pre-Depends field
    created preinst script to check dpkg --assert-predepends
    tidyed and fixed debian.rules
  * set e2fsck to link shared, as suggested by Bruce Perens in Bug#2332
  * corrected problem in e2fsck error message, Bug#2534
  * added Architecture field
  * very minor correction to expected output of a build time test

 -- Michael Nonweiler <mrn20@cam.ac.uk>  Tue, 5 Mar 1996 00:00:00 +0000

e2fsprogs (1.01-1) unstable; urgency=low

  * removed debugging symbols from libs and enabled more optimization
    as suggested by Rolf Rossius
  * also removed the /var/catman pages
  * changed to elf compilation

 -- Andrew D. Fernandes <adfernan@cnd.mcgill.ca>  Mon, 20 Nov 1995 00:00:00 +0000

e2fsprogs (0.5b-2) unstable; urgency=low

  * Upgraded to latest version, to 1.01 from 0.5b.
  * changed the installation groups from bin to root in MCONFIG.in
  * changed configure to set usr_prefix="\${prefix}/usr"
  * moved the cat pages to /var/catman in MCONFIG.in

 -- Andrew D. Fernandes <adfernan@cnd.mcgill.ca>  Sat, 7 Oct 1995 00:00:00 +0000

e2fsprogs (0.5b-1) unstable; urgency=low

  * Made "fsck -t <filesystem-type> <device>" work correctly. Formerly
    the -t argument was overriden by the filesystem type listed for the
    device in /etc/fstab.
  * added Debian GNU/Linux package maintenance system files

 -- Bruce Perens <Bruce@Pixar.com>  Thu, 3 Aug 1995 00:00:00 +0000
