e2fsprogs (1.43.8-2) unstable; urgency=medium

  * Update debian policy version to 4.1.3
  * Mark library packages as priority: optional
  * Simplify the debian/rules file and don't build e2fsprogs-l10n
    unnecessarily
  * Fix FTBFS on big-endian systems (Closes: #886119)
  * Add support for the build profile: noudeb
  * Add support for the build profile: pkg.e2fsprogs.no-fuse2fs
  * Add support for the build profile: pkg.e2fsprogs.no-static-e2fsck

 -- Theodore Y. Ts'o <tytso@mit.edu>  Wed, 03 Jan 2018 16:18:40 -0500

e2fsprogs (1.43.8-1) unstable; urgency=medium

  * New upstream version
  * Fix a bug where updated bitmap checks might not be written to disk.
    (Closes: #883869)
  * Add missing byte swaps for newly added fields in the superbloc
  * Fix a potential use after free bug in e2fsck when fixing a corrupted
    root node in directory hash tree.
  * Fix a bug in e2fsck where a badly/maliciously corrupted superblock
    (which is not fixed due to the -n option, for example) can cause a
    floating point exception when printing the summary statistics.
    (Closes: #879220)
  * Fix debugfs's ncheck command so that it correctly prints the inode
    number when printing an error message.
  * Fix a bug in e2freefrag where it could print an incorrect free blocks
    count on a file system with the 64-bit block number feature.
  * Update the German, Serbian, Spanish, and Ukrainian translations.
  * Fix a bug where resize2fs's free blocks sanity check could fail with a
    false positive and refuse to check a file system with the 64-bit block
    number feature.
  * Fix and clarify various man pages and documentations.  Also fixed up
    some random usage texts that were incorrect.  (Closes: #880483)
  * Add missing copyright file for the e2fsprogs-l10 package.  (Closes:
    #880207)
  * Add missing Multi-arch hints (Closes: #881408, #881590, #881591)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Mon, 01 Jan 2018 19:44:41 -0500

e2fsprogs (1.43.7-1) unstable; urgency=medium

  * New upstream version
  * Fix error handling in debugfs, fuse2fs, and tune2fs so errors while
    replaying the journal will not cause a segfault in some corner cases
  * Fix resize2fs to avoid it from either failing or corrupting the file
    system image in certain corner cases when doing an off-line resize
  * Fix many spelling mistakes in various man pages, code comments, and
    program messages.
  * Fix e2fsck and debugfs so that maliciously corrupted file systems will
    not cause buffer overflows (Closes: #873757, #878104)
  * Update German translation (Closes: #833514)
  * Update debian policy version to 4.1.1
  * Fix FTBFS caused by debhelper/10.9 and references to obsolete packages
    in the rules file (Closes: #876551)
  * Promote e2fsprogs-l10n from suggests to recommends (Closes: #873812)
  * Make e2fsprogs-l10n be arch:all (Closes: #873813)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Mon, 16 Oct 2017 01:20:54 -0400

e2fsprogs (1.43.6-1) unstable; urgency=medium

  * New upstream version
  * Break out the locale files to a separate package (e2fsprogs-l10n) to
    reduce the size of the e2fsprogs package, since it is an
    essential/required package.
  * Remove support for building uuid/blkid packages on pre-Wheezy
    distributions (which are no longer supported).
  * Remove support for pre-Multiarch versions of Debian (which are no
    longer supported).
  * Fixed the printing of quota inconsistency messages in e2fsck on 32-bit
    platforms.  Also fixed a bug which caused project quota problems to be
    labelled as group quota problems.
  * Fixed a UI problem with yes/no questions when there are fuzzy
    translation entries which caused some messages to be printed in English
    and some in the language specified by the locale.  (Closes: #856586)
  * Fix some out-of-bounds memory accesses in e2fsck caused by (usually
    maliciously) corrupted file systems.  (Closes: #871539, 871540)
  * Optimize CPU usage in e2fsck for very large, very fragmented sparse
    files.
  * Avoid creating file systems that use project quotas and 128 byte
    inodes.
  * Improve tune2fs's message when a file system needs to be checked using
    e2fsck -f before running certain complex tune2fs operations.  (Closes:
    #857336)
  * Improve e2fsck's message when the proceed_delay option in
    /etc/e2fsck.conf is enabled.  (Closes: #857336)
  * Fix an LFS bug in e2image.  (Closes: #855246)
  * Fix portability problem caused by the fact that disks are character
    mode devices systems with FreeBSD kernels.
  * Update the Czech, French, Polish, Swedish, and Vietnamese translations.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue, 29 Aug 2017 00:58:29 -0400

e2fsprogs (1.43.5-1) unstable; urgency=medium

  * New upstream version
  * Fix ext2fs_sync_device() so it returns the proper error code if the
    BLKFLSBUF ioctl fails for some reason.
  * Fix a potential crash in tune2fs when enabling project quota when the
    file system has no inodes by fixing error handling in the
    quota_write_inode() in libsupport.
  * Fix a bug in debugfs's "ls -p" handling which could cause it to print
    garbage after a file name in a directory entry.
  * Fix a number of bugs in debugfs, dumpe2fs, e2fsck, tune2fs, and
    resize2fs where a carefully/maliciously corrupted file systems (found
    by American Fuzzy Lop) could these programs to crash or hang.
    (Closes: #868489)
  * E2fsck no longer issues some harmless bitmap warnings caused by a
    corrupted file system; since those corruptions will be fixed up by
    e2fsck later, there's no point issuing these internal warnings.
  * E2fsck will now notice invalid quota inode numbers, and offer to fix
    them.
  * Fix a regression introduced in e2fsprogs 1.43 which broke mke2fs's
    hugefile creation so that they aren't contiguous.
  * Fix how backup superblocks are written in big endian systems so they
    are all correctly byte swapped.
  * Fixed tune2fs's support for enabling and disabling project quota.
  * The badblock program now properly handles languages which have
    multi-column wide character such as Chinese.  (Closes: #860926)
  * The mke2fs -U option now accepts "null", "clear", "random", or "time"
    just as tune2fs's -U option.
  * Fix e2fsck's -E bmap2extent feature (which converts a file to use
    extents from indirect block maps) so that it handles sparse files
    correctly.
  * Fix libext2fs to correctly handle accounting for an external xattr
    block on bigalloc file systems.
  * Fix e2fsck to correctly handle quota accounting when deleting files
    that have multiply-claimed blocks pass 1b.
  * Fix potential buffer overrun bug in e2fsck when using 128 byte inodes.
  * E2fsck's extent tree optimization can now be disabled via an
    command-line extended option or via an e2fsck.conf configuration
    parameter.
  * The e2fsck program now properly updates the quota accounting when
    optimizing the extent tree.
  * Fix some error handling in e4crypt when operating on keyring ID's.
  * Fix e2fsck's quota handling when the bigalloc feature is enabled.
  * The libext2fs file system now uses readahead when opening file systems
    to speed up opening very large file systems with the meta_bg option.
  * If e2fsck logging is enabled, e2fsck will report the exit code in the
    last line of the log file.
  * Debugfs can now open file systems with a bad superblock checksum, and
    the show_super_stats command will print the expected checksum.
  * Fix a regression introduced in e2fsprogs 1.43.4 where tune2fs was not
    able to correctly enable the quota feature.  (Closes: #855417)
  * E2fsck will only return an exit status code of 1 if it has fixed a
    file system corruption.  If it only performed an optimal optimization
    of internal file system metadata, it will now return 0.
  * Fix e2fsck so it won't check inode fields of deleted inodes.
  * Removed a debugging printf in libsupport which could result to some
    extraneous and confusing output if the user specifies a quota type.
  * The debugfs logdump command now accepts a new -S option which will
    cause it to print information about the journal superblock.
  * Added a missing space in debugfs's ls -l output to separate the size
    and date fields.
  * Update the Czech, Danish, Dutch, French, Hungarian, Polish, Serbian,
    Spanish, Swedish, Ukrainian, and Vietnamese translations. (Closes: #862482)
  * Update various man pages.  (Closes: #867895, #865584)
  * Fix various compiler and UBSAN warnings.
  * Remove obsolete Conflict/Replaces headers in control file (Closes: #866623)
  * Remove obsolete mips libraries used to build arcboot (Closes: #864144)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Fri, 04 Aug 2017 01:13:34 -0400

e2fsprogs (1.43.4-2) unstable; urgency=medium

  * Re-enable metadata_csum for Debian (which was accidentally disabled
    for 1.43.4-1)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue, 31 Jan 2017 19:54:55 -0500

e2fsprogs (1.43.4-1) unstable; urgency=medium

  * New upstream version
  * Fix e2fsck to require that the system.data extended attribute is
    always present even for files smaller than 60 bytes, to be
    consistent with the kernel
  * Drop the hard links for mkfs.ext4dev and fsck.ext4dev
  * Clarify/update various man pages (Closes: #852726)
  * Clarify the default for the "proceed?" question printed by mke2fs
    and tune2fs.  (Closes: #852727)
  * Fix various Coverity warnings and other memory leaks in fuse2fs and
    extended attribute manipulation functions.
  * Add Finnish and Malay translations
  * Update Chinese, Czech, Polish, Serbian, and Spanish translations
    (Closes: #774379)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue, 31 Jan 2017 17:31:52 -0500

e2fsprogs (1.43.4~WIP.2017.01.30-1) unstable; urgency=medium

  * Fix a bug which was causing mke2fs -d and fuse2fs to improperly
    handle Posix ACL's.
  * Fix a bug which could cause mke2fs -d to fail if there is an
    zero-length file in source directory tree.
  * Debugfs will now display project quota information.
  * Debugfs has a more friendly and powerful to print and set extended
    attributes.
  * Fix a bug in mke2fs where I/O errors weren't getting properly
    reported to the user.
  * Fix a bug in resize2fs when operating on very large file systems
    which have a block size different from the VM page size.
  * If the reported device size is absurdly large, mke2fs will now
    report an error instead looping forever or crashing.
  * Replace a test file in the sources with an updated version which has
    a DFSG-compliant copyright license.  This was making lawyers
    nervous, even though the file was only used in regression tests and
    was never used when building any binaries.   (Closes: #840733)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Mon, 30 Jan 2017 22:14:07 -0500

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 metadata 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 migrate 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: Hungarian 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/efficient 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, Swedish, 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 module 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 the command 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 Esperanto and Ukrainian translations, and update Czech, Dutch,
    French, German, Italian, Polish, Swedish, 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 during 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, Swedish, 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 will 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, Swedish, 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, Swedish, 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 Swedish, 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 Swedish, 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 segfault 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 device attributes obtained from sysfs.
   * Mke2fs now displays a progress report during the discard process.
   * Mke2fs now handles extreme file system parameters correctly which
       previously caused the inodes per group to drop below 8, leading
       to a segfault.
   * 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 inodes 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 when it 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 overrides 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 packages 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 uninitialized 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 Swedish 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 apostrophe'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 filesystems
      (Closes: #535530)
  * Update French, Polish, Czech, Indonesian, and Swedish 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
    uninitialized 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 program 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 fields 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, Swedish,
       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 features 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, Swedish, 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, Swedish, 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, Swedish, 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 filesystem 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, Swedish, 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 compatibility 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 corrupt
      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 cause bid_type to be corrupted
  * mke2fs: Add sanity 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 accepts integer values
  * Fix e2fsck's pass1c accounting so it doesn't terminate too early
      if a file with multiply claimed blocks is hard linked. or not at
      all if the root directory contains shared blocks
  * Enhance debugfs so it can modify the block group descriptors using
      the command set_block_group_descriptor
  * Improve e2fsck's reporting of I/O errors so it's clearer what it
      was trying to do when an error happens
  * Fix a bug in 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.
  * Improve 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 Coverity 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 platforms.
  * Fix mklost+ound so that it creates a full-sized directory on 4k and
    larger block sizes.
  * Add mke2fs.conf configuration file to configure 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 Swedish 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
    simultaneous 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 filesystem'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 circumstances
    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 during 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_* environment variables 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 coherency 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 newly 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 corresponds 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 overridden 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 check 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 dependency.
    (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, megabytes, 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 section 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 readline 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 unmounted 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 no one
    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 adaption 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 maintenance 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 noticeable 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 versioned (lintian).
  * Updated copyright file (upstream location, packaging copyright notice
    for previous maintainers and for Alcove).
  * Remove call to dh_testversion, use versioned 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 explicitly -
    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 parallelize 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 "emergency 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-compiling
      (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
    tidied 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 overridden 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
