blob: 11261e470678313b80f81910eaa0a8e9ac153d57 [file] [log] [blame]
#!/bin/bash
################################################################################
# #
# Copyright (c) 2009 FUJITSU LIMITED #
# #
# This program is free software; you can redistribute it and#or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation; either version 2 of the License, or #
# (at your option) any later version. #
# #
# This program is distributed in the hope that it will be useful, but #
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY #
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License #
# for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with this program; if not, write to the Free Software #
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA #
# #
################################################################################
export TCID="ext4-online-defrag"
export TST_TOTAL=18
. ext4_funcs.sh
# How to age filesystem
EMPTY=1
SMALL=2
LARGE=3
# Defrag what
FILE=1
DIR=2
FILESYSTEM=3
tst_test_cmds e4defrag
E4DEFRAG=`which e4defrag`
age_filesystem()
{
local dirId=
local idx=
rm -rf mnt_point/*
if [ $1 -eq $EMPTY ]; then
if [ $2 -eq $FILE -o $2 -eq $FILESYSTEM ]; then
touch mnt_point/tmp_file
echo "abc" > mnt_point/tmp_file
elif [ $2 -eq $DIR ]; then
mkdir mnt_point/tmp_dir
echo "abc" > mnt_point/tmp_dir/tmp_file
fi
elif [ $1 -eq $SMALL ]; then
dd if=/dev/zero of=mnt_point/occupy bs=1M count=40
# age filesystem from 0.0 to 0.2 -> 0.4 -> 0.6 -> 0.8 -> 1.0
for ((idx = 3; idx < 8; idx++))
{
ffsb ffsb-config$idx > /dev/null
dirId=$((idx - 3))
mv mnt_point/data mnt_point/data$dirId
}
rm mnt_point/occupy
df
else
rm -rf mnt_point/*
if [ $2 -eq $DIR ]; then
mkdir mnt_point/tmp_dir
dest=mnt_point/tmp_dir/tmp_file
else
dest=mnt_point/tmp_file
fi
bsize=`dumpe2fs -h $EXT4_DEV | grep 'Block size'`
bsize=`echo $bsize | awk '{ print $NF }'`
bcount=`dumpe2fs -h $EXT4_DEV | grep 'Free blocks'`
bcount=`echo $bcount | awk '{ print $NF }'`
bcount=$(( $bcount / 2 - 100 ))
dd if=/dev/zero of=$dest bs=$bsize count=$bcount
fi
}
my_e4defrag()
{
if [ $1 -eq $FILE ]; then
if [ $2 -eq $SMALL ]; then
$E4DEFRAG -v mnt_point/data0/
return $?
# EMPTY or LARGE
else
$E4DEFRAG -v mnt_point/tmp_file
return $?
fi
elif [ $1 -eq $DIR ]; then
if [ $2 -eq $SMALL ]; then
$E4DEFRAG -v mnt_point/data0/
return $?
else
$E4DEFRAG -v mnt_point/tmp_dir
return $?
fi
else
$E4DEFRAG -v $EXT4_DEV
return $?
fi
}
# Test online defragmentation feature
# $1: defrag type
# $2: 1 - empty, 2 - full with small files, 3 - full with large files
# $3: block size
ext4_test_online_defrag()
{
echo Test $TST_COUNT start >> ext4_online_defrag_result.txt
tst_resm TINFO "defrag type: $1, defrag obj: $2, block size: $3"
mkfs.ext4 -m 0 -b $3 -O ^flex_bg $EXT4_DEV >> ext4_online_defrag_result.txt 2>&1
if [ $? -ne 0 ]; then
tst_resm TFAIL "failed to create ext4 filesystem"
return
fi
tune2fs -O extents $EXT4_DEV >> ext4_online_defrag_result.txt 2>&1
mount -t ext4 -o nodelalloc $EXT4_DEV mnt_point
if [ $? -ne 0 ]; then
tst_resm TFAIL"failed to mount ext4 filesystem"
return
fi
age_filesystem $2 $1 >> ext4_online_defrag_result.txt 2>&1
my_e4defrag $1 $2 >> ext4_online_defrag_result.txt
if [ $? -ne 0 ]; then
tst_resm TFAIL "e4defrag returned failure"
umount mnt_point
return
fi
umount mnt_point
if [ $? -ne 0 ]; then
tst_resm TFAIL "failed to umount ext4 filesystem"
return
fi
e2fsck -p $EXT4_DEV >> ext4_online_defrag_result.txt 2>&1
if [ $? -ne 0 ]; then
tst_resm TFAIL "fsck returned failure"
return
fi
tst_resm TPASS "ext4 online defrag test pass"
}
# main
ext4_setup
tst_test_cmds ffsb
DEFRAG=( $FILE $DIR $FILESYSTEM )
AGING=( $EMPTY $SMALL $LARGE )
BLOCK_SIZE=( 1024 4096 )
for ((i = 0; i < 2; i++))
{
for ((j = 0; j < 3; j++))
{
for ((k = 0; k < 3; k++))
{
ext4_test_online_defrag ${DEFRAG[$j]} ${AGING[$k]} \
${BLOCK_SIZE[$i]}
}
}
}
tst_exit