misc: fix infinite loop when finding the start of the hugefile start range

When looking for the start of the hugefile range, the 'next' variable
is incorrectly decremented.  If we happened to find a single free
block, the effect of this decrement is that blk == next, which means
that we never modify the loop control variable, so get_start_block
never returns.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
test-maint
Darrick J. Wong 2014-12-02 22:00:04 -05:00 committed by Theodore Ts'o
parent 5da8912008
commit 63b4cbb8bc
4 changed files with 80 additions and 1 deletions

View File

@ -437,7 +437,6 @@ static blk64_t get_start_block(ext2_filsys fs, blk64_t slack)
blk, last_blk, &next);
if (retval)
next = last_blk;
next--;
if (next - blk > slack) {
blk += slack;

View File

@ -0,0 +1,18 @@
tune2fs test
Creating filesystem with 786432 1k blocks and 98304 inodes
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409, 663553
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Creating 6368 huge file(s) with 117 blocks each: done
Writing superblocks and filesystem accounting information: done
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
Exit status is 0

View File

@ -0,0 +1 @@
mke2fs creating a hugefile fs with a lot of slack

View File

@ -0,0 +1,61 @@
if test -x $RESIZE2FS_EXE -a -x $DEBUGFS_EXE; then
FSCK_OPT=-fn
OUT=$test_name.log
EXP=$test_dir/expect
CONF=$TMPFILE.conf
#gzip -d < $EXP.gz > $EXP
cat > $CONF << ENDL
[fs_types]
ext4h = {
features = has_journal,extent,huge_file,uninit_bg,dir_nlink,extra_isize,sparse_super,filetype,dir_index,ext_attr,^resize_inode,^meta_bg,^flex_bg,64bit
blocksize = 1024
inode_size = 256
make_hugefiles = true
hugefiles_dir = /
hugefiles_slack = 12000K
hugefiles_name = aaaaa
hugefiles_digits = 4
hugefiles_size = 117K
zero_hugefiles = false
}
ENDL
echo "tune2fs test" > $OUT
MKE2FS_CONFIG=$CONF $MKE2FS -F -T ext4h -I 128 $TMPFILE 786432 >> $OUT 2>&1
rm -rf $CONF
# dump and check. if we get this far, we succeeded...
$FSCK $FSCK_OPT -N test_filesys $TMPFILE >> $OUT 2>&1
status=$?
echo Exit status is $status >> $OUT
rm $TMPFILE
#
# Do the verification
#
sed -f $cmd_dir/filter.sed -e "s;$TMPFILE;test.img;" -e 's/test_filesys:.*//g' < $OUT > $OUT.new
mv $OUT.new $OUT
cmp -s $OUT $EXP
status=$?
if [ "$status" = 0 ] ; then
echo "$test_name: $test_description: ok"
touch $test_name.ok
else
echo "$test_name: $test_description: failed"
diff $DIFF_OPTS $EXP $OUT > $test_name.failed
fi
unset IMAGE FSCK_OPT OUT EXP CONF
else #if test -x $RESIZE2FS_EXE -a -x $DEBUGFS_EXE; then
echo "$test_name: $test_description: skipped"
fi