Package: e2fsprogs
Version: 1.42.5-1.1
Severity: minor
Tags: patch upstream
e2freefrag report incoherent information on a large filesystem with large
chunks of contiguous free space, due to integer overflow in computing max free
extent. I did not check if it's really present upstream, but I believe it
likely.
In the following output, max free < 1G disagree with 1 extent >= 16 GB. A
minimal --- meaning that no types are changed --- patch is attached.
best regards,
g
: Device: /dev/sda6
: Blocksize: 4096 bytes
: Total blocks: 29302784
: Free blocks: 11744387 (40.1%)
:
: Min. free extent: 4 KB
: Max. free extent: 653272 KB
: Avg. free extent: 15828 KB
: Num. free extent: 3012
:
: HISTOGRAM OF FREE EXTENT SIZES:
: Extent Size Range : Free extents Free Blocks Percent
: 4K... 8K- : 333 333 0.00%
: 8K... 16K- : 206 484 0.00%
: 16K... 32K- : 258 1370 0.01%
: 32K... 64K- : 292 3283 0.03%
: 64K... 128K- : 334 7571 0.06%
: 128K... 256K- : 212 9617 0.08%
: 256K... 512K- : 214 19276 0.16%
: 512K... 1024K- : 323 58533 0.50%
: 1M... 2M- : 449 168768 1.44%
: 2M... 4M- : 287 203716 1.73%
: 4M... 8M- : 98 117878 1.00%
: 16M... 32M- : 1 7678 0.07%
: 32M... 64M- : 1 12337 0.11%
: 64M... 128M- : 1 18610 0.16%
: 8G... 16G- : 2 5884523 50.10%
: 16G... 32G- : 1 5406198 46.03%
-- System Information:
Debian Release: 7.1
APT prefers stable
APT policy: (500, 'stable')
Architecture: i386 (i686)
Kernel: Linux 3.2.0-4-686-pae (SMP w/1 CPU core)
Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968)
Shell: /bin/sh linked to /bin/dash
Versions of packages e2fsprogs depends on:
ii e2fslibs 1.42.5-1.1
ii libblkid1 2.20.1-5.3
ii libc6 2.13-38
ii libcomerr2 1.42.5-1.1
ii libss2 1.42.5-1.1
ii libuuid1 2.20.1-5.3
ii util-linux 2.20.1-5.3
e2fsprogs recommends no packages.
Versions of packages e2fsprogs suggests:
pn e2fsck-static <none>
pn gpart <none>
ii parted 2.3-12
-- no debconf information
--- misc/e2freefrag.c.orig 2013-07-28 20:09:52.000000000 +0200
+++ misc/e2freefrag.c 2013-07-28 20:10:05.000000000 +0200
@@ -172,10 +172,16 @@
/* Display chunk information in KB */
if (info->real_free_chunks) {
- info->min = (info->min * fs->blocksize) >> 10;
- info->max = (info->max * fs->blocksize) >> 10;
+ unsigned long scaled_blocksize = fs->blocksize;
+ int shift = 10;
+ if (fs->blocksize >= (1 << 10)) {
+ shift = 0;
+ scaled_blocksize = fs->blocksize >> 10;
+ }
+ info->min = (info->min * scaled_blocksize) >> shift;
+ info->max = (info->max * scaled_blocksize) >> shift;
info->avg = (info->avg / info->real_free_chunks *
- fs->blocksize) >> 10;
+ scaled_blocksize) >> shift;
} else {
info->min = 0;
}