verify.c revision d561f2ab37ef5729882ef3c6e6ed8ee49414955f
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>
8e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe#include <pthread.h>
9e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
10e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe#include "fio.h"
114f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe#include "verify.h"
12e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe#include "smalloc.h"
13e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
14eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/md5.h"
15eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc64.h"
16eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc32.h"
17bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe#include "crc/crc32c.h"
18eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc16.h"
19eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc7.h"
20eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/sha256.h"
21eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/sha512.h"
22cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
2390059d65bde4804e4da07401ad6902c1d956b592Jens Axboestatic void fill_random_bytes(struct thread_data *td, void *p, unsigned int len)
24e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
25e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	unsigned int todo;
264c5946c6606abc87ba7e2bfc57a5030d19b6d4d5Jens Axboe	int r;
27e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
28e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	while (len) {
294c5946c6606abc87ba7e2bfc57a5030d19b6d4d5Jens Axboe		r = os_random_long(&td->verify_state);
30e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
31e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		/*
32e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		 * lrand48_r seems to be broken and only fill the bottom
33e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		 * 32-bits, even on 64-bit archs with 64-bit longs
34e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		 */
35e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		todo = sizeof(r);
36e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		if (todo > len)
37e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe			todo = len;
38e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
39e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		memcpy(p, &r, todo);
40e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
41e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		len -= todo;
42e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		p += todo;
43e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	}
44e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
45e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
4690059d65bde4804e4da07401ad6902c1d956b592Jens Axboestatic void fill_pattern(struct thread_data *td, void *p, unsigned int len)
4790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe{
4890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	switch (td->o.verify_pattern_bytes) {
4990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	case 0:
50bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "fill random bytes len=%u\n", len);
5190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		fill_random_bytes(td, p, len);
5290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		break;
5390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	case 1:
54bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "fill verify pattern b=0 len=%u\n", len);
5590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		memset(p, td->o.verify_pattern, len);
5690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		break;
5790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	case 2:
5890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	case 3:
5990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	case 4: {
6090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		unsigned int pattern = td->o.verify_pattern;
6190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		unsigned int i = 0;
6290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		unsigned char c1, c2, c3, c4;
6390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		unsigned char *b = p;
6490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe
65bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "fill verify pattern b=%d len=%u\n",
66bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe					td->o.verify_pattern_bytes, len);
67bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
6890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		c1 = pattern & 0xff;
6990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		pattern >>= 8;
7090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		c2 = pattern & 0xff;
7190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		pattern >>= 8;
7290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		c3 = pattern & 0xff;
7390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		pattern >>= 8;
7490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		c4 = pattern & 0xff;
7590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe
7690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		while (i < len) {
7790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe			b[i++] = c1;
7890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe			if (i == len)
7990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe				break;
8090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe			b[i++] = c2;
8190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe			if (td->o.verify_pattern_bytes == 2 || i == len)
8290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe				continue;
8390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe			b[i++] = c3;
8490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe			if (td->o.verify_pattern_bytes == 3 || i == len)
8590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe				continue;
8690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe			b[i++] = c4;
8790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		}
8890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		break;
8990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		}
9090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	}
9190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe}
9290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe
934764aec9fe5988281bdc114c13ac771fb16713ccJens Axboestatic void memswp(void *buf1, void *buf2, unsigned int len)
94546a9142511875524850ac92776184fd9fb7196eShawn Lewis{
95dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis	char swap[200];
96dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis
97dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis	assert(len <= sizeof(swap));
9890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe
99546a9142511875524850ac92776184fd9fb7196eShawn Lewis	memcpy(&swap, buf1, len);
100546a9142511875524850ac92776184fd9fb7196eShawn Lewis	memcpy(buf1, buf2, len);
101546a9142511875524850ac92776184fd9fb7196eShawn Lewis	memcpy(buf2, &swap, len);
102546a9142511875524850ac92776184fd9fb7196eShawn Lewis}
103546a9142511875524850ac92776184fd9fb7196eShawn Lewis
104e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void hexdump(void *buffer, int len)
105e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
106e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	unsigned char *p = buffer;
107e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	int i;
108e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
109e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	for (i = 0; i < len; i++)
1106d86144dd10b05e8b82e9b895c35dd778e5e71abJens Axboe		log_info("%02x", p[i]);
1116d86144dd10b05e8b82e9b895c35dd778e5e71abJens Axboe	log_info("\n");
112e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
113e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
114d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe/*
1158767783245faac99a7e1c330a1d6536e579c8402Jens Axboe * Prepare for seperation of verify_header and checksum header
1168767783245faac99a7e1c330a1d6536e579c8402Jens Axboe */
117546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic inline unsigned int __hdr_size(int verify_type)
1188767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{
1195921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe	unsigned int len = len;
1208767783245faac99a7e1c330a1d6536e579c8402Jens Axboe
121546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	switch (verify_type) {
122546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_NONE:
123546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_NULL:
124546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = 0;
125546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
126546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_MD5:
127546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_md5);
128546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
129546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC64:
130546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc64);
131546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
132bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	case VERIFY_CRC32C:
133546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC32:
1343845591fadea480177223e28c9d1c03642d34f0eJens Axboe	case VERIFY_CRC32C_INTEL:
135546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc32);
136546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
137546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC16:
138546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc16);
139546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
140546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC7:
141546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc7);
142546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
143546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_SHA256:
144546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_sha256);
145546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
146546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_SHA512:
147546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_sha512);
148546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
1497437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	case VERIFY_META:
1507437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		len = sizeof(struct vhdr_meta);
1517437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		break;
152546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	default:
153546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		log_err("fio: unknown verify header!\n");
154546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		assert(0);
155546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	}
156546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
157546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	return len + sizeof(struct verify_header);
1588767783245faac99a7e1c330a1d6536e579c8402Jens Axboe}
1598767783245faac99a7e1c330a1d6536e579c8402Jens Axboe
1608767783245faac99a7e1c330a1d6536e579c8402Jens Axboestatic inline unsigned int hdr_size(struct verify_header *hdr)
1618767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{
162546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	return __hdr_size(hdr->verify_type);
163546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe}
164546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
165546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic void *hdr_priv(struct verify_header *hdr)
166546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe{
167546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	void *priv = hdr;
168546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
169546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	return priv + sizeof(struct verify_header);
1708767783245faac99a7e1c330a1d6536e579c8402Jens Axboe}
1718767783245faac99a7e1c330a1d6536e579c8402Jens Axboe
1728767783245faac99a7e1c330a1d6536e579c8402Jens Axboe/*
173d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe * Return data area 'header_num'
174d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe */
175d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboestatic inline void *io_u_verify_off(struct verify_header *hdr,
1765ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				    struct io_u *io_u, unsigned char header_num)
177d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe{
1788767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	return io_u->buf + header_num * hdr->len + hdr_size(hdr);
179d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe}
180d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe
1817437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic int verify_io_u_meta(struct verify_header *hdr, struct thread_data *td,
1825ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			    struct io_u *io_u, unsigned int header_num)
1837437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{
1847437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	struct vhdr_meta *vh = hdr_priv(hdr);
1857437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
186bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "meta verify io_u %p, len %u\n", io_u, hdr->len);
187bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
1887437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	if (vh->offset != io_u->offset + header_num * td->o.verify_interval) {
1897437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		log_err("meta: verify failed at %llu/%u\n",
1905ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				io_u->offset + header_num * hdr->len, hdr->len);
1919fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
1927437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	}
1937437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
1947437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	return 0;
1957437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis}
1967437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
197cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic int verify_io_u_sha512(struct verify_header *hdr, struct io_u *io_u,
198cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			      unsigned int header_num)
199cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
200cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	void *p = io_u_verify_off(hdr, io_u, header_num);
201546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha512 *vh = hdr_priv(hdr);
202cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	uint8_t sha512[128];
203cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha512_ctx sha512_ctx = {
204cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		.buf = sha512,
205cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
206cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
207bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "sha512 verify io_u %p, len %u\n", io_u, hdr->len);
208bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
209cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha512_init(&sha512_ctx);
2108767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	sha512_update(&sha512_ctx, p, hdr->len - hdr_size(hdr));
211cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
212546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (memcmp(vh->sha512, sha512_ctx.buf, sizeof(sha512))) {
213cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		log_err("sha512: verify failed at %llu/%u\n",
2145ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				io_u->offset + header_num * hdr->len, hdr->len);
215546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		hexdump(vh->sha512, sizeof(vh->sha512));
216cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		hexdump(sha512_ctx.buf, sizeof(sha512));
2179fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
218cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	}
219cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
220cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	return 0;
221cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
222cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
223cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic int verify_io_u_sha256(struct verify_header *hdr, struct io_u *io_u,
224cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			      unsigned int header_num)
225cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
226cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	void *p = io_u_verify_off(hdr, io_u, header_num);
227546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha256 *vh = hdr_priv(hdr);
228cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	uint8_t sha256[128];
229cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha256_ctx sha256_ctx = {
230cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		.buf = sha256,
231cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
232cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
233bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "sha256 verify io_u %p, len %u\n", io_u, hdr->len);
234bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
235cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha256_init(&sha256_ctx);
2368767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	sha256_update(&sha256_ctx, p, hdr->len - hdr_size(hdr));
237cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
238546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (memcmp(vh->sha256, sha256_ctx.buf, sizeof(sha256))) {
239cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		log_err("sha256: verify failed at %llu/%u\n",
2405ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				io_u->offset + header_num * hdr->len, hdr->len);
241546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		hexdump(vh->sha256, sizeof(vh->sha256));
242cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		hexdump(sha256_ctx.buf, sizeof(sha256));
2439fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
244cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	}
245cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
246cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	return 0;
247cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
248cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
2493f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_crc7(struct verify_header *hdr, struct io_u *io_u,
2505ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			    unsigned char header_num)
2511e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{
252d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe	void *p = io_u_verify_off(hdr, io_u, header_num);
253546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc7 *vh = hdr_priv(hdr);
2541e154bdbf14a1d352117aea057035235b66f0381Jens Axboe	unsigned char c;
2551e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
256bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "crc7 verify io_u %p, len %u\n", io_u, hdr->len);
257bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
2588767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc7(p, hdr->len - hdr_size(hdr));
2591e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
260546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (c != vh->crc7) {
2613f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		log_err("crc7: verify failed at %llu/%u\n",
2625ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				io_u->offset + header_num * hdr->len, hdr->len);
263546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		log_err("crc7: wanted %x, got %x\n", vh->crc7, c);
2649fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
2651e154bdbf14a1d352117aea057035235b66f0381Jens Axboe	}
2661e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
2671e154bdbf14a1d352117aea057035235b66f0381Jens Axboe	return 0;
2681e154bdbf14a1d352117aea057035235b66f0381Jens Axboe}
2691e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
2703f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_crc16(struct verify_header *hdr, struct io_u *io_u,
2715ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			     unsigned int header_num)
272969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{
273d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe	void *p = io_u_verify_off(hdr, io_u, header_num);
274546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc16 *vh = hdr_priv(hdr);
275969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe	unsigned short c;
276969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
277bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "crc16 verify io_u %p, len %u\n", io_u, hdr->len);
278bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
2798767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc16(p, hdr->len - hdr_size(hdr));
280969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
281546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (c != vh->crc16) {
2823f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		log_err("crc16: verify failed at %llu/%u\n",
2835ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				io_u->offset + header_num * hdr->len, hdr->len);
284546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		log_err("crc16: wanted %x, got %x\n", vh->crc16, c);
2859fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
286969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe	}
287969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
288969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe	return 0;
289969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe}
290969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
2913f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_crc64(struct verify_header *hdr, struct io_u *io_u,
2925ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			     unsigned int header_num)
293d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{
294d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe	void *p = io_u_verify_off(hdr, io_u, header_num);
295546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc64 *vh = hdr_priv(hdr);
296d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe	unsigned long long c;
297d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
298bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "crc64 verify io_u %p, len %u\n", io_u, hdr->len);
299bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
3008767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc64(p, hdr->len - hdr_size(hdr));
301d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
302546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (c != vh->crc64) {
3033f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		log_err("crc64: verify failed at %llu/%u\n",
3043f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis				io_u->offset + header_num * hdr->len,
3053f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis				hdr->len);
3065ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		log_err("crc64: wanted %llx, got %llx\n",
3075ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe					(unsigned long long) vh->crc64, c);
3089fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
309d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe	}
310d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
311d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe	return 0;
312d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe}
313d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
3143f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_crc32(struct verify_header *hdr, struct io_u *io_u,
3155ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			     unsigned int header_num)
316e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
317d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe	void *p = io_u_verify_off(hdr, io_u, header_num);
318546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
319546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	uint32_t c;
320e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
321bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "crc32 verify io_u %p, len %u\n", io_u, hdr->len);
322bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
3238767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc32(p, hdr->len - hdr_size(hdr));
324e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
325546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (c != vh->crc32) {
3263f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		log_err("crc32: verify failed at %llu/%u\n",
3275ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				io_u->offset + header_num * hdr->len, hdr->len);
328546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		log_err("crc32: wanted %x, got %x\n", vh->crc32, c);
3299fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
330e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	}
331e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
332e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	return 0;
333e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
334e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
335bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboestatic int verify_io_u_crc32c(struct verify_header *hdr, struct io_u *io_u,
336bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe			      unsigned int header_num)
337bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{
338bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	void *p = io_u_verify_off(hdr, io_u, header_num);
339bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
340bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	uint32_t c;
341bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
342bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	dprint(FD_VERIFY, "crc32c verify io_u %p, len %u\n", io_u, hdr->len);
343bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
3443845591fadea480177223e28c9d1c03642d34f0eJens Axboe	if (hdr->verify_type == VERIFY_CRC32C_INTEL)
3453845591fadea480177223e28c9d1c03642d34f0eJens Axboe		c = crc32c_intel(p, hdr->len - hdr_size(hdr));
3463845591fadea480177223e28c9d1c03642d34f0eJens Axboe	else
3473845591fadea480177223e28c9d1c03642d34f0eJens Axboe		c = crc32c(p, hdr->len - hdr_size(hdr));
348bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
349bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	if (c != vh->crc32) {
350bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe		log_err("crc32c: verify failed at %llu/%u\n",
351bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe				io_u->offset + header_num * hdr->len, hdr->len);
352bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe		log_err("crc32c: wanted %x, got %x\n", vh->crc32, c);
3539fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
354bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	}
355bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
356bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	return 0;
357bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe}
358bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
3593f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_md5(struct verify_header *hdr, struct io_u *io_u,
3605ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			   unsigned int header_num)
361e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
362d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe	void *p = io_u_verify_off(hdr, io_u, header_num);
363546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_md5 *vh = hdr_priv(hdr);
3648c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	uint32_t hash[MD5_HASH_WORDS];
3658c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	struct md5_ctx md5_ctx = {
3668c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe		.hash = hash,
3678c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	};
368e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
369bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "md5 verify io_u %p, len %u\n", io_u, hdr->len);
370bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
37161f821f16cf27d8742e09b3a137c933cd0085e9bJens Axboe	md5_init(&md5_ctx);
3728767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	md5_update(&md5_ctx, p, hdr->len - hdr_size(hdr));
373e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
374546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (memcmp(vh->md5_digest, md5_ctx.hash, sizeof(hash))) {
3753f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		log_err("md5: verify failed at %llu/%u\n",
3765ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				io_u->offset + header_num * hdr->len, hdr->len);
377546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		hexdump(vh->md5_digest, sizeof(vh->md5_digest));
3788c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe		hexdump(md5_ctx.hash, sizeof(hash));
3799fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
380e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	}
381e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
382e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	return 0;
383e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
384e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
3853f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboestatic unsigned int hweight8(unsigned int w)
3863f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe{
3873f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe	unsigned int res = w - ((w >> 1) & 0x55);
3883f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
3893f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe	res = (res & 0x33) + ((res >> 2) & 0x33);
3903f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe	return (res + (res >> 4)) & 0x0F;
3913f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe}
3923f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
393a944e335fac62c75966b417a25ec107c40957cdbShawn Lewisint verify_io_u_pattern(unsigned long pattern, unsigned long pattern_size,
3945ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			char *buf, unsigned int len, unsigned int mod)
395a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis{
396a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	unsigned int i;
397a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	char split_pattern[4];
398a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis
399a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	for (i = 0; i < 4; i++) {
400a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis		split_pattern[i] = pattern & 0xff;
401a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis		pattern >>= 8;
402a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	}
403a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis
404a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	for (i = 0; i < len; i++) {
4053f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe		if (buf[i] != split_pattern[mod]) {
4063f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe			unsigned int bits;
4073f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
4083f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe			bits = hweight8(buf[i] ^ split_pattern[mod]);
4093f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe			log_err("fio: got pattern %x, wanted %x. Bad bits %d\n",
4103f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe				buf[i], split_pattern[mod], bits);
4113f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe			log_err("fio: bad pattern block offset %u\n", i);
4129fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe			return EILSEQ;
4133f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe		}
414a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis		mod++;
415a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis		if (mod == pattern_size)
416a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis			mod = 0;
417a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	}
418a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis
419a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	return 0;
420a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis}
421a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis
422e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe/*
423e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe * Push IO verification to a separate thread
424e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe */
425e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_io_u_async(struct thread_data *td, struct io_u *io_u)
426e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
427e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	if (io_u->file)
428e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		put_file_log(td, io_u->file);
429e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
430e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	io_u->file = NULL;
431e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
432e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_lock(&td->io_u_lock);
433e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	flist_del(&io_u->list);
434e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	flist_add_tail(&io_u->list, &td->verify_list);
435e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_unlock(&td->io_u_lock);
436e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
437e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_cond_signal(&td->verify_cond);
438e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	io_u->flags |= IO_U_F_FREE_DEF;
439e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	return 0;
440e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
441e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
44236690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboeint verify_io_u(struct thread_data *td, struct io_u *io_u)
443e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
4443f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis	struct verify_header *hdr;
445a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	unsigned int hdr_size, hdr_inc, hdr_num = 0;
44695646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe	void *p;
447e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	int ret;
448e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
4491dcc049824b840df1ee0ef5d019fffa4037e1bb0Shawn Lewis	if (td->o.verify == VERIFY_NULL || io_u->ddir != DDIR_READ)
45036690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe		return 0;
45136690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe
4523f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis	hdr_inc = io_u->buflen;
453a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe	if (td->o.verify_interval)
454a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe		hdr_inc = td->o.verify_interval;
455e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
456a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe	ret = 0;
4575ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	for (p = io_u->buf; p < io_u->buf + io_u->buflen;
4585ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	     p += hdr_inc, hdr_num++) {
459a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe		if (ret && td->o.verify_fatal) {
460a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe			td->terminate = 1;
461a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe			break;
462a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe		}
463a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis		hdr_size = __hdr_size(td->o.verify);
464a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe		if (td->o.verify_offset)
465a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis			memswp(p, p + td->o.verify_offset, hdr_size);
46695646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe		hdr = p;
467e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
4683f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe		if (hdr->fio_magic != FIO_HDR_MAGIC) {
4693f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe			log_err("Bad verify header %x\n", hdr->fio_magic);
4709fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe			return EILSEQ;
4713f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe		}
4723f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
473e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis		if (td->o.verify_pattern_bytes) {
474bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "pattern verify io_u %p, len %u\n",
475bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe								io_u, hdr->len);
476e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis			ret = verify_io_u_pattern(td->o.verify_pattern,
4775ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe						  td->o.verify_pattern_bytes,
4785ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe						  p + hdr_size,
4795ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe						  hdr_inc - hdr_size,
4805ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe						  hdr_size % 4);
481e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis			if (ret)
482e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis				log_err("fio: verify failed at %llu/%u\n",
483e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis					io_u->offset + hdr_num * hdr->len,
484e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis					hdr->len);
485e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis			continue;
486e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis		}
487e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis
4883f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		switch (hdr->verify_type) {
4893f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_MD5:
4903f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			ret = verify_io_u_md5(hdr, io_u, hdr_num);
4913f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
4923f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC64:
4933f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			ret = verify_io_u_crc64(hdr, io_u, hdr_num);
4943f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
495bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe		case VERIFY_CRC32C:
4963845591fadea480177223e28c9d1c03642d34f0eJens Axboe		case VERIFY_CRC32C_INTEL:
497bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe			ret = verify_io_u_crc32c(hdr, io_u, hdr_num);
498bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe			break;
4993f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC32:
5003f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			ret = verify_io_u_crc32(hdr, io_u, hdr_num);
5013f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
5023f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC16:
5033f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			ret = verify_io_u_crc16(hdr, io_u, hdr_num);
5043f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
5053f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC7:
5063f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			ret = verify_io_u_crc7(hdr, io_u, hdr_num);
5073f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
508cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA256:
509cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			ret = verify_io_u_sha256(hdr, io_u, hdr_num);
510cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
511cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA512:
512cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			ret = verify_io_u_sha512(hdr, io_u, hdr_num);
513cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
5147437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		case VERIFY_META:
5157437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis			ret = verify_io_u_meta(hdr, td, io_u, hdr_num);
5167437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis			break;
5173f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		default:
5183f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			log_err("Bad verify type %u\n", hdr->verify_type);
519d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe			ret = EINVAL;
5203f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		}
5213f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis	}
522a7dfe862c2e3fe72b8db6a6e67302048d3731c6dJens Axboe
523a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe	return ret;
524e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
525e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
5267437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic void fill_meta(struct verify_header *hdr, struct thread_data *td,
5275ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		      struct io_u *io_u, unsigned int header_num)
5287437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{
5297437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	struct vhdr_meta *vh = hdr_priv(hdr);
5307437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
5317437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->thread = td->thread_number;
5327437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
5337437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->time_sec = io_u->start_time.tv_sec;
5347437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->time_usec = io_u->start_time.tv_usec;
5357437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
5367437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->numberio = td->io_issues[DDIR_WRITE];
5377437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
5387437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->offset = io_u->offset + header_num * td->o.verify_interval;
5397437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis}
5407437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
541cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha512(struct verify_header *hdr, void *p, unsigned int len)
542cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
543546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha512 *vh = hdr_priv(hdr);
544cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha512_ctx sha512_ctx = {
545546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.buf = vh->sha512,
546cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
547cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
548cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha512_init(&sha512_ctx);
549cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha512_update(&sha512_ctx, p, len);
550cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
551cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
552cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha256(struct verify_header *hdr, void *p, unsigned int len)
553cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
554546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha256 *vh = hdr_priv(hdr);
555cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha256_ctx sha256_ctx = {
556546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.buf = vh->sha256,
557cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
558cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
559cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha256_init(&sha256_ctx);
560cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha256_update(&sha256_ctx, p, len);
561cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
562cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
5631e154bdbf14a1d352117aea057035235b66f0381Jens Axboestatic void fill_crc7(struct verify_header *hdr, void *p, unsigned int len)
5641e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{
565546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc7 *vh = hdr_priv(hdr);
566546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
567546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc7 = crc7(p, len);
5681e154bdbf14a1d352117aea057035235b66f0381Jens Axboe}
5691e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
570969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboestatic void fill_crc16(struct verify_header *hdr, void *p, unsigned int len)
571969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{
572546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc16 *vh = hdr_priv(hdr);
573546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
574546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc16 = crc16(p, len);
575969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe}
576969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
577e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_crc32(struct verify_header *hdr, void *p, unsigned int len)
578e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
579546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
580546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
581546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc32 = crc32(p, len);
582e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
583e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
584bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboestatic void fill_crc32c(struct verify_header *hdr, void *p, unsigned int len)
585bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{
586bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
587bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
5883845591fadea480177223e28c9d1c03642d34f0eJens Axboe	if (hdr->verify_type == VERIFY_CRC32C_INTEL)
5893845591fadea480177223e28c9d1c03642d34f0eJens Axboe		vh->crc32 = crc32c_intel(p, len);
5903845591fadea480177223e28c9d1c03642d34f0eJens Axboe	else
5913845591fadea480177223e28c9d1c03642d34f0eJens Axboe		vh->crc32 = crc32c(p, len);
592bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe}
593bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
594d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboestatic void fill_crc64(struct verify_header *hdr, void *p, unsigned int len)
595d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{
596546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc64 *vh = hdr_priv(hdr);
597546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
598546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc64 = crc64(p, len);
599d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe}
600d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
601e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_md5(struct verify_header *hdr, void *p, unsigned int len)
602e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
603546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_md5 *vh = hdr_priv(hdr);
6048c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	struct md5_ctx md5_ctx = {
605546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.hash = (uint32_t *) vh->md5_digest,
6068c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	};
607e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
60861f821f16cf27d8742e09b3a137c933cd0085e9bJens Axboe	md5_init(&md5_ctx);
609e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	md5_update(&md5_ctx, p, len);
610e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
611e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
612e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe/*
613e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * fill body of io_u->buf with random data and add a header with the
614e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * crc32 or md5 sum of that data.
615e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe */
616e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboevoid populate_verify_io_u(struct thread_data *td, struct io_u *io_u)
617e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
618baefa9beacca430b8e3275c07d2f46ef14654468Jens Axboe	struct verify_header *hdr;
61995646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe	void *p = io_u->buf, *data;
6207437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	unsigned int hdr_inc, data_len, header_num = 0;
621e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
6229cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe	if (td->o.verify == VERIFY_NULL)
6239cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe		return;
6249cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe
62590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	fill_pattern(td, p, io_u->buflen);
626546a9142511875524850ac92776184fd9fb7196eShawn Lewis
627546a9142511875524850ac92776184fd9fb7196eShawn Lewis	hdr_inc = io_u->buflen;
628a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe	if (td->o.verify_interval)
629a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe		hdr_inc = td->o.verify_interval;
630baefa9beacca430b8e3275c07d2f46ef14654468Jens Axboe
6315ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	for (; p < io_u->buf + io_u->buflen; p += hdr_inc) {
63295646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe		hdr = p;
6333f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis
6343f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		hdr->fio_magic = FIO_HDR_MAGIC;
6353f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		hdr->verify_type = td->o.verify;
636546a9142511875524850ac92776184fd9fb7196eShawn Lewis		hdr->len = hdr_inc;
6378767783245faac99a7e1c330a1d6536e579c8402Jens Axboe		data_len = hdr_inc - hdr_size(hdr);
6383f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis
6398767783245faac99a7e1c330a1d6536e579c8402Jens Axboe		data = p + hdr_size(hdr);
6403f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		switch (td->o.verify) {
6413f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_MD5:
642bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "fill md5 io_u %p, len %u\n",
643bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe							io_u, hdr->len);
6443f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			fill_md5(hdr, data, data_len);
6453f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
6463f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC64:
647bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "fill crc64 io_u %p, len %u\n",
648bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe							io_u, hdr->len);
6493f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			fill_crc64(hdr, data, data_len);
6503f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
651bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe		case VERIFY_CRC32C:
6523845591fadea480177223e28c9d1c03642d34f0eJens Axboe		case VERIFY_CRC32C_INTEL:
653bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe			dprint(FD_VERIFY, "fill crc32c io_u %p, len %u\n",
654bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe							io_u, hdr->len);
655bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe			fill_crc32c(hdr, data, data_len);
656bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe			break;
6573f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC32:
658bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "fill crc32 io_u %p, len %u\n",
659bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe							io_u, hdr->len);
6603f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			fill_crc32(hdr, data, data_len);
6613f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
6623f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC16:
663bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "fill crc16 io_u %p, len %u\n",
664bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe							io_u, hdr->len);
6653f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			fill_crc16(hdr, data, data_len);
6663f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
6673f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC7:
668bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "fill crc7 io_u %p, len %u\n",
669bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe							io_u, hdr->len);
6703f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			fill_crc7(hdr, data, data_len);
6713f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
672cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA256:
673bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "fill sha256 io_u %p, len %u\n",
674bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe							io_u, hdr->len);
675cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			fill_sha256(hdr, data, data_len);
676cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
677cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA512:
678bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "fill sha512 io_u %p, len %u\n",
679bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe							io_u, hdr->len);
680cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			fill_sha512(hdr, data, data_len);
681cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
6827437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		case VERIFY_META:
683bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "fill meta io_u %p, len %u\n",
684bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe							io_u, hdr->len);
6857437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis			fill_meta(hdr, td, io_u, header_num);
6867437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis			break;
6873f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		default:
6883f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			log_err("fio: bad verify type: %d\n", td->o.verify);
6893f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			assert(0);
6903f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		}
691a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe		if (td->o.verify_offset)
6928767783245faac99a7e1c330a1d6536e579c8402Jens Axboe			memswp(p, p + td->o.verify_offset, hdr_size(hdr));
6937437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		header_num++;
694e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	}
695e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
696e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
697e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboeint get_next_verify(struct thread_data *td, struct io_u *io_u)
698e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
6998de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	struct io_piece *ipo = NULL;
700e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
701d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	/*
702d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	 * this io_u is from a requeue, we already filled the offsets
703d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	 */
704d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	if (io_u->file)
705d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe		return 0;
706d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe
7078de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	if (!RB_EMPTY_ROOT(&td->io_hist_tree)) {
7088de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe		struct rb_node *n = rb_first(&td->io_hist_tree);
709e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
7108de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe		ipo = rb_entry(n, struct io_piece, rb_node);
7114b87898e8d76aaf05baec83077a11311c1447397Jens Axboe		rb_erase(n, &td->io_hist_tree);
71201743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe	} else if (!flist_empty(&td->io_hist_list)) {
71301743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe		ipo = flist_entry(td->io_hist_list.next, struct io_piece, list);
71401743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe		flist_del(&ipo->list);
7158de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	}
716e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
7178de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	if (ipo) {
718e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->offset = ipo->offset;
719e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->buflen = ipo->len;
72036167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->file = ipo->file;
72197af62cec418cd722fb43c6010d6430534e12353Jens Axboe
722d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe		if (!fio_file_open(io_u->file)) {
72397af62cec418cd722fb43c6010d6430534e12353Jens Axboe			int r = td_io_open_file(td, io_u->file);
72497af62cec418cd722fb43c6010d6430534e12353Jens Axboe
725bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			if (r) {
726bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe				dprint(FD_VERIFY, "failed file %s open\n",
727bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe						io_u->file->file_name);
72897af62cec418cd722fb43c6010d6430534e12353Jens Axboe				return 1;
729bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			}
73097af62cec418cd722fb43c6010d6430534e12353Jens Axboe		}
73197af62cec418cd722fb43c6010d6430534e12353Jens Axboe
73297af62cec418cd722fb43c6010d6430534e12353Jens Axboe		get_file(ipo->file);
733d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe		assert(fio_file_open(io_u->file));
734e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->ddir = DDIR_READ;
73536167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->xfer_buf = io_u->buf;
73636167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->xfer_buflen = io_u->buflen;
737e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		free(ipo);
738bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "get_next_verify: ret io_u %p\n", io_u);
739e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		return 0;
740e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	}
741e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
742bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "get_next_verify: empty\n");
743e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	return 1;
744e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
745e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
746e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboestatic void *verify_async_thread(void *data)
747e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
748e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	struct thread_data *td = data;
749e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	struct io_u *io_u;
750e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	int ret = 0;
751e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
752e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	if (td->o.verify_cpumask_set &&
753e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	    fio_setaffinity(td->pid, td->o.verify_cpumask)) {
754e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		log_err("fio: failed setting verify thread affinity\n");
755e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		goto done;
756e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	}
757e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
758e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	do {
759e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		FLIST_HEAD(list);
760e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe
761e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		read_barrier();
762e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		if (td->verify_thread_exit)
763e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			break;
764e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
765e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		pthread_mutex_lock(&td->io_u_lock);
766e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
767e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		while (flist_empty(&td->verify_list) &&
768e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		       !td->verify_thread_exit) {
769e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			ret = pthread_cond_wait(&td->verify_cond, &td->io_u_lock);
770e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			if (ret) {
771e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe				pthread_mutex_unlock(&td->io_u_lock);
772e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe				break;
773e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			}
774e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		}
775e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
776e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		flist_splice_init(&td->verify_list, &list);
777e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		pthread_mutex_unlock(&td->io_u_lock);
778e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe
779e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		if (flist_empty(&list))
780e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			continue;
781e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
782e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		while (!flist_empty(&list)) {
783e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe			io_u = flist_entry(list.next, struct io_u, list);
784e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe			flist_del_init(&io_u->list);
785e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
786d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			ret = verify_io_u(td, io_u);
787e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe			put_io_u(td, io_u);
788d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			if (!ret)
789d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				continue;
790d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			if (td->o.continue_on_error &&
791d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			    td_non_fatal_error(ret)) {
792d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				update_error_count(td, ret);
793d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				td_clear_error(td);
794d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				ret = 0;
795d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			}
796e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		}
797e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	} while (!ret);
798e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
799d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe	if (ret) {
800d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe		td_verror(td, ret, "async_verify");
801d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe		td->terminate = 1;
802d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe	}
803d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe
804e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboedone:
805e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_lock(&td->io_u_lock);
806e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->nr_verify_threads--;
807e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_unlock(&td->io_u_lock);
808e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
809e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_cond_signal(&td->free_cond);
810e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	return NULL;
811e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
812e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
813e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_async_init(struct thread_data *td)
814e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
815e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	int i, ret;
816e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
817e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_thread_exit = 0;
818e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
819e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_threads = malloc(sizeof(pthread_t) * td->o.verify_async);
820e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	for (i = 0; i < td->o.verify_async; i++) {
821e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		ret = pthread_create(&td->verify_threads[i], NULL,
822e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe					verify_async_thread, td);
823e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		if (ret) {
824e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			log_err("fio: async verify creation failed: %s\n",
825e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe					strerror(ret));
826e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			break;
827e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		}
828e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		ret = pthread_detach(td->verify_threads[i]);
829e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		if (ret) {
830e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			log_err("fio: async verify thread detach failed: %s\n",
831e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe					strerror(ret));
832e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			break;
833e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		}
834e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		td->nr_verify_threads++;
835e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	}
836e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
837e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	if (i != td->o.verify_async) {
838e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		td->verify_thread_exit = 1;
839e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		write_barrier();
840e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		pthread_cond_broadcast(&td->verify_cond);
841e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		return 1;
842e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	}
843e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
844e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	return 0;
845e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
846e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
847e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboevoid verify_async_exit(struct thread_data *td)
848e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
849e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_thread_exit = 1;
850e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	write_barrier();
851e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_cond_broadcast(&td->verify_cond);
852e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
853e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_lock(&td->io_u_lock);
854e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
855e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	while (td->nr_verify_threads)
856e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		pthread_cond_wait(&td->free_cond, &td->io_u_lock);
857e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
858e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_unlock(&td->io_u_lock);
859e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	free(td->verify_threads);
860e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_threads = NULL;
861e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
862