Home | History | Annotate | Download | only in ext4-subdir-limit
      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 ## Author: Li Zefan <lizf (at] cn.fujitsu.com>                                     ##
     22 ##         Miao Xie <miaox (at] cn.fujitsu.com>                                    ##
     23 ##                                                                            ##
     24 ################################################################################
     25 
     26 
     27 export TCID="ext4-subdir-limit"
     28 export TST_TOTAL=10
     29 
     30 . ext4_funcs.sh
     31 
     32 SHORT_DIR=1
     33 LONG_DIR=2
     34 
     35 FAIL=1
     36 PASS=0
     37 
     38 prev_block_size=-1
     39 prev_result=$FAIL
     40 
     41 # Run a test case
     42 # $1: Number of directories to create
     43 # $2: create short dir or long dir
     44 # $3: parent directory
     45 # $4: filesystem block size
     46 ext4_run_case()
     47 {
     48 	local dir_name_len=
     49 
     50 	if [ $2 -eq $SHORT_DIR ]; then
     51 		dir_name_len="short name"
     52 	else
     53 		dir_name_len="long name"
     54 	fi
     55 
     56 	tst_resm TINFO "Num of dirs to create: $1, Dir name len: $dir_name_len, " \
     57 			"Parent dir: $3, Block size: $4"
     58 
     59 	# only mkfs if block size has been changed,
     60 	# or previous case failed
     61 	if [ $prev_result -ne $PASS -o $4 -ne $prev_block_size ]; then
     62 		mkfs.ext4 -b $4 -I 256 $EXT4_DEV >/dev/null 2>&1
     63 		if [ $? -ne 0 ]; then
     64 			tst_resm TFAIL "failed to create ext4 filesystem"
     65 			return
     66 		fi
     67 		prev_block_size=$4
     68 
     69 		tune2fs -O extents $EXT4_DEV >/dev/null 2>&1
     70 	fi
     71 
     72 	prev_result=$FAIL
     73 
     74 	# mount ext4 filesystem
     75 	mount -t ext4 $EXT4_DEV mnt_point
     76 	if [ $? -ne 0 ]; then
     77 		tst_resm TFAIL "failed to mount ext4 filesystem"
     78 		return
     79 	fi
     80 
     81 	# create directories
     82 	mkdir -p $3 2> /dev/null
     83 
     84 	if [ $2 -eq $SHORT_DIR ]; then
     85 		create_short_dirs $1 $3
     86 	else
     87 		create_long_dirs $1 $3
     88 	fi
     89 
     90 	if [ $? -ne 0 ]; then
     91 		nr_dirs=`ls $3 | wc -l`
     92 		tst_resm TFAIL "failed to create directories - $nr_dirs"
     93 		umount mnt_point
     94 		return
     95 	fi
     96 
     97 	# delete directories
     98 	cd $3
     99 	ls | xargs rmdir
    100 	if [ $? -ne 0 ]; then
    101 		tst_resm TFAIL "failed to remove directories"
    102 		cd -
    103 		umount mnt_point
    104 		return
    105 	fi
    106 	cd -
    107 
    108 	# unmount ext4 filesystem
    109 	umount mnt_point
    110 	if [ $? -ne 0 ]; then
    111 		tst_resm TFAIL "failed to umount ext4 filesystem"
    112 		return
    113 	fi
    114 
    115 	# run fsck to make sure the filesystem has no errors
    116 	e2fsck -p $EXT4_DEV >/dev/null 2>&1
    117 	if [ $? -ne 0 ]; then
    118 		tst_resm TFAIL "fsck: the filesystem has errors"
    119 		return
    120 	fi
    121 
    122 	# check dir_nlink is set
    123 	dumpe2fs $EXT4_DEV 2> /dev/null | grep '^Filesystem features' | grep -q dir_nlink
    124 	if [ $? -ne 0 ]; then
    125 		tst_resm TFAIL "feature dir_nlink is not set"
    126 		return
    127 	fi
    128 
    129 	prev_result=$PASS
    130 	tst_resm TPASS "ext4 subdir limit test pass"
    131 }
    132 
    133 # main
    134 ext4_setup
    135 
    136 DIR_LEN=( $SHORT_DIR $LONG_DIR )
    137 PARENT_DIR=( "mnt_point" "mnt_point/sub" )
    138 BLOCK_SIZE=( 1024 2048 4096 )
    139 
    140 for ((i = 0; i < 3; i++))
    141 {
    142 	for ((j = 0; j < 2; j++))
    143 	{
    144 		for ((k = 0; k < 2; k++))
    145 		{
    146 			if [ ${DIR_LEN[$k]} -eq $LONG_DIR -a \
    147 				${BLOCK_SIZE[$i]} -eq 1024 ]; then
    148 				continue
    149 			fi
    150 			ext4_run_case 65537 ${DIR_LEN[$k]} ${PARENT_DIR[$j]} \
    151 					${BLOCK_SIZE[$i]}
    152 		}
    153 	}
    154 }
    155 
    156 tst_exit
    157