From: Darrick J. Wong Date: Wed, 3 Dec 2014 03:00:04 +0000 (-0500) Subject: misc: fix infinite loop when finding the start of the hugefile start range X-Git-Tag: v1.42.13~16 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=63b4cbb8bc8602d5dfe80413005142a7b59c25ef;p=tools%2Fe2fsprogs.git 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 Signed-off-by: Theodore Ts'o --- diff --git a/misc/mk_hugefiles.c b/misc/mk_hugefiles.c index 8291f01..5f56a79 100644 --- a/misc/mk_hugefiles.c +++ b/misc/mk_hugefiles.c @@ -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; diff --git a/tests/m_hugefile_slack/expect b/tests/m_hugefile_slack/expect new file mode 100644 index 0000000..96a628a --- /dev/null +++ b/tests/m_hugefile_slack/expect @@ -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 diff --git a/tests/m_hugefile_slack/name b/tests/m_hugefile_slack/name new file mode 100644 index 0000000..8d51fd6 --- /dev/null +++ b/tests/m_hugefile_slack/name @@ -0,0 +1 @@ +mke2fs creating a hugefile fs with a lot of slack diff --git a/tests/m_hugefile_slack/script b/tests/m_hugefile_slack/script new file mode 100644 index 0000000..eecb2d7 --- /dev/null +++ b/tests/m_hugefile_slack/script @@ -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 +