1#!/bin/bash 2 3################################################################################ 4# # 5# Copyright (c) 2009 FUJITSU LIMITED # 6# # 7# This program is free software; you can redistribute it and#or modify # 8# it under the terms of the GNU General Public License as published by # 9# the Free Software Foundation; either version 2 of the License, or # 10# (at your option) any later version. # 11# # 12# This program is distributed in the hope that it will be useful, but # 13# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY # 14# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # 15# for more details. # 16# # 17# You should have received a copy of the GNU General Public License # 18# along with this program; if not, write to the Free Software # 19# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # 20# # 21################################################################################ 22 23export TCID="ext4-online-defrag" 24export TST_TOTAL=18 25 26. ext4_funcs.sh 27 28# How to age filesystem 29EMPTY=1 30SMALL=2 31LARGE=3 32 33# Defrag what 34FILE=1 35DIR=2 36FILESYSTEM=3 37 38tst_test_cmds e4defrag 39E4DEFRAG=`which e4defrag` 40 41age_filesystem() 42{ 43 local dirId= 44 local idx= 45 rm -rf mnt_point/* 46 if [ $1 -eq $EMPTY ]; then 47 if [ $2 -eq $FILE -o $2 -eq $FILESYSTEM ]; then 48 touch mnt_point/tmp_file 49 echo "abc" > mnt_point/tmp_file 50 elif [ $2 -eq $DIR ]; then 51 mkdir mnt_point/tmp_dir 52 echo "abc" > mnt_point/tmp_dir/tmp_file 53 fi 54 elif [ $1 -eq $SMALL ]; then 55 56 dd if=/dev/zero of=mnt_point/occupy bs=1M count=40 57 58 # age filesystem from 0.0 to 0.2 -> 0.4 -> 0.6 -> 0.8 -> 1.0 59 for ((idx = 3; idx < 8; idx++)) 60 { 61 ffsb ffsb-config$idx > /dev/null 62 dirId=$((idx - 3)) 63 mv mnt_point/data mnt_point/data$dirId 64 } 65 66 rm mnt_point/occupy 67 68 df 69 else 70 rm -rf mnt_point/* 71 if [ $2 -eq $DIR ]; then 72 mkdir mnt_point/tmp_dir 73 dest=mnt_point/tmp_dir/tmp_file 74 else 75 dest=mnt_point/tmp_file 76 fi 77 78 bsize=`dumpe2fs -h $EXT4_DEV | grep 'Block size'` 79 bsize=`echo $bsize | awk '{ print $NF }'` 80 bcount=`dumpe2fs -h $EXT4_DEV | grep 'Free blocks'` 81 bcount=`echo $bcount | awk '{ print $NF }'` 82 bcount=$(( $bcount / 2 - 100 )) 83 dd if=/dev/zero of=$dest bs=$bsize count=$bcount 84 85 fi 86} 87 88my_e4defrag() 89{ 90 if [ $1 -eq $FILE ]; then 91 if [ $2 -eq $SMALL ]; then 92 $E4DEFRAG -v mnt_point/data0/ 93 return $? 94 # EMPTY or LARGE 95 else 96 $E4DEFRAG -v mnt_point/tmp_file 97 return $? 98 fi 99 elif [ $1 -eq $DIR ]; then 100 if [ $2 -eq $SMALL ]; then 101 $E4DEFRAG -v mnt_point/data0/ 102 return $? 103 else 104 $E4DEFRAG -v mnt_point/tmp_dir 105 return $? 106 fi 107 else 108 $E4DEFRAG -v $EXT4_DEV 109 return $? 110 fi 111} 112 113# Test online defragmentation feature 114# $1: defrag type 115# $2: 1 - empty, 2 - full with small files, 3 - full with large files 116# $3: block size 117ext4_test_online_defrag() 118{ 119 echo Test $TST_COUNT start >> ext4_online_defrag_result.txt 120 121 tst_resm TINFO "defrag type: $1, defrag obj: $2, block size: $3" 122 123 mkfs.ext4 -m 0 -b $3 -O ^flex_bg $EXT4_DEV >> ext4_online_defrag_result.txt 2>&1 124 if [ $? -ne 0 ]; then 125 tst_resm TFAIL "failed to create ext4 filesystem" 126 return 127 fi 128 129 tune2fs -O extents $EXT4_DEV >> ext4_online_defrag_result.txt 2>&1 130 131 mount -t ext4 -o nodelalloc $EXT4_DEV mnt_point 132 if [ $? -ne 0 ]; then 133 tst_resm TFAIL"failed to mount ext4 filesystem" 134 return 135 fi 136 137 age_filesystem $2 $1 >> ext4_online_defrag_result.txt 2>&1 138 139 my_e4defrag $1 $2 >> ext4_online_defrag_result.txt 140 if [ $? -ne 0 ]; then 141 tst_resm TFAIL "e4defrag returned failure" 142 umount mnt_point 143 return 144 fi 145 146 umount mnt_point 147 if [ $? -ne 0 ]; then 148 tst_resm TFAIL "failed to umount ext4 filesystem" 149 return 150 fi 151 152 e2fsck -p $EXT4_DEV >> ext4_online_defrag_result.txt 2>&1 153 if [ $? -ne 0 ]; then 154 tst_resm TFAIL "fsck returned failure" 155 return 156 fi 157 158 tst_resm TPASS "ext4 online defrag test pass" 159} 160 161# main 162ext4_setup 163 164tst_test_cmds ffsb 165 166DEFRAG=( $FILE $DIR $FILESYSTEM ) 167AGING=( $EMPTY $SMALL $LARGE ) 168BLOCK_SIZE=( 1024 4096 ) 169 170for ((i = 0; i < 2; i++)) 171{ 172 for ((j = 0; j < 3; j++)) 173 { 174 for ((k = 0; k < 3; k++)) 175 { 176 ext4_test_online_defrag ${DEFRAG[$j]} ${AGING[$k]} \ 177 ${BLOCK_SIZE[$i]} 178 } 179 } 180} 181 182tst_exit 183