| OUT=$test_name.log | |
| EXP=$test_dir/expect | |
| E2FSCK=../e2fsck/e2fsck | |
| NAMELEN=255 | |
| DIRENT_SZ=8 | |
| BLOCKSZ=1024 | |
| INODESZ=128 | |
| DIRENT_PER_LEAF=$((BLOCKSZ / (NAMELEN + DIRENT_SZ))) | |
| HEADER=32 | |
| INDEX_SZ=8 | |
| INDEX_L1=$(((BLOCKSZ - HEADER) / INDEX_SZ)) | |
| INDEX_L2=$(((BLOCKSZ - DIRENT_SZ) / INDEX_SZ)) | |
| DIRBLK=$((2 + INDEX_L1 * INDEX_L2)) | |
| ENTRIES=$((DIRBLK * DIRENT_PER_LEAF)) | |
| EXT4_LINK_MAX=65000 | |
| if [ $ENTRIES -lt $((EXT4_LINK_MAX + 10)) ]; then | |
| ENTRIES=$((EXT4_LINK_MAX + 10)) | |
| DIRBLK=$((ENTRIES / DIRENT_PER_LEAF + 3)) | |
| fi | |
| # directory leaf blocks plus inode count and 25% for the rest of the fs | |
| FSIZE=$(((DIRBLK + EXT4_LINK_MAX * ((BLOCKSZ + INODESZ) / BLOCKSZ)) * 5 / 4)) | |
| $MKE2FS -b 1024 -O large_dir,uninit_bg -N $((ENTRIES + 50)) \ | |
| -I $INODESZ -F $TMPFILE $FSIZE > $OUT.new 2>&1 | |
| RC=$? | |
| if [ $RC -eq 0 ]; then | |
| { | |
| # First some initial fs setup to create indexed dir | |
| echo "mkdir /foo" | |
| echo "cd /foo" | |
| touch $TMPFILE.tmp | |
| echo "write $TMPFILE.tmp foofile" | |
| i=0 | |
| while test $i -lt $DIRENT_PER_LEAF ; do | |
| printf "mkdir d%0254u\n" $i | |
| i=$((i + 1)); | |
| done | |
| echo "expand ./" | |
| printf "mkdir d%0254u\n" $i | |
| } | $DEBUGFS -w $TMPFILE > /dev/null 2>> $OUT.new | |
| RC=$? | |
| # e2fsck should optimize the dir to become indexed | |
| $E2FSCK -yfD $TMPFILE >> $OUT.new 2>&1 | |
| status=$? | |
| echo Exit status is $status >> $OUT.new | |
| fi | |
| if [ $RC -eq 0 ]; then | |
| { | |
| START=$SECONDS | |
| i=$(($DIRENT_PER_LEAF+1)) | |
| last=$i | |
| echo "cd /foo" | |
| while test $i -lt $ENTRIES ; do | |
| ELAPSED=$((SECONDS - START)) | |
| if test $((i % 5000)) -eq 0 -a $ELAPSED -gt 10; then | |
| RATE=$(((i - last) / ELAPSED)) | |
| echo "$test_name: $i/$ENTRIES links, ${ELAPSED}s @ $RATE/s" >&2 | |
| START=$SECONDS | |
| last=$i | |
| fi | |
| if test $i -lt $((EXT4_LINK_MAX + 10)); then | |
| printf "mkdir d%0254u\n" $i | |
| else | |
| printf "ln foofile f%0254u\n" $i | |
| fi | |
| i=$((i + 1)) | |
| done | |
| } | $DEBUGFS -w $TMPFILE > /dev/null 2>> $OUT.new | |
| RC=$? | |
| fi | |
| if [ $RC -eq 0 ]; then | |
| $E2FSCK -yfD $TMPFILE >> $OUT.new 2>&1 | |
| status=$? | |
| echo Exit status is $status >> $OUT.new | |
| sed -f $cmd_dir/filter.sed -e "s;$TMPFILE;test.img;" $OUT.new > $OUT | |
| rm -f $OUT.new | |
| cmp -s $OUT $EXP | |
| RC=$? | |
| fi | |
| if [ $RC -eq 0 ]; then | |
| echo "$test_name: $test_description: ok" | |
| touch $test_name.ok | |
| else | |
| echo "$test_name: $test_description: failed" | |
| diff -u $EXP $OUT > $test_name.failed | |
| fi |