verify.c revision d6aed795f2e3e403828abf60874dd2d6e8342a1b
1e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe/*
2e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * IO verification helpers
3e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe */
4e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe#include <unistd.h>
5e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe#include <fcntl.h>
6e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe#include <string.h>
797af62cec418cd722fb43c6010d6430534e12353Jens Axboe#include <assert.h>
8e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
9e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe#include "fio.h"
10e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
11eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/md5.h"
12eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc64.h"
13eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc32.h"
14bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe#include "crc/crc32c.h"
15eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc16.h"
16eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc7.h"
17eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/sha256.h"
18eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/sha512.h"
19cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
2090059d65bde4804e4da07401ad6902c1d956b592Jens Axboestatic void fill_random_bytes(struct thread_data *td, void *p, unsigned int len)
21e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
22e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	unsigned int todo;
234c5946c6606abc87ba7e2bfc57a5030d19b6d4d5Jens Axboe	int r;
24e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
25e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	while (len) {
264c5946c6606abc87ba7e2bfc57a5030d19b6d4d5Jens Axboe		r = os_random_long(&td->verify_state);
27e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
28e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		/*
29e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		 * lrand48_r seems to be broken and only fill the bottom
30e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		 * 32-bits, even on 64-bit archs with 64-bit longs
31e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		 */
32e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		todo = sizeof(r);
33e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		if (todo > len)
34e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe			todo = len;
35e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
36e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		memcpy(p, &r, todo);
37e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
38e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		len -= todo;
39e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		p += todo;
40e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	}
41e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
42e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
4390059d65bde4804e4da07401ad6902c1d956b592Jens Axboestatic void fill_pattern(struct thread_data *td, void *p, unsigned int len)
4490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe{
4590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	switch (td->o.verify_pattern_bytes) {
4690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	case 0:
47bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "fill random bytes len=%u\n", len);
4890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		fill_random_bytes(td, p, len);
4990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		break;
5090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	case 1:
51bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "fill verify pattern b=0 len=%u\n", len);
5290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		memset(p, td->o.verify_pattern, len);
5390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		break;
5490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	case 2:
5590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	case 3:
5690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	case 4: {
5790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		unsigned int pattern = td->o.verify_pattern;
5890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		unsigned int i = 0;
5990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		unsigned char c1, c2, c3, c4;
6090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		unsigned char *b = p;
6190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe
62bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "fill verify pattern b=%d len=%u\n",
63bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe					td->o.verify_pattern_bytes, len);
64bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
6590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		c1 = pattern & 0xff;
6690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		pattern >>= 8;
6790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		c2 = pattern & 0xff;
6890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		pattern >>= 8;
6990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		c3 = pattern & 0xff;
7090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		pattern >>= 8;
7190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		c4 = pattern & 0xff;
7290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe
7390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		while (i < len) {
7490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe			b[i++] = c1;
7590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe			if (i == len)
7690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe				break;
7790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe			b[i++] = c2;
7890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe			if (td->o.verify_pattern_bytes == 2 || i == len)
7990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe				continue;
8090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe			b[i++] = c3;
8190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe			if (td->o.verify_pattern_bytes == 3 || i == len)
8290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe				continue;
8390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe			b[i++] = c4;
8490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		}
8590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		break;
8690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		}
8790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	}
8890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe}
8990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe
904764aec9fe5988281bdc114c13ac771fb16713ccJens Axboestatic void memswp(void *buf1, void *buf2, unsigned int len)
91546a9142511875524850ac92776184fd9fb7196eShawn Lewis{
92dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis	char swap[200];
93dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis
94dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis	assert(len <= sizeof(swap));
9590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe
96546a9142511875524850ac92776184fd9fb7196eShawn Lewis	memcpy(&swap, buf1, len);
97546a9142511875524850ac92776184fd9fb7196eShawn Lewis	memcpy(buf1, buf2, len);
98546a9142511875524850ac92776184fd9fb7196eShawn Lewis	memcpy(buf2, &swap, len);
99546a9142511875524850ac92776184fd9fb7196eShawn Lewis}
100546a9142511875524850ac92776184fd9fb7196eShawn Lewis
101e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void hexdump(void *buffer, int len)
102e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
103e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	unsigned char *p = buffer;
104e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	int i;
105e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
106e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	for (i = 0; i < len; i++)
1076d86144dd10b05e8b82e9b895c35dd778e5e71abJens Axboe		log_info("%02x", p[i]);
1086d86144dd10b05e8b82e9b895c35dd778e5e71abJens Axboe	log_info("\n");
109e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
110e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
111d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe/*
1128767783245faac99a7e1c330a1d6536e579c8402Jens Axboe * Prepare for seperation of verify_header and checksum header
1138767783245faac99a7e1c330a1d6536e579c8402Jens Axboe */
114546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic inline unsigned int __hdr_size(int verify_type)
1158767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{
1165921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe	unsigned int len = len;
1178767783245faac99a7e1c330a1d6536e579c8402Jens Axboe
118546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	switch (verify_type) {
119546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_NONE:
120546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_NULL:
121546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = 0;
122546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
123546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_MD5:
124546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_md5);
125546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
126546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC64:
127546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc64);
128546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
129bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	case VERIFY_CRC32C:
130546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC32:
1313845591fadea480177223e28c9d1c03642d34f0eJens Axboe	case VERIFY_CRC32C_INTEL:
132546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc32);
133546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
134546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC16:
135546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc16);
136546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
137546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC7:
138546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc7);
139546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
140546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_SHA256:
141546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_sha256);
142546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
143546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_SHA512:
144546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_sha512);
145546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
1467437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	case VERIFY_META:
1477437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		len = sizeof(struct vhdr_meta);
1487437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		break;
149546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	default:
150546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		log_err("fio: unknown verify header!\n");
151546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		assert(0);
152546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	}
153546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
154546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	return len + sizeof(struct verify_header);
1558767783245faac99a7e1c330a1d6536e579c8402Jens Axboe}
1568767783245faac99a7e1c330a1d6536e579c8402Jens Axboe
1578767783245faac99a7e1c330a1d6536e579c8402Jens Axboestatic inline unsigned int hdr_size(struct verify_header *hdr)
1588767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{
159546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	return __hdr_size(hdr->verify_type);
160546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe}
161546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
162546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic void *hdr_priv(struct verify_header *hdr)
163546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe{
164546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	void *priv = hdr;
165546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
166546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	return priv + sizeof(struct verify_header);
1678767783245faac99a7e1c330a1d6536e579c8402Jens Axboe}
1688767783245faac99a7e1c330a1d6536e579c8402Jens Axboe
1698767783245faac99a7e1c330a1d6536e579c8402Jens Axboe/*
170d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe * Return data area 'header_num'
171d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe */
172d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboestatic inline void *io_u_verify_off(struct verify_header *hdr,
1735ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				    struct io_u *io_u, unsigned char header_num)
174d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe{
1758767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	return io_u->buf + header_num * hdr->len + hdr_size(hdr);
176d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe}
177d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe
1787437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic int verify_io_u_meta(struct verify_header *hdr, struct thread_data *td,
1795ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			    struct io_u *io_u, unsigned int header_num)
1807437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{
1817437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	struct vhdr_meta *vh = hdr_priv(hdr);
1827437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
183bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "meta verify io_u %p, len %u\n", io_u, hdr->len);
184bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
1857437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	if (vh->offset != io_u->offset + header_num * td->o.verify_interval) {
1867437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		log_err("meta: verify failed at %llu/%u\n",
1875ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				io_u->offset + header_num * hdr->len, hdr->len);
1889fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
1897437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	}
1907437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
1917437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	return 0;
1927437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis}
1937437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
194cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic int verify_io_u_sha512(struct verify_header *hdr, struct io_u *io_u,
195cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			      unsigned int header_num)
196cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
197cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	void *p = io_u_verify_off(hdr, io_u, header_num);
198546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha512 *vh = hdr_priv(hdr);
199cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	uint8_t sha512[128];
200cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha512_ctx sha512_ctx = {
201cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		.buf = sha512,
202cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
203cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
204bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "sha512 verify io_u %p, len %u\n", io_u, hdr->len);
205bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
206cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha512_init(&sha512_ctx);
2078767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	sha512_update(&sha512_ctx, p, hdr->len - hdr_size(hdr));
208cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
209546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (memcmp(vh->sha512, sha512_ctx.buf, sizeof(sha512))) {
210cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		log_err("sha512: verify failed at %llu/%u\n",
2115ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				io_u->offset + header_num * hdr->len, hdr->len);
212546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		hexdump(vh->sha512, sizeof(vh->sha512));
213cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		hexdump(sha512_ctx.buf, sizeof(sha512));
2149fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
215cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	}
216cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
217cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	return 0;
218cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
219cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
220cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic int verify_io_u_sha256(struct verify_header *hdr, struct io_u *io_u,
221cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			      unsigned int header_num)
222cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
223cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	void *p = io_u_verify_off(hdr, io_u, header_num);
224546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha256 *vh = hdr_priv(hdr);
225cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	uint8_t sha256[128];
226cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha256_ctx sha256_ctx = {
227cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		.buf = sha256,
228cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
229cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
230bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "sha256 verify io_u %p, len %u\n", io_u, hdr->len);
231bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
232cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha256_init(&sha256_ctx);
2338767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	sha256_update(&sha256_ctx, p, hdr->len - hdr_size(hdr));
234cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
235546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (memcmp(vh->sha256, sha256_ctx.buf, sizeof(sha256))) {
236cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		log_err("sha256: verify failed at %llu/%u\n",
2375ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				io_u->offset + header_num * hdr->len, hdr->len);
238546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		hexdump(vh->sha256, sizeof(vh->sha256));
239cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		hexdump(sha256_ctx.buf, sizeof(sha256));
2409fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
241cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	}
242cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
243cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	return 0;
244cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
245cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
2463f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_crc7(struct verify_header *hdr, struct io_u *io_u,
2475ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			    unsigned char header_num)
2481e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{
249d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe	void *p = io_u_verify_off(hdr, io_u, header_num);
250546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc7 *vh = hdr_priv(hdr);
2511e154bdbf14a1d352117aea057035235b66f0381Jens Axboe	unsigned char c;
2521e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
253bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "crc7 verify io_u %p, len %u\n", io_u, hdr->len);
254bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
2558767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc7(p, hdr->len - hdr_size(hdr));
2561e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
257546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (c != vh->crc7) {
2583f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		log_err("crc7: verify failed at %llu/%u\n",
2595ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				io_u->offset + header_num * hdr->len, hdr->len);
260546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		log_err("crc7: wanted %x, got %x\n", vh->crc7, c);
2619fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
2621e154bdbf14a1d352117aea057035235b66f0381Jens Axboe	}
2631e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
2641e154bdbf14a1d352117aea057035235b66f0381Jens Axboe	return 0;
2651e154bdbf14a1d352117aea057035235b66f0381Jens Axboe}
2661e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
2673f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_crc16(struct verify_header *hdr, struct io_u *io_u,
2685ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			     unsigned int header_num)
269969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{
270d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe	void *p = io_u_verify_off(hdr, io_u, header_num);
271546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc16 *vh = hdr_priv(hdr);
272969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe	unsigned short c;
273969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
274bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "crc16 verify io_u %p, len %u\n", io_u, hdr->len);
275bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
2768767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc16(p, hdr->len - hdr_size(hdr));
277969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
278546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (c != vh->crc16) {
2793f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		log_err("crc16: verify failed at %llu/%u\n",
2805ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				io_u->offset + header_num * hdr->len, hdr->len);
281546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		log_err("crc16: wanted %x, got %x\n", vh->crc16, c);
2829fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
283969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe	}
284969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
285969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe	return 0;
286969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe}
287969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
2883f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_crc64(struct verify_header *hdr, struct io_u *io_u,
2895ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			     unsigned int header_num)
290d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{
291d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe	void *p = io_u_verify_off(hdr, io_u, header_num);
292546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc64 *vh = hdr_priv(hdr);
293d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe	unsigned long long c;
294d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
295bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "crc64 verify io_u %p, len %u\n", io_u, hdr->len);
296bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
2978767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc64(p, hdr->len - hdr_size(hdr));
298d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
299546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (c != vh->crc64) {
3003f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		log_err("crc64: verify failed at %llu/%u\n",
3013f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis				io_u->offset + header_num * hdr->len,
3023f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis				hdr->len);
3035ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		log_err("crc64: wanted %llx, got %llx\n",
3045ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe					(unsigned long long) vh->crc64, c);
3059fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
306d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe	}
307d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
308d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe	return 0;
309d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe}
310d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
3113f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_crc32(struct verify_header *hdr, struct io_u *io_u,
3125ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			     unsigned int header_num)
313e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
314d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe	void *p = io_u_verify_off(hdr, io_u, header_num);
315546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
316546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	uint32_t c;
317e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
318bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "crc32 verify io_u %p, len %u\n", io_u, hdr->len);
319bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
3208767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc32(p, hdr->len - hdr_size(hdr));
321e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
322546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (c != vh->crc32) {
3233f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		log_err("crc32: verify failed at %llu/%u\n",
3245ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				io_u->offset + header_num * hdr->len, hdr->len);
325546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		log_err("crc32: wanted %x, got %x\n", vh->crc32, c);
3269fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
327e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	}
328e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
329e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	return 0;
330e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
331e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
332bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboestatic int verify_io_u_crc32c(struct verify_header *hdr, struct io_u *io_u,
333bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe			      unsigned int header_num)
334bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{
335bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	void *p = io_u_verify_off(hdr, io_u, header_num);
336bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
337bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	uint32_t c;
338bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
339bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	dprint(FD_VERIFY, "crc32c verify io_u %p, len %u\n", io_u, hdr->len);
340bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
3413845591fadea480177223e28c9d1c03642d34f0eJens Axboe	if (hdr->verify_type == VERIFY_CRC32C_INTEL)
3423845591fadea480177223e28c9d1c03642d34f0eJens Axboe		c = crc32c_intel(p, hdr->len - hdr_size(hdr));
3433845591fadea480177223e28c9d1c03642d34f0eJens Axboe	else
3443845591fadea480177223e28c9d1c03642d34f0eJens Axboe		c = crc32c(p, hdr->len - hdr_size(hdr));
345bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
346bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	if (c != vh->crc32) {
347bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe		log_err("crc32c: verify failed at %llu/%u\n",
348bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe				io_u->offset + header_num * hdr->len, hdr->len);
349bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe		log_err("crc32c: wanted %x, got %x\n", vh->crc32, c);
3509fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
351bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	}
352bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
353bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	return 0;
354bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe}
355bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
3563f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_md5(struct verify_header *hdr, struct io_u *io_u,
3575ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			   unsigned int header_num)
358e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
359d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe	void *p = io_u_verify_off(hdr, io_u, header_num);
360546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_md5 *vh = hdr_priv(hdr);
3618c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	uint32_t hash[MD5_HASH_WORDS];
3628c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	struct md5_ctx md5_ctx = {
3638c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe		.hash = hash,
3648c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	};
365e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
366bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "md5 verify io_u %p, len %u\n", io_u, hdr->len);
367bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
36861f821f16cf27d8742e09b3a137c933cd0085e9bJens Axboe	md5_init(&md5_ctx);
3698767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	md5_update(&md5_ctx, p, hdr->len - hdr_size(hdr));
370e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
371546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (memcmp(vh->md5_digest, md5_ctx.hash, sizeof(hash))) {
3723f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		log_err("md5: verify failed at %llu/%u\n",
3735ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				io_u->offset + header_num * hdr->len, hdr->len);
374546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		hexdump(vh->md5_digest, sizeof(vh->md5_digest));
3758c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe		hexdump(md5_ctx.hash, sizeof(hash));
3769fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
377e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	}
378e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
379e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	return 0;
380e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
381e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
3823f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboestatic unsigned int hweight8(unsigned int w)
3833f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe{
3843f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe	unsigned int res = w - ((w >> 1) & 0x55);
3853f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
3863f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe	res = (res & 0x33) + ((res >> 2) & 0x33);
3873f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe	return (res + (res >> 4)) & 0x0F;
3883f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe}
3893f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
390a944e335fac62c75966b417a25ec107c40957cdbShawn Lewisint verify_io_u_pattern(unsigned long pattern, unsigned long pattern_size,
3915ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			char *buf, unsigned int len, unsigned int mod)
392a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis{
393a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	unsigned int i;
394a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	char split_pattern[4];
395a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis
396a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	for (i = 0; i < 4; i++) {
397a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis		split_pattern[i] = pattern & 0xff;
398a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis		pattern >>= 8;
399a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	}
400a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis
401a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	for (i = 0; i < len; i++) {
4023f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe		if (buf[i] != split_pattern[mod]) {
4033f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe			unsigned int bits;
4043f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
4053f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe			bits = hweight8(buf[i] ^ split_pattern[mod]);
4063f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe			log_err("fio: got pattern %x, wanted %x. Bad bits %d\n",
4073f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe				buf[i], split_pattern[mod], bits);
4083f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe			log_err("fio: bad pattern block offset %u\n", i);
4099fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe			return EILSEQ;
4103f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe		}
411a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis		mod++;
412a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis		if (mod == pattern_size)
413a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis			mod = 0;
414a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	}
415a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis
416a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	return 0;
417a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis}
418a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis
41936690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboeint verify_io_u(struct thread_data *td, struct io_u *io_u)
420e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
4213f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis	struct verify_header *hdr;
422a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	unsigned int hdr_size, hdr_inc, hdr_num = 0;
42395646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe	void *p;
424e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	int ret;
425e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
4261dcc049824b840df1ee0ef5d019fffa4037e1bb0Shawn Lewis	if (td->o.verify == VERIFY_NULL || io_u->ddir != DDIR_READ)
42736690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe		return 0;
42836690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe
4293f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis	hdr_inc = io_u->buflen;
430a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe	if (td->o.verify_interval)
431a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe		hdr_inc = td->o.verify_interval;
432e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
433a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe	ret = 0;
4345ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	for (p = io_u->buf; p < io_u->buf + io_u->buflen;
4355ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	     p += hdr_inc, hdr_num++) {
436a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe		if (ret && td->o.verify_fatal) {
437a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe			td->terminate = 1;
438a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe			break;
439a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe		}
440a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis		hdr_size = __hdr_size(td->o.verify);
441a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe		if (td->o.verify_offset)
442a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis			memswp(p, p + td->o.verify_offset, hdr_size);
44395646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe		hdr = p;
444e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
4453f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe		if (hdr->fio_magic != FIO_HDR_MAGIC) {
4463f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe			log_err("Bad verify header %x\n", hdr->fio_magic);
4479fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe			return EILSEQ;
4483f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe		}
4493f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
450e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis		if (td->o.verify_pattern_bytes) {
451bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "pattern verify io_u %p, len %u\n",
452bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe								io_u, hdr->len);
453e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis			ret = verify_io_u_pattern(td->o.verify_pattern,
4545ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe						  td->o.verify_pattern_bytes,
4555ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe						  p + hdr_size,
4565ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe						  hdr_inc - hdr_size,
4575ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe						  hdr_size % 4);
458e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis			if (ret)
459e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis				log_err("fio: verify failed at %llu/%u\n",
460e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis					io_u->offset + hdr_num * hdr->len,
461e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis					hdr->len);
462e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis			continue;
463e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis		}
464e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis
4653f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		switch (hdr->verify_type) {
4663f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_MD5:
4673f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			ret = verify_io_u_md5(hdr, io_u, hdr_num);
4683f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
4693f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC64:
4703f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			ret = verify_io_u_crc64(hdr, io_u, hdr_num);
4713f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
472bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe		case VERIFY_CRC32C:
4733845591fadea480177223e28c9d1c03642d34f0eJens Axboe		case VERIFY_CRC32C_INTEL:
474bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe			ret = verify_io_u_crc32c(hdr, io_u, hdr_num);
475bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe			break;
4763f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC32:
4773f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			ret = verify_io_u_crc32(hdr, io_u, hdr_num);
4783f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
4793f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC16:
4803f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			ret = verify_io_u_crc16(hdr, io_u, hdr_num);
4813f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
4823f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC7:
4833f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			ret = verify_io_u_crc7(hdr, io_u, hdr_num);
4843f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
485cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA256:
486cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			ret = verify_io_u_sha256(hdr, io_u, hdr_num);
487cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
488cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA512:
489cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			ret = verify_io_u_sha512(hdr, io_u, hdr_num);
490cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
4917437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		case VERIFY_META:
4927437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis			ret = verify_io_u_meta(hdr, td, io_u, hdr_num);
4937437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis			break;
4943f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		default:
4953f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			log_err("Bad verify type %u\n", hdr->verify_type);
496d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe			ret = EINVAL;
4973f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		}
4983f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis	}
499a7dfe862c2e3fe72b8db6a6e67302048d3731c6dJens Axboe
500a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe	return ret;
501e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
502e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
5037437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic void fill_meta(struct verify_header *hdr, struct thread_data *td,
5045ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		      struct io_u *io_u, unsigned int header_num)
5057437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{
5067437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	struct vhdr_meta *vh = hdr_priv(hdr);
5077437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
5087437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->thread = td->thread_number;
5097437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
5107437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->time_sec = io_u->start_time.tv_sec;
5117437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->time_usec = io_u->start_time.tv_usec;
5127437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
5137437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->numberio = td->io_issues[DDIR_WRITE];
5147437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
5157437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->offset = io_u->offset + header_num * td->o.verify_interval;
5167437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis}
5177437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
518cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha512(struct verify_header *hdr, void *p, unsigned int len)
519cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
520546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha512 *vh = hdr_priv(hdr);
521cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha512_ctx sha512_ctx = {
522546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.buf = vh->sha512,
523cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
524cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
525cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha512_init(&sha512_ctx);
526cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha512_update(&sha512_ctx, p, len);
527cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
528cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
529cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha256(struct verify_header *hdr, void *p, unsigned int len)
530cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
531546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha256 *vh = hdr_priv(hdr);
532cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha256_ctx sha256_ctx = {
533546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.buf = vh->sha256,
534cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
535cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
536cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha256_init(&sha256_ctx);
537cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha256_update(&sha256_ctx, p, len);
538cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
539cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
5401e154bdbf14a1d352117aea057035235b66f0381Jens Axboestatic void fill_crc7(struct verify_header *hdr, void *p, unsigned int len)
5411e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{
542546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc7 *vh = hdr_priv(hdr);
543546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
544546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc7 = crc7(p, len);
5451e154bdbf14a1d352117aea057035235b66f0381Jens Axboe}
5461e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
547969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboestatic void fill_crc16(struct verify_header *hdr, void *p, unsigned int len)
548969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{
549546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc16 *vh = hdr_priv(hdr);
550546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
551546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc16 = crc16(p, len);
552969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe}
553969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
554e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_crc32(struct verify_header *hdr, void *p, unsigned int len)
555e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
556546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
557546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
558546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc32 = crc32(p, len);
559e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
560e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
561bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboestatic void fill_crc32c(struct verify_header *hdr, void *p, unsigned int len)
562bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{
563bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
564bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
5653845591fadea480177223e28c9d1c03642d34f0eJens Axboe	if (hdr->verify_type == VERIFY_CRC32C_INTEL)
5663845591fadea480177223e28c9d1c03642d34f0eJens Axboe		vh->crc32 = crc32c_intel(p, len);
5673845591fadea480177223e28c9d1c03642d34f0eJens Axboe	else
5683845591fadea480177223e28c9d1c03642d34f0eJens Axboe		vh->crc32 = crc32c(p, len);
569bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe}
570bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
571d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboestatic void fill_crc64(struct verify_header *hdr, void *p, unsigned int len)
572d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{
573546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc64 *vh = hdr_priv(hdr);
574546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
575546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc64 = crc64(p, len);
576d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe}
577d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
578e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_md5(struct verify_header *hdr, void *p, unsigned int len)
579e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
580546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_md5 *vh = hdr_priv(hdr);
5818c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	struct md5_ctx md5_ctx = {
582546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.hash = (uint32_t *) vh->md5_digest,
5838c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	};
584e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
58561f821f16cf27d8742e09b3a137c933cd0085e9bJens Axboe	md5_init(&md5_ctx);
586e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	md5_update(&md5_ctx, p, len);
587e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
588e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
589e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe/*
590e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * fill body of io_u->buf with random data and add a header with the
591e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * crc32 or md5 sum of that data.
592e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe */
593e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboevoid populate_verify_io_u(struct thread_data *td, struct io_u *io_u)
594e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
595baefa9beacca430b8e3275c07d2f46ef14654468Jens Axboe	struct verify_header *hdr;
59695646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe	void *p = io_u->buf, *data;
5977437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	unsigned int hdr_inc, data_len, header_num = 0;
598e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
5999cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe	if (td->o.verify == VERIFY_NULL)
6009cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe		return;
6019cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe
60290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	fill_pattern(td, p, io_u->buflen);
603546a9142511875524850ac92776184fd9fb7196eShawn Lewis
604546a9142511875524850ac92776184fd9fb7196eShawn Lewis	hdr_inc = io_u->buflen;
605a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe	if (td->o.verify_interval)
606a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe		hdr_inc = td->o.verify_interval;
607baefa9beacca430b8e3275c07d2f46ef14654468Jens Axboe
6085ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	for (; p < io_u->buf + io_u->buflen; p += hdr_inc) {
60995646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe		hdr = p;
6103f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis
6113f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		hdr->fio_magic = FIO_HDR_MAGIC;
6123f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		hdr->verify_type = td->o.verify;
613546a9142511875524850ac92776184fd9fb7196eShawn Lewis		hdr->len = hdr_inc;
6148767783245faac99a7e1c330a1d6536e579c8402Jens Axboe		data_len = hdr_inc - hdr_size(hdr);
6153f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis
6168767783245faac99a7e1c330a1d6536e579c8402Jens Axboe		data = p + hdr_size(hdr);
6173f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		switch (td->o.verify) {
6183f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_MD5:
619bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "fill md5 io_u %p, len %u\n",
620bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe							io_u, hdr->len);
6213f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			fill_md5(hdr, data, data_len);
6223f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
6233f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC64:
624bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "fill crc64 io_u %p, len %u\n",
625bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe							io_u, hdr->len);
6263f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			fill_crc64(hdr, data, data_len);
6273f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
628bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe		case VERIFY_CRC32C:
6293845591fadea480177223e28c9d1c03642d34f0eJens Axboe		case VERIFY_CRC32C_INTEL:
630bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe			dprint(FD_VERIFY, "fill crc32c io_u %p, len %u\n",
631bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe							io_u, hdr->len);
632bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe			fill_crc32c(hdr, data, data_len);
633bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe			break;
6343f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC32:
635bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "fill crc32 io_u %p, len %u\n",
636bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe							io_u, hdr->len);
6373f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			fill_crc32(hdr, data, data_len);
6383f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
6393f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC16:
640bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "fill crc16 io_u %p, len %u\n",
641bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe							io_u, hdr->len);
6423f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			fill_crc16(hdr, data, data_len);
6433f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
6443f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC7:
645bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "fill crc7 io_u %p, len %u\n",
646bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe							io_u, hdr->len);
6473f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			fill_crc7(hdr, data, data_len);
6483f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
649cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA256:
650bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "fill sha256 io_u %p, len %u\n",
651bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe							io_u, hdr->len);
652cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			fill_sha256(hdr, data, data_len);
653cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
654cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA512:
655bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "fill sha512 io_u %p, len %u\n",
656bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe							io_u, hdr->len);
657cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			fill_sha512(hdr, data, data_len);
658cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
6597437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		case VERIFY_META:
660bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "fill meta io_u %p, len %u\n",
661bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe							io_u, hdr->len);
6627437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis			fill_meta(hdr, td, io_u, header_num);
6637437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis			break;
6643f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		default:
6653f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			log_err("fio: bad verify type: %d\n", td->o.verify);
6663f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			assert(0);
6673f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		}
668a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe		if (td->o.verify_offset)
6698767783245faac99a7e1c330a1d6536e579c8402Jens Axboe			memswp(p, p + td->o.verify_offset, hdr_size(hdr));
6707437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		header_num++;
671e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	}
672e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
673e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
674e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboeint get_next_verify(struct thread_data *td, struct io_u *io_u)
675e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
6768de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	struct io_piece *ipo = NULL;
677e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
678d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	/*
679d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	 * this io_u is from a requeue, we already filled the offsets
680d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	 */
681d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	if (io_u->file)
682d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe		return 0;
683d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe
6848de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	if (!RB_EMPTY_ROOT(&td->io_hist_tree)) {
6858de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe		struct rb_node *n = rb_first(&td->io_hist_tree);
686e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
6878de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe		ipo = rb_entry(n, struct io_piece, rb_node);
6884b87898e8d76aaf05baec83077a11311c1447397Jens Axboe		rb_erase(n, &td->io_hist_tree);
68901743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe	} else if (!flist_empty(&td->io_hist_list)) {
69001743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe		ipo = flist_entry(td->io_hist_list.next, struct io_piece, list);
69101743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe		flist_del(&ipo->list);
6928de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	}
693e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
6948de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	if (ipo) {
695e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->offset = ipo->offset;
696e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->buflen = ipo->len;
69736167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->file = ipo->file;
69897af62cec418cd722fb43c6010d6430534e12353Jens Axboe
699d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe		if (!fio_file_open(io_u->file)) {
70097af62cec418cd722fb43c6010d6430534e12353Jens Axboe			int r = td_io_open_file(td, io_u->file);
70197af62cec418cd722fb43c6010d6430534e12353Jens Axboe
702bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			if (r) {
703bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe				dprint(FD_VERIFY, "failed file %s open\n",
704bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe						io_u->file->file_name);
70597af62cec418cd722fb43c6010d6430534e12353Jens Axboe				return 1;
706bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			}
70797af62cec418cd722fb43c6010d6430534e12353Jens Axboe		}
70897af62cec418cd722fb43c6010d6430534e12353Jens Axboe
70997af62cec418cd722fb43c6010d6430534e12353Jens Axboe		get_file(ipo->file);
710d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe		assert(fio_file_open(io_u->file));
711e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->ddir = DDIR_READ;
71236167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->xfer_buf = io_u->buf;
71336167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->xfer_buflen = io_u->buflen;
714e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		free(ipo);
715bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "get_next_verify: ret io_u %p\n", io_u);
716e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		return 0;
717e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	}
718e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
719bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "get_next_verify: empty\n");
720e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	return 1;
721e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
722