xfs: Verify correctness of upgrading an fs to support large extent counters
[xfstests-dev.git] / tests / ext4 / 046
1 #! /bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (c) 2020 IBM Corporation. All Rights Reserved.
4 #
5 # FS QA Test No. ext4/046
6 #
7 # Test writes to falloc file with filesize > 4GB and make sure to verify
8 # the file checksum both before and after mount.
9 # This test is to check whether unwritten extents gets properly converted
10 # to written extent on a filesystem with bs < ps with dioread_nolock.
11 #
12 . ./common/preamble
13 _begin_fstest auto prealloc quick
14
15 # Import common functions.
16 . ./common/filter
17
18 _require_check_dmesg
19 _supported_fs ext4
20 _require_scratch
21 _require_xfs_io_command "falloc"
22 _require_scratch_size $((6 * 1024 * 1024)) #kB
23
24 _scratch_mkfs >> $seqres.full 2>&1
25 if ! _try_scratch_mount "-o dioread_nolock" >> $seqres.full 2>&1; then
26         err_str="can't mount with dioread_nolock if block size != PAGE_SIZE"
27         _check_dmesg_for ${err_str}
28         if [ $? -eq 0 ]; then
29                 _notrun "mount failed, ext4 doesn't support bs < ps with dioread_nolock"
30         else
31                 _fail "mount failed with dioread_nolock"
32         fi
33 fi
34
35 # Get blksz
36 blksz=$(_get_file_block_size $SCRATCH_MNT)
37
38 testfile=$SCRATCH_MNT/testfile-$seq
39
40 # Fallocate testfile with size > 4G
41 fsize=$((5 * 1024 * 1024 * 1024))
42 $XFS_IO_PROG -f -c "falloc 0 $fsize" $testfile >> $seqres.full 2>&1
43
44 # First write at offset < 4G (at few alternative blks)
45 off=$((3 * 1024 * 1024 * 1024))
46 for i in 1 2 3 4; do
47         $XFS_IO_PROG -f \
48                 -c "pwrite $off $blksz" \
49                 $testfile >> $seqres.full 2>&1
50         off=$(($off + (2*$blksz)))
51 done
52
53 # Then write at offset > 4G (at few alternative blks) to check
54 # any 32bit overflow case in map.m_lblk
55 off=$((4 * 1024 * 1024 * 1024))
56 for i in 1 2 3 4; do
57         $XFS_IO_PROG -f \
58                 -c "pwrite $off $blksz" \
59                 $testfile >> $seqres.full 2>&1
60         off=$(($off + (2*$blksz)))
61 done
62
63 # ==== Pre-Remount ===
64 md5_pre=`md5sum $testfile | cut -d' ' -f1`
65 echo "Pre-Remount md5sum of $testfile = $md5_pre" >> $seqres.full
66
67 _scratch_cycle_mount
68
69 # ==== Post-Remount ===
70 md5_post=`md5sum $testfile | cut -d' ' -f1`
71 echo "Post-Remount md5sum of $testfile = $md5_post" >> $seqres.full
72 test $md5_pre != $md5_post && echo "md5sum mismatch"
73
74 # success, all done
75 echo "Silence is golden"
76 status=0
77 exit