generic: test MADV_POPULATE_READ with IO errors
[xfstests-dev.git] / tests / generic / 286
1 #! /bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (c) 2011 Oracle Inc.  All Rights Reserved.
4 #
5 # FS QA Test No. 286
6 #
7 # SEEK_DATA/SEEK_HOLE copy tests.
8 #
9 . ./common/preamble
10 _begin_fstest auto quick other seek prealloc
11
12 # Import common functions.
13 . ./common/filter
14
15 # real QA test starts here
16 _supported_fs generic
17
18 _require_test
19 _require_xfs_io_command "falloc"
20 _require_seek_data_hole
21
22 src=$TEST_DIR/seek_copy_testfile
23 dest=$TEST_DIR/seek_copy_testfile.dest
24
25 _require_test_program "seek_copy_test"
26
27 # Override the default cleanup function.
28 _cleanup()
29 {
30         rm -f $src $dest
31 }
32
33 # seek_copy_test_01: tests file with holes and written data extents.
34 # verify results:
35 # 1. file size is identical.
36 # 2. perform cmp(1) to compare SRC and DEST file byte by byte.
37 test01()
38 {
39         rm -f $src $dest
40
41         write_cmd="-c \"truncate 100m\""
42         for i in $(seq 0 5 100); do
43                 offset=$(($i * $((1 << 20))))
44                 write_cmd="$write_cmd -c \"pwrite $offset 1m\""
45         done
46
47         echo "*** test01() create sparse file ***" >>$seqres.full
48         eval ${XFS_IO_PROG} -f "${write_cmd}" $src >>$seqres.full 2>&1 ||
49                 _fail "create sparse file failed!"
50         echo "*** test01() create sparse file done ***" >>$seqres.full
51         echo >>$seqres.full
52
53         $here/src/seek_copy_test $src $dest
54         
55         test $(_get_filesize $src) = $(_get_filesize $dest) ||
56                 _fail "TEST01: file size check failed"
57
58         cmp $src $dest || _fail "TEST01: file bytes check failed"
59 }
60
61 # seek_copy_test_02 - tests file with holes, written and unwritten extents.
62 # verify results:
63 # 1. file size is identical.
64 # 2. perform cmp(1) to compare SRC and DEST file byte by byte.
65 test02()
66 {
67         rm -rf $src $dest
68
69         write_cmd="-c \"truncate 200m\""
70         for i in $(seq 0 10 100); do
71                 offset=$(($((6 << 20)) + $i * $((1 << 20))))
72                 write_cmd="$write_cmd -c \"falloc $offset 3m\" -c \"pwrite $offset 1m\""
73         done
74
75         echo "*** test02() create sparse file ***" >>$seqres.full
76         eval ${XFS_IO_PROG} -f "${write_cmd}" $src >>$seqres.full 2>&1 ||
77                 _fail "create sparse file failed!"
78         echo "*** test02() create sparse file done ***" >>$seqres.full
79         echo >>$seqres.full
80
81         $here/src/seek_copy_test $src $dest
82
83         test $(_get_filesize $src) = $(_get_filesize $dest) ||
84                 _fail "TEST02: file size check failed"
85
86         cmp $src $dest || _fail "TEST02: file bytes check failed"
87 }
88
89 # seek_copy_test_03 - tests file with unwritten with data, repeated unwritten
90 # without data, as well as data extents mapping.
91 # verify results:
92 # 1. file size is identical.
93 # 2. perform cmp(1) to compare SRC and DEST file byte by byte.
94 test03()
95 {
96         rm -rf $src $dest
97
98         write_cmd="-c \"truncate 200m\""
99
100         #
101         # Firstly, make the file with allocated && reserved extents
102         # mapping without real data wrote.
103         #
104         for i in $(seq 0 10 180); do
105                 offset=$(($((10 << 20)) + $i * $((1 << 20))))
106                 write_cmd="$write_cmd -c \"falloc $offset 10m\""
107         done
108
109         #
110         # Secondly, write data to some unwritten extents, hence we
111         # have a test file will extents mapping as:
112         # |data|multiple unwritten_without_data|data| repeat...
113         for i in $(seq 0 60 180); do
114                 offset=$(($((20 << 20)) + $i * $((1 << 20))))
115                 write_cmd="$write_cmd -c \"pwrite $offset 10m\""
116         done
117
118         echo "*** test03() create sparse file ***" >>$seqres.full
119         eval ${XFS_IO_PROG} -f "${write_cmd}" $src >>$seqres.full 2>&1 ||
120                 _fail "create sparse file failed!"
121         echo "*** test03() create sparse file done ***" >>$seqres.full
122         echo >>$seqres.full
123         $here/src/seek_copy_test $src $dest
124
125         test $(_get_filesize $src) = $(_get_filesize $dest) ||
126                 _fail "TEST03: file size check failed"
127
128         cmp $src $dest || _fail "TEST03: file bytes check failed"
129 }
130
131 # seek_copy_test_04 - tests file with hole, repeated unwritten
132 # without data, as well as data extents mapping.
133 # verify results:
134 # 1. file size is identical.
135 # 2. perform cmp(1) to compare SRC and DEST file byte by byte.
136 test04()
137 {
138         rm -rf $src $dest
139
140         write_cmd="-c \"truncate 200m\""
141
142         #
143         # Firstly, make the file with allocated && reserved extents
144         # mapping without real data wrote.
145         #
146         for i in $(seq 30 30 180); do
147                 offset=$(($((30 << 20)) + $i * $((1 << 20))))
148                 write_cmd="$write_cmd -c \"falloc $offset 5m\""
149         done
150
151         #
152         # Secondly, write data to some unwritten extents, hence we
153         # have a test file will extents mapping as:
154         # |hole|multiple unwritten_without_data|hole|data| repeat...
155         for i in $(seq 30 90 180); do
156                 offset=$(($((30 << 20)) + $i * $((1 << 20))))
157                 write_cmd="$write_cmd -c \"pwrite $offset 2m\""
158         done
159
160         echo "*** test04() create sparse file ***" >>$seqres.full
161         eval ${XFS_IO_PROG} -f "${write_cmd}" $src >>$seqres.full 2>&1 ||
162                 _fail "create sparse file failed!"
163         echo "*** test04() create sparse file done ***" >>$seqres.full
164         echo >>$seqres.full
165         $here/src/seek_copy_test $src $dest
166
167         test $(_get_filesize $src) = $(_get_filesize $dest) ||
168                 _fail "TEST04: file size check failed"
169
170         cmp $src $dest || _fail "TEST04: file bytes check failed"
171 }
172
173 test01
174 test02
175 test03
176 test04
177
178 status=0
179 exit