e2fsprogs (1.45.4-1) unstable; urgency=medium

  * New upstream feature
  * Fix CVE-2019-5094: A maliciously corrupted file systems can trigger
    buffer overruns in the quota code used by e2fsck.
  * E2fsck will now check to make sure the casefold flag is only set on
    directories, and only when the casefold feature is enabled.
  * E2fsck will not disable the low dtime checks when using a backup
    superblock where the last mount time is zero to fix a failure in
    xfstests ext4/007
  * Fix e2fsck so that when it needs to recreate the root directory, the
    quota counts are correctly updated
  * Update the man pages to document the new fsverity feature, and improve
    the documentation for the casefold and encrypt features
  * Allow e2scrub_all to work when the VG free space is exactly the
    snapshot size (Closes: #935009)
  * Avoid spurious lvm warnings when e2scrub_all is run out of cron on
    non-systemd systems (Closes: #940240)
  * Update the Dutch, German, Malay, Spanish, and Vietnamese translations

 -- Theodore Y. Ts'o <tytso@mit.edu>  Mon, 23 Sep 2019 15:31:27 -0400

e2fsprogs (1.45.3-4) unstable; urgency=medium

  * stop using Link Time Optimization; it breaks reproducible builds
  * skip "make check" if DEB_BUILD_OPTIONS contains nocheck; this is
    needed for some ports builds to complete successfully (Closes: #933247)
  * fix e2fsprogs build problems on non-Linux ports

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue, 06 Aug 2019 15:22:30 -0400

e2fsprogs (1.45.3-3) unstable; urgency=medium

  * Fix Breaks/Replace dependency for logsave (Closes: #932874)
  * Mark logsave as Multi-Arch: foreign (Closes: #932876)
  * Fix test bug on the x32 architecture (Closes: #932906)
  * Fix FTBFS problem on FreeBSD and Hurd since they don't have systemd
  * Fix blhc problem when running "make check"

 -- Theodore Y. Ts'o <tytso@mit.edu>  Thu, 25 Jul 2019 15:35:01 -0400

e2fsprogs (1.45.3-2) unstable; urgency=medium

  * Add a hard dependency on logsave to e2fsprogs to fix initramfs issues
    (Closes: #932855, #932859, #932861, #932881, #932888)
  * Add check in e2scrub_all.cron so that it doesn't fail if the package
    is removed, since e2scrub_all.cron is marked as a config file.
    (Closes: #932622)
  * Update the Debian policy compliance to 4.4.0
  * Update Czech, French, German, Polish, Portuguese, Swedish, and
    Ukrainian translations

 -- Theodore Y. Ts'o <tytso@mit.edu>  Wed, 24 Jul 2019 12:56:52 -0400

e2fsprogs (1.45.3-1) unstable; urgency=medium

  * New upstream version
  * Automatic online file system scrubs is now disabled by default.
    They can be enabled by editing /etc/e2scrub.conf.
  * fuse2fs is now installed in /usr/bin instead of /usr/sbin
  * Fix fuse2fs compatibility with fuse3; but specifying the
    nonempty option may be necessary if fusermount with fuse v2 is in use.
    See NEWS.gz for more details.
  * Fixed e2fsck support of file systems using large_dir and inline
    directories at the same time.
  * Fixed a bug in e2scrub_all so it correctly handles an LUKS volume
    stacked on top of an LV.  (Closes: #931387)
  * Fixed a bug in e2scrub_all so it correctl specifies the volumes to
    clean up when using "e2scrub_all -r".   (Closes: #931679)
  * Fixed improper use of positional markers in the Czech, Dutch,
    German, and Vietnamese translations.  (Closes: #892173)
  * Remove ancient special-case CFLAGS for Alpha and Powermac platforms
  * Drop packaging support for Debian Jessie
  * Use the same build tree for the e2fsprogs udeb package
  * Restructure rules file to use dh
  * Only require the udev, systemd, and cron build dependencies when
    building on Linux. (Closes: #931266)
  * Move logsave to its own package.  (Closes: #923372)
  * Update the Czech and Dutch translations

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun, 14 Jul 2019 21:01:11 -0400

e2fsprogs (1.45.2-1) unstable; urgency=medium

  * New upstream version
  * When mke2fs asks the user if she should proceed, fall back to the
    English 'y' or 'Y' characters since there could be a missing
    translation prompting the use of the English 'y' character.
    (Closes: #907034)
  * Fix spurious complaint of blocks beyond i_size for verity files.
  * Update the Czech, Malay, Polish, Spanish, Swedish, and Ukarainian
    translations.  Add the new Portuguese translation.  (Closes: #912185)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Mon, 27 May 2019 21:46:31 -0400

e2fsprogs (1.45.1-3) unstable; urgency=medium

  * Fix e2scrub_all cron failures (Closes: #929287)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Mon, 20 May 2019 21:48:40 -0400

e2fsprogs (1.45.1-2) unstable; urgency=medium

  * Avoid spurious e2scrub_all error messages spamming administrators from
    cron/systemd timer units when lvm2 is not installed and/or there are
    no lvm devices present in the system (Closes: #928977, #929186, #929254)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Mon, 20 May 2019 11:02:09 -0400

e2fsprogs (1.45.1-1) unstable; urgency=medium

  * New upstream feature
  * Drop lvm2 from the recommends line (Closes: #924275)
  * Add the -n flag to the e2scrub and e2scrub_all commands
  * Teach e2scrub to issue more useful error messages
  * Update support for the case-folding file system feature to match what
    finally will be landing in the kernel.
  * Teach e2scrub_all to skip scrubing a file system if there is not
    enough free space to create a snapshot.  (Closes: #924301)
  * Fixed debugfs so it correctly prints ea_in_inode xattr values.
  * Debugfs now prints non-printing characters using C-style hex escape
    sequences.
  * E2fsck now checks the unused portions of the bitmap blocks when the
    number of blocks/inodes is less than the full blocksize to make sure
    they are properly set.
  * Fixed mke2fs's insanely large file system check, so that creating a
    900TB file system will succeed.
  * E2scrub now tags its temp snapshot volumes with UDISK_IGNORE to avoid
    them showing up in GUI's.  (Closes: #926112)
  * Mark the e2scrub systemd service files to indicate that it requires
    CAP_SYS_ADMIN and CAP_SYS_RAWIO so e2scrub will get skipped when run
    in cointainers that don't give root these capabilities.  (Closes: #926138)
  * E2fsck can now save a problem code log for debugging or monitoring
    purposes.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun, 12 May 2019 21:23:25 -0400

e2fsprogs (1.45.0-1) unstable; urgency=medium

  * New upstream feature
  * tune2fs can now set the file system error bit to force a check at the
    next fsck by using the extended option "force_fsck".
  * There is now an e2scrub script which will allow e2fsck to be run
    on mounted file systems using an LVM device.  There will be a systemd
    script to automatically run e2scrub on all ext4* file systems where it
    can be supported.
  * mke2fs will attempt avoid discarding pre-allocated blocks when
    initializing a file system on a file.
  * The fuse2fs command now supports a "fakeroot" option to allow an
    unprivileged user to fuse2fs to modify rootfs images.
  * Add initial support for the character set and case-folding file system
    feature.
  * Debugfs can now set the inode's checksum field
  * E2image now accepts the -b and -B options to allow the user to specify
    the superblock location when creating a raw or qcow2 image.
  * Update the debhelper compatibility level to 11
  * Update the Debian policy compliance to 4.3.0

 -- Theodore Y. Ts'o <tytso@mit.edu>  Wed, 06 Mar 2019 12:55:18 -0500

e2fsprogs (1.44.6-1) unstable; urgency=medium

  * New upstream version
  * Fix e4defrag overflow problem when files are being created while it is
    running (Closes: #888899)
  * Fix e2fsck so it can correctly handle directories > 2 GiB when the
    largedir feature is enabled.
  * Fix mke2fs's hugefile creation so it works correctly for certain
    unfortunately sized disks/partitions.
  * Fix the libext2fs library to be more robust against
    invalid/maliciously corrupted block group descriptors.
  * Fix mke2fs and debugfs so they can correctly copy in files > 2 GiB.
  * Fix debugfs so its stat command can correct supportly display directory
    sizes > 2 GiB.
  * Fix memory leaks in debugfs, mke2fs, and e2freefrag.
  * Avoid unnecessarily linking badblocks with the libblkid shared library.
    (Closes: #919958)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue, 05 Mar 2019 15:10:40 -0500

e2fsprogs (1.44.5-1) unstable; urgency=medium

  * New upstream version
  * Avoid overflows when tracking the number of files defragged
    by e4defrag (Closes: #888899)
  * Fix groff formatting nits in various man pages (Closes: #916188)
  * Fix location of libext2fs documentation (Closes: #915942)
  * Fix regression so we are correctly translating Posix ACL's
    in libext2fs
  * Use the online free block counts so e2freefrag's percentages
    are correct
  * Fix a false warning that tune2fs will take long time to change
    a UUID if the metadata_csum feature is not enabled
  * Fix mk_cmds so it works on a non-usrmerge system when e2fsprogs
    is built on a usrmerge system (Closes: #914087)
  * E2fsck will avoid offering to set the inline_data feature flag
    unnecessarily
  * E4defrag will handle the case where it is running as root and it can't
    find the file system to open more gracefully (Closes: #907634)
  * Fix a bug where resize2fs was failing to update the extent tree
    checksums in an corner case
  * Fix fuse2fs's command line parsing when options are specified after
    the target device/image
  * Fix a bug which could cause e2fsprogs tools to segfault on a corrupted
    file system where the journal's s_nr_users is impossibly large.
  * E2image now includes the mmp block (if needed) when creating a
    metadata-only image.
  * When e2fsck notices it could optimize an extent tree, it will now ask
    "Optimize?" instead of "Fix?", which was confusing some users since it
    implied that something was broken.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sat, 15 Dec 2018 22:46:49 -0500

e2fsprogs (1.44.4-2) unstable; urgency=medium

  * tune2fs fix dereference of freed memory after journal
  * fix verity support
  * Generate NEWS.gz for e2fsprogs's package documentation directory
  * Update Debian policy compliance to 4.2.0
  * Improve version dependency for libcom-err and ss2 for e2fsprogs

 -- Theodore Y. Ts'o <tytso@mit.edu>  Wed, 22 Aug 2018 19:30:17 -0400

e2fsprogs (1.44.4-1) unstable; urgency=medium

  * New upstream release
  * Add basic support for the ext4 verity (fsverity) feature
  * E2fsck will fix file systems that have both the resize_inode
    and meta_bg feature enabled
  * Debugfs's ncheck command will now correctly inodes that have
    multiple hard links
  * Remove kilo/kibi rant (Closes: #757831)
  * Update Danish, Spanish, and Swedish translations
  * Fix symlink to directory conversions (Closes: #905195)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sat, 18 Aug 2018 20:46:29 -0400

e2fsprogs (1.44.3-1) unstable; urgency=medium

  * New upstream release
  * Include hashmap.h in the libext2fs2 package
  * Update debian policy compliance to 4.1.5

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue, 10 Jul 2018 01:23:17 -0400

e2fsprogs (1.44.3~rc2-1) unstable; urgency=low

  * New upstream release
  * Debugfs's inode_dump and xattr_dump commands have new options to
    display the low-level contents of an inode's i_blocks and extra
    space, and to better be able to debug corrupted extended attributes.
  * The dumpe2fs command now will show information about the Multi-Mount
    Protection (MMP) block, if present
  * E2fsck, dumpe2fs, and debugfs is now much more robust at handling
    badly (or maliciously) corrupted file systems.
  * E2fsck will now offer to enable the dir_nlink feature if it is
    required by the file system
  * The project id field in the inode is now properly byte-swapped on
    big-endian systems
  * E2fsprogs better handles recent kernels which reports old error
    conditions via the first fsync() after the file is opened
  * Updated/fixed various man pages
  * Update Czech, Dutch, Spanish, French, Polish, Swedish, Ukrainian, and
    Vietnamese translations
  * Update debian policy compliance to 4.1.4

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue, 3 Jul 2018 23:31:40 -0400

e2fsprogs (1.44.2-1) unstable; urgency=medium

  * New upstream release
  * Demote e2fsprogs from Essential: yes to XB-Important: yes
    (Closes: #474540)
  * Fix mke2fs to print a more useful/correct error message if
    ext2fs_close_free() fails at the end of the file system
    creation process
  * Improve chattr's man page
  * Update Polish translation

 -- Theodore Y. Ts'o <tytso@mit.edu>  Mon, 14 May 2018 19:59:27 -0400

e2fsprogs (1.44.1-2) unstable; urgency=medium

  * Fix e2image handling of e2i files on big endian systems
  * Add sanity checks for inodes containing xattr values to prevent
    maliciously crafted file systems from causing crashes caused by
    infinite recursion
  * Fix e2fsck so that quota usage is adjusted when clearing orphaned
    inodes
  * Fix filefrag so that unknown flags returned by FIEMAP won't cause a
    buffer overrun

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue, 10 Apr 2018 11:04:36 -0400

e2fsprogs (1.44.1-1) unstable; urgency=medium

  * New upstream release
  * Fix FTBFS problem on Hurd (Closes: #893590)
  * Fix e2fsck support of HTree directories on big-endian systems
  * Fix miscellaneous e2image image handling for file systems with bigalloc
    and meta_bg features enabled.
  * Fix orphan list handling of inodes on bigalloc file systems (and other
    situations where inodes need to be deleted or truncated) in e2fsck.
  * Update Sweedish translation.
  * Add Vcs-* headers in Debian packaging (Closes: #887512)
  * Speed up reading bitmap blocks in debugfs when opening large file
    systems.
  * Add clarifications to chattr's man page.  (Closes: #890390)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sat, 24 Mar 2018 15:13:28 -0400

e2fsprogs (1.44.0-1) unstable; urgency=medium

  * New upstream release
  * Update Czech, Spanish, French, Malay, and Ukrainian translations.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Wed, 07 Mar 2018 14:39:52 -0500

e2fsprogs (1.44.0~rc2-1) experimental; urgency=medium

  * New upstream release
  * Fix FTBFS problem on Hurd
  * Improved e2fsck's consistency checking for symlink.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sun, 04 Mar 2018 15:57:21 -0500

e2fsprogs (1.44.0~rc1-1) experimental; urgency=low

  * New upstream release
  * Add support for the large_dir feature
  * Add support for the ea_data feature
  * Resize2fs will not complain about online resizes of bigalloc file
    systems
  * Debugfs's ls command will now print the high bits of the mode bits
  * Fix some corner cases with tune2fs and journal replay
  * Add support for libreadline.so.7
  * E2freefrag will now use the GETFSMAP ioctl for mounted file systems
  * E2fsck is now much faster when scanning extents on bigalloc file systems
  * Fix various compiler and UBSAN warnings

 -- Theodore Y. Ts'o <tytso@mit.edu>  Tue, 27 Feb 2018 16:56:32 -0500

e2fsprogs (1.43.9-2) unstable; urgency=medium

  * Fix upgrade when there are two installations of a library (for
    different architectures) that we are transitioning to the new package
    name.  (Closes: #890590)
  * Add support for libreadline.so.7 to libss
  * Fix tune2fs's journal recovery support
  * Fix tune2fs to require a freshly checked file system if turning off
    the metadata_csum feature and UUID has been changed.

 -- Theodore Y. Ts'o <tytso@mit.edu>  Sat, 24 Feb 2018 20:48:29 -0500

e2fsprogs (1.43.9-1) unstable; urgency=medium

  * Remove some obsolete flags and add document new flags in the chattr
    man page
  * Remove misplaced "MNP is unsupported" message from debugfs
  * Suppress false positive lintian warning about "new essential
    package" (caused by preparatory work to make the e2fsprogs
    package no longer essential)
  * Fixing missing "General" in "GNU General Public License" in
    copyright files.
  * Fix whitespace issue in the debian control file
  * Update the Hungarian translation.
  * Rename the packages e2fslibs* to libext2fs* and libcomerr2* to
    libcom-err2* to conform with the standard Debian library package
    naming conventions.  (Closes: #269569)

 -- Theodore Y. Ts'o <tytso@mit.edu>  Thu, 08 Feb 2018 13:09:49 -0500

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
