]> git.apps.os.sepia.ceph.com Git - xfstests-dev.git/commitdiff
ext4: regression test for fsync transaction ids initialization
authorWang Xiaoguang <wangxg.fnst@cn.fujitsu.com>
Wed, 15 Jun 2016 06:37:10 +0000 (14:37 +0800)
committerEryu Guan <eguan@redhat.com>
Wed, 15 Jun 2016 08:35:20 +0000 (16:35 +0800)
Commit 688f869 fixed this bug:
    ext4: Initialize fsync transaction ids in ext4_new_inode()

We manually modify jbd2 journal_superblock_s.s_sequence to be a very
large number, which will greatly reduce the time taken to trigger
this bug, though it seems some too hacked.

Signed-off-by: Wang Xiaoguang <wangxg.fnst@cn.fujitsu.com>
Reviewed-by: Eryu Guan <eguan@redhat.com>
Signed-off-by: Eryu Guan <eguan@redhat.com>
tests/ext4/021 [new file with mode: 0755]
tests/ext4/021.out [new file with mode: 0644]
tests/ext4/group

diff --git a/tests/ext4/021 b/tests/ext4/021
new file mode 100755 (executable)
index 0000000..9dfd191
--- /dev/null
@@ -0,0 +1,106 @@
+#! /bin/bash
+# FS QA Test 021
+#
+# Regression test for commit:
+# 688f869 ext4: Initialize fsync transaction ids in ext4_new_inode()
+#
+#-----------------------------------------------------------------------
+# Copyright (c) 2016 Fujitsu.  All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it would be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write the Free Software Foundation,
+# Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#-----------------------------------------------------------------------
+#
+
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1       # failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+       cd /
+       rm -f $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+
+# remove previous $seqres.full before test
+rm -f $seqres.full
+
+# real QA test starts here
+_supported_fs ext4
+_supported_os Linux
+_require_scratch
+_require_dumpe2fs
+
+# 8M in bytes
+fssize=$((8 * 1024 * 1024))
+_scratch_mkfs_sized $fssize >> $seqres.full 2>&1
+
+blocksize=`$DUMPE2FS_PROG -h $SCRATCH_DEV 2>/dev/null | grep "Block size" | \
+       awk '{print $3}'`
+offset=0
+found=0
+# this is the jbd2 journal superblock magic number on disk, in big endian
+magic="c0 3b 39 98"
+
+while [ $offset -lt $fssize ]; do
+       if od -j $offset -N 4 -t x1 $SCRATCH_DEV | \
+          grep -i "$magic" >/dev/null; then
+               echo "Found journal: $offset" >> $seqres.full
+               found=1
+               break
+       fi
+       offset=$((offset + blocksize))
+done
+if [ $found -ne 1 ]; then
+       echo "Found no journal"
+       exit
+fi
+
+# Overwrite journal.s_squence to 0x 81d1a480
+# 0x81d1a480 is hex form of 2178000000, and jbd2 journal is big endian on
+# disk, the s_squence offset to the beginning of journal superblock is 24
+# we do this to let jbd2 start to run with a initial big transaction id,
+# which will reduce the time taken to trigger this bug.
+xfs_io  -c "pwrite -S 0x81 $((offset+24)) 1" \
+       -c "pwrite -S 0xd1 $((offset+25)) 1" \
+       -c "pwrite -S 0xa4 $((offset+26)) 1" \
+       -c "pwrite -S 0x80 $((offset+27)) 1" $SCRATCH_DEV >> $seqres.full 2>&1
+
+trans_id=`$DUMPE2FS_PROG $SCRATCH_DEV 2>/dev/null | grep "Journal sequence" | \
+       awk '{print $NF}'`
+echo "Initial transaction id is $trans_id"
+_scratch_mount
+
+do_fdatasync_work()
+{
+       while [ 1 ]; do
+               $XFS_IO_PROG -f -c "fdatasync" $SCRATCH_MNT/testfile
+       done
+}
+
+do_fdatasync_work &
+datasync_work_pid=$!
+sleep 10
+kill $datasync_work_pid >/dev/null 2>&1
+
+# success, all done
+status=0
+exit
diff --git a/tests/ext4/021.out b/tests/ext4/021.out
new file mode 100644 (file)
index 0000000..9e504e2
--- /dev/null
@@ -0,0 +1,2 @@
+QA output created by 021
+Initial transaction id is 0x81d1a480
index 9e281590e7092fe638dbaa2e5b3f05a8995f6026..bbdbe1dd0a24f0f5c1efc877d4378891d1d32c40 100644 (file)
@@ -23,6 +23,7 @@
 018 fuzzers
 019 fuzzers
 020 auto quick ioctl rw
+021 auto quick
 271 auto rw quick
 301 aio auto ioctl rw stress
 302 aio auto ioctl rw stress