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