Whamcloud - gitweb
5c88fc3a99fb830bd4f24caa369a919d937cab7a
[tools/e2fsprogs.git] / tests / f_large_dir / script
1 OUT=$test_name.log
2 EXP=$test_dir/expect
3 E2FSCK=../e2fsck/e2fsck
4
5 # skip this test on aarch64 builders because it is extremely slow
6 if [ "`uname -m`" = "aarch64" ]; then
7         echo "$test_name: $test_description: skipped (slow on aarch64)"
8         return 0
9 fi
10
11 NAMELEN=255
12 DIRENT_SZ=8
13 BLOCKSZ=1024
14 INODESZ=128
15 DIRENT_PER_LEAF=$((BLOCKSZ / (NAMELEN + DIRENT_SZ)))
16 HEADER=32
17 INDEX_SZ=8
18 INDEX_L1=$(((BLOCKSZ - HEADER) / INDEX_SZ))
19 INDEX_L2=$(((BLOCKSZ - DIRENT_SZ) / INDEX_SZ))
20 DIRBLK=$((2 + INDEX_L1 * INDEX_L2))
21 ENTRIES=$((DIRBLK * DIRENT_PER_LEAF))
22 EXT4_LINK_MAX=65000
23 if [ $ENTRIES -lt $((EXT4_LINK_MAX + 10)) ]; then
24         ENTRIES=$((EXT4_LINK_MAX + 10))
25         DIRBLK=$((ENTRIES / DIRENT_PER_LEAF + 3))
26 fi
27 # directory leaf blocks plus inode count and 25% for the rest of the fs
28 FSIZE=$(((DIRBLK + EXT4_LINK_MAX * ((BLOCKSZ + INODESZ) / BLOCKSZ)) * 5 / 4))
29
30 $MKE2FS -b 1024 -O large_dir,uninit_bg -N $((ENTRIES + 50)) \
31         -I $INODESZ -F $TMPFILE $FSIZE > $OUT.new 2>&1
32 RC=$?
33 if [ $RC -eq 0 ]; then
34 {
35         # First some initial fs setup to create indexed dir
36         echo "mkdir /foo"
37         echo "cd /foo"
38         touch $TMPFILE.tmp
39         echo "write $TMPFILE.tmp foofile"
40         i=0
41         while test $i -lt $DIRENT_PER_LEAF ; do
42                 printf "mkdir d%0254u\n" $i
43                 i=$((i + 1));
44         done
45         echo "expand ./"
46         printf "mkdir d%0254u\n" $i
47 } | $DEBUGFS -w $TMPFILE > /dev/null 2>> $OUT.new
48         RC=$?
49         # e2fsck should optimize the dir to become indexed
50         $E2FSCK -yfD $TMPFILE >> $OUT.new 2>&1
51         status=$?
52         echo Exit status is $status >> $OUT.new
53 fi
54
55 if [ $RC -eq 0 ]; then
56 {
57         START=$SECONDS
58         i=$(($DIRENT_PER_LEAF+1))
59         last=$i
60         echo "cd /foo"
61         while test $i -lt $ENTRIES ; do
62             ELAPSED=$((SECONDS - START))
63             if test $((i % 5000)) -eq 0 -a $ELAPSED -gt 10; then
64                 RATE=$(((i - last) / ELAPSED))
65                 echo "$test_name: $i/$ENTRIES links, ${ELAPSED}s @ $RATE/s" >&2
66                 START=$SECONDS
67                 last=$i
68             fi
69             if test $i -lt $((EXT4_LINK_MAX + 10)); then
70                 printf "mkdir d%0254u\n" $i
71             else
72                 printf "ln foofile f%0254u\n" $i
73             fi
74             i=$((i + 1))
75         done
76 } | $DEBUGFS -w $TMPFILE > /dev/null 2>> $OUT.new
77         RC=$?
78 fi
79
80 if [ $RC -eq 0 ]; then
81         $E2FSCK -yfD $TMPFILE >> $OUT.new 2>&1
82         status=$?
83         echo Exit status is $status >> $OUT.new
84         sed -f $cmd_dir/filter.sed -e "s;$TMPFILE;test.img;" $OUT.new > $OUT
85         rm -f $OUT.new
86
87         cmp -s $OUT $EXP
88         RC=$?
89 fi
90 if [ $RC -eq 0 ]; then
91         echo "$test_name: $test_description: ok"
92         touch $test_name.ok
93 else
94         echo "$test_name: $test_description: failed"
95         diff -u $EXP $OUT > $test_name.failed
96 fi