verify.c revision d7ee2a7d431c2cabdf56d04ca14805cad72cf985
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>
979402a12eecf371238f2326c9e8850eedd269b7fJens Axboe#include <libgen.h>
10e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
11e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe#include "fio.h"
124f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe#include "verify.h"
13e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe#include "smalloc.h"
140d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe#include "trim.h"
15637ef8d9f7645135cf4829894d1e3983cd7a042eJens Axboe#include "lib/rand.h"
16e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
17eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/md5.h"
18eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc64.h"
19eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc32.h"
20bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe#include "crc/crc32c.h"
21eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc16.h"
22eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc7.h"
23eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/sha256.h"
24eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/sha512.h"
257c353ceb3257b132f4c98326046b42201e070731Jens Axboe#include "crc/sha1.h"
26cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
277d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void populate_hdr(struct thread_data *td, struct io_u *io_u,
287d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			 struct verify_header *hdr, unsigned int header_num,
297d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			 unsigned int header_len);
307d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
317d9fb455aadc0c0363489591775496f27f4a560aJens Axboevoid fill_pattern(struct thread_data *td, void *p, unsigned int len, struct io_u *io_u, unsigned long seed, int use_seed)
3290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe{
3390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	switch (td->o.verify_pattern_bytes) {
3490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	case 0:
35bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "fill random bytes len=%u\n", len);
367d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		if (use_seed)
377d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			__fill_random_buf(p, len, seed);
387d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		else
393545a109a2cfe5ab22969ef453dc049db47f0b68Jens Axboe			io_u->rand_seed = fill_random_buf(&td->buf_state, p, len);
4090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		break;
4190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	case 1:
42efda12bde9d13663e5cfe4ddf677bae54075fd92Jens Axboe		/*
43efda12bde9d13663e5cfe4ddf677bae54075fd92Jens Axboe		 * See below write barrier comment
44efda12bde9d13663e5cfe4ddf677bae54075fd92Jens Axboe		 */
45efda12bde9d13663e5cfe4ddf677bae54075fd92Jens Axboe#if 0
46efda12bde9d13663e5cfe4ddf677bae54075fd92Jens Axboe		read_barrier();
4710e8a7b30ce2917df9f839d42596c7e3af9a904fRadha Ramachandran		if (io_u->buf_filled_len >= len) {
48cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran			dprint(FD_VERIFY, "using already filled verify pattern b=0 len=%u\n", len);
49cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran			return;
50cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran		}
51efda12bde9d13663e5cfe4ddf677bae54075fd92Jens Axboe#endif
52bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "fill verify pattern b=0 len=%u\n", len);
530e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran		memset(p, td->o.verify_pattern[0], len);
54efda12bde9d13663e5cfe4ddf677bae54075fd92Jens Axboe		/*
55efda12bde9d13663e5cfe4ddf677bae54075fd92Jens Axboe		 * We need to ensure that the pattern stores are seen before
56efda12bde9d13663e5cfe4ddf677bae54075fd92Jens Axboe		 * the fill length store, or we could observe headers that
57efda12bde9d13663e5cfe4ddf677bae54075fd92Jens Axboe		 * aren't valid to the extent notified by the fill length
58efda12bde9d13663e5cfe4ddf677bae54075fd92Jens Axboe		 */
59efda12bde9d13663e5cfe4ddf677bae54075fd92Jens Axboe		write_barrier();
60cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran		io_u->buf_filled_len = len;
6190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		break;
620e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran	default: {
630e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran		unsigned int i = 0, size = 0;
6490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		unsigned char *b = p;
6590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe
66efda12bde9d13663e5cfe4ddf677bae54075fd92Jens Axboe#if 0
67efda12bde9d13663e5cfe4ddf677bae54075fd92Jens Axboe		read_barrier();
6810e8a7b30ce2917df9f839d42596c7e3af9a904fRadha Ramachandran		if (io_u->buf_filled_len >= len) {
69cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran			dprint(FD_VERIFY, "using already filled verify pattern b=%d len=%u\n",
70cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran					td->o.verify_pattern_bytes, len);
71cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran			return;
72cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran		}
73efda12bde9d13663e5cfe4ddf677bae54075fd92Jens Axboe#endif
74bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "fill verify pattern b=%d len=%u\n",
75bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe					td->o.verify_pattern_bytes, len);
76bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
7790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		while (i < len) {
780e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran			size = td->o.verify_pattern_bytes;
790e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran			if (size > (len - i))
800e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran				size = len - i;
810e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran			memcpy(b+i, td->o.verify_pattern, size);
820e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran			i += size;
8390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		}
84efda12bde9d13663e5cfe4ddf677bae54075fd92Jens Axboe		write_barrier();
85cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran		io_u->buf_filled_len = len;
8690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		break;
8790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		}
8890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	}
8990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe}
9090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe
91cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboestatic unsigned int get_hdr_inc(struct thread_data *td, struct io_u *io_u)
92cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe{
93cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe	unsigned int hdr_inc;
94cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe
95cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe	hdr_inc = io_u->buflen;
96cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe	if (td->o.verify_interval)
97cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe		hdr_inc = td->o.verify_interval;
98cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe
99cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe	return hdr_inc;
100cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe}
101cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe
102c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboestatic void fill_pattern_headers(struct thread_data *td, struct io_u *io_u,
103c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe				 unsigned long seed, int use_seed)
104c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe{
105c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	unsigned int hdr_inc, header_num;
106c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	struct verify_header *hdr;
107c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	void *p = io_u->buf;
108c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe
109c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	fill_pattern(td, p, io_u->buflen, io_u, seed, use_seed);
110c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe
111cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe	hdr_inc = get_hdr_inc(td, io_u);
112c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	header_num = 0;
113c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	for (; p < io_u->buf + io_u->buflen; p += hdr_inc) {
114c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe		hdr = p;
115c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe		populate_hdr(td, io_u, hdr, header_num, hdr_inc);
116c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe		header_num++;
117c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	}
118c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe}
119c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe
1204764aec9fe5988281bdc114c13ac771fb16713ccJens Axboestatic void memswp(void *buf1, void *buf2, unsigned int len)
121546a9142511875524850ac92776184fd9fb7196eShawn Lewis{
122dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis	char swap[200];
123dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis
124dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis	assert(len <= sizeof(swap));
12590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe
126546a9142511875524850ac92776184fd9fb7196eShawn Lewis	memcpy(&swap, buf1, len);
127546a9142511875524850ac92776184fd9fb7196eShawn Lewis	memcpy(buf1, buf2, len);
128546a9142511875524850ac92776184fd9fb7196eShawn Lewis	memcpy(buf2, &swap, len);
129546a9142511875524850ac92776184fd9fb7196eShawn Lewis}
130546a9142511875524850ac92776184fd9fb7196eShawn Lewis
131e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void hexdump(void *buffer, int len)
132e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
133e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	unsigned char *p = buffer;
134e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	int i;
135e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
136e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	for (i = 0; i < len; i++)
137bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		log_err("%02x", p[i]);
138bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_err("\n");
139e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
140e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
141d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe/*
1428767783245faac99a7e1c330a1d6536e579c8402Jens Axboe * Prepare for seperation of verify_header and checksum header
1438767783245faac99a7e1c330a1d6536e579c8402Jens Axboe */
144546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic inline unsigned int __hdr_size(int verify_type)
1458767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{
14603e20d687566753b90383571e5e152c5142bdffdBruce Cran	unsigned int len = 0;
1478767783245faac99a7e1c330a1d6536e579c8402Jens Axboe
148546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	switch (verify_type) {
149546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_NONE:
150546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_NULL:
151546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = 0;
152546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
153546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_MD5:
154546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_md5);
155546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
156546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC64:
157546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc64);
158546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
159bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	case VERIFY_CRC32C:
160546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC32:
1613845591fadea480177223e28c9d1c03642d34f0eJens Axboe	case VERIFY_CRC32C_INTEL:
162546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc32);
163546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
164546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC16:
165546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc16);
166546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
167546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC7:
168546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc7);
169546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
170546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_SHA256:
171546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_sha256);
172546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
173546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_SHA512:
174546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_sha512);
175546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
1767437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	case VERIFY_META:
1777437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		len = sizeof(struct vhdr_meta);
1787437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		break;
1797c353ceb3257b132f4c98326046b42201e070731Jens Axboe	case VERIFY_SHA1:
1807c353ceb3257b132f4c98326046b42201e070731Jens Axboe		len = sizeof(struct vhdr_sha1);
1817c353ceb3257b132f4c98326046b42201e070731Jens Axboe		break;
18292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	case VERIFY_PATTERN:
18392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		len = 0;
18492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		break;
185546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	default:
186546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		log_err("fio: unknown verify header!\n");
187546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		assert(0);
188546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	}
189546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
190546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	return len + sizeof(struct verify_header);
1918767783245faac99a7e1c330a1d6536e579c8402Jens Axboe}
1928767783245faac99a7e1c330a1d6536e579c8402Jens Axboe
1938767783245faac99a7e1c330a1d6536e579c8402Jens Axboestatic inline unsigned int hdr_size(struct verify_header *hdr)
1948767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{
195546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	return __hdr_size(hdr->verify_type);
196546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe}
197546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
198546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic void *hdr_priv(struct verify_header *hdr)
199546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe{
200546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	void *priv = hdr;
201546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
202546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	return priv + sizeof(struct verify_header);
2038767783245faac99a7e1c330a1d6536e579c8402Jens Axboe}
2048767783245faac99a7e1c330a1d6536e579c8402Jens Axboe
2058767783245faac99a7e1c330a1d6536e579c8402Jens Axboe/*
206936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * Verify container, pass info to verify handlers and allow them to
207936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * pass info back in case of error
208936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe */
209936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestruct vcont {
210936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	/*
211936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	 * Input
212936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	 */
213936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	struct io_u *io_u;
214936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	unsigned int hdr_num;
2157d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	struct thread_data *td;
216936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe
217936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	/*
218936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	 * Output, only valid in case of error
219936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	 */
220bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	const char *name;
221bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	void *good_crc;
222bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	void *bad_crc;
223936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	unsigned int crc_len;
224936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe};
225936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe
226c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboestatic void dump_buf(char *buf, unsigned int len, unsigned long long offset,
227c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe		     const char *type, struct fio_file *f)
2287d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{
2296f260b317f4cec3027f79b8b329dd3f98c3906acJens Axboe	char *ptr, fname[256];
2307d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	int ret, fd;
2317d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2326f260b317f4cec3027f79b8b329dd3f98c3906acJens Axboe	ptr = strdup(f->file_name);
2336f260b317f4cec3027f79b8b329dd3f98c3906acJens Axboe	strcpy(fname, basename(ptr));
234c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe
235c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	sprintf(fname + strlen(fname), ".%llu.%s", offset, type);
2367d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2377d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	fd = open(fname, O_CREAT | O_TRUNC | O_WRONLY, 0644);
2387d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	if (fd < 0) {
2397d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		perror("open verify buf file");
2407d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		return;
2417d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	}
2427d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2437d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	while (len) {
2447d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		ret = write(fd, buf, len);
2457d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		if (!ret)
2467d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			break;
2477d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		else if (ret < 0) {
2487d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			perror("write verify buf file");
2497d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			break;
2507d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		}
2517d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		len -= ret;
2527d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		buf += ret;
2537d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	}
2547d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2557d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	close(fd);
256c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	log_err("       %s data dumped as %s\n", type, fname);
2576f260b317f4cec3027f79b8b329dd3f98c3906acJens Axboe	free(ptr);
2587d9fb455aadc0c0363489591775496f27f4a560aJens Axboe}
2597d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
260c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe/*
261c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * Dump the contents of the read block and re-generate the correct data
262c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * and dump that too.
263c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe */
2647d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void dump_verify_buffers(struct verify_header *hdr, struct vcont *vc)
2657d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{
2667d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	struct thread_data *td = vc->td;
2677d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	struct io_u *io_u = vc->io_u;
2687d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	unsigned long hdr_offset;
2697d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	struct io_u dummy;
270c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	void *buf;
2717d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2720dce9bc9b21a8d91aa55a29258dfaeffc57bd466Steven Lang	if (!td->o.verify_dump)
2730dce9bc9b21a8d91aa55a29258dfaeffc57bd466Steven Lang		return;
2740dce9bc9b21a8d91aa55a29258dfaeffc57bd466Steven Lang
275c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	/*
276c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	 * Dump the contents we just read off disk
277c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	 */
2787d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	hdr_offset = vc->hdr_num * hdr->len;
2797d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
280c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	dump_buf(io_u->buf + hdr_offset, hdr->len, io_u->offset + hdr_offset,
281c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe			"received", vc->io_u->file);
2827d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
283c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	/*
284c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	 * Allocate a new buf and re-generate the original data
285c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	 */
286c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	buf = malloc(io_u->buflen);
2877d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	dummy = *io_u;
288c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	dummy.buf = buf;
2894aae38a645f3315ca2f8cc57a7ec4110ba7d8319Jens Axboe	dummy.rand_seed = hdr->rand_seed;
290cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe	dummy.buf_filled_len = 0;
2917d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
292c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	fill_pattern_headers(td, &dummy, hdr->rand_seed, 1);
2937d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
294c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	dump_buf(buf + hdr_offset, hdr->len, io_u->offset + hdr_offset,
295c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe			"expected", vc->io_u->file);
2967d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	free(buf);
2977d9fb455aadc0c0363489591775496f27f4a560aJens Axboe}
2987d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
299bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboestatic void log_verify_failure(struct verify_header *hdr, struct vcont *vc)
300bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe{
301bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	unsigned long long offset;
302bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe
303bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	offset = vc->io_u->offset;
304bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	offset += vc->hdr_num * hdr->len;
30532c17adf7f75da1f0957d4691633fea60259910fJens Axboe	log_err("%.8s: verify failed at file %s offset %llu, length %u\n",
30632c17adf7f75da1f0957d4691633fea60259910fJens Axboe			vc->name, vc->io_u->file->file_name, offset, hdr->len);
307bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe
308bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (vc->good_crc && vc->bad_crc) {
309bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		log_err("       Expected CRC: ");
310bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		hexdump(vc->good_crc, vc->crc_len);
311bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		log_err("       Received CRC: ");
312bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		hexdump(vc->bad_crc, vc->crc_len);
313bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	}
3147d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
3157d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	dump_verify_buffers(hdr, vc);
316bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe}
317bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe
318936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe/*
319d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe * Return data area 'header_num'
320d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe */
321936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic inline void *io_u_verify_off(struct verify_header *hdr, struct vcont *vc)
322d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe{
323936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	return vc->io_u->buf + vc->hdr_num * hdr->len + hdr_size(hdr);
324d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe}
325d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe
32692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboestatic unsigned int hweight8(unsigned int w)
32792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe{
32892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	unsigned int res = w - ((w >> 1) & 0x55);
32992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe
33092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	res = (res & 0x33) + ((res >> 2) & 0x33);
33192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	return (res + (res >> 4)) & 0x0F;
33292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe}
33392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe
33492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboestatic int verify_io_u_pattern(struct verify_header *hdr, struct vcont *vc)
33592bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe{
33692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	struct thread_data *td = vc->td;
33792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	struct io_u *io_u = vc->io_u;
33892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	char *buf, *pattern;
3392b13e716c0921356c0930522718e00b8df34293aJens Axboe	unsigned int header_size = __hdr_size(td->o.verify);
34092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	unsigned int len, mod, i;
34192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe
34292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	pattern = td->o.verify_pattern;
3432b13e716c0921356c0930522718e00b8df34293aJens Axboe	buf = (void *) hdr + header_size;
3442b13e716c0921356c0930522718e00b8df34293aJens Axboe	len = get_hdr_inc(td, io_u) - header_size;
3452b13e716c0921356c0930522718e00b8df34293aJens Axboe	mod = header_size % td->o.verify_pattern_bytes;
34692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe
34792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	for (i = 0; i < len; i++) {
34892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		if (buf[i] != pattern[mod]) {
34992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			unsigned int bits;
35092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe
35192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			bits = hweight8(buf[i] ^ pattern[mod]);
35292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			log_err("fio: got pattern %x, wanted %x. Bad bits %d\n",
35392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe				buf[i], pattern[mod], bits);
35492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			log_err("fio: bad pattern block offset %u\n", i);
35592bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			dump_verify_buffers(hdr, vc);
35692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			return EILSEQ;
35792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		}
35892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		mod++;
35992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		if (mod == td->o.verify_pattern_bytes)
36092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			mod = 0;
36192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	}
36292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe
36392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	return 0;
36492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe}
36592bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe
36692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboestatic int verify_io_u_meta(struct verify_header *hdr, struct vcont *vc)
3677437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{
36892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	struct thread_data *td = vc->td;
3697437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	struct vhdr_meta *vh = hdr_priv(hdr);
370936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	struct io_u *io_u = vc->io_u;
37192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	int ret = EILSEQ;
3727437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
373bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "meta verify io_u %p, len %u\n", io_u, hdr->len);
374bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
375bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (vh->offset == io_u->offset + vc->hdr_num * td->o.verify_interval)
37692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		ret = 0;
37792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe
37892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	if (td->o.verify_pattern_bytes)
37992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		ret |= verify_io_u_pattern(hdr, vc);
38092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe
38192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	if (!ret)
382bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
3837437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
384bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "meta";
385bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
38692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	return ret;
3877437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis}
3887437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
389936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha512(struct verify_header *hdr, struct vcont *vc)
390cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
391936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
392546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha512 *vh = hdr_priv(hdr);
393cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	uint8_t sha512[128];
394cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha512_ctx sha512_ctx = {
395cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		.buf = sha512,
396cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
397cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
398936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "sha512 verify io_u %p, len %u\n", vc->io_u, hdr->len);
399bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
400cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha512_init(&sha512_ctx);
4018767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	sha512_update(&sha512_ctx, p, hdr->len - hdr_size(hdr));
402cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
403bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (!memcmp(vh->sha512, sha512_ctx.buf, sizeof(sha512)))
404bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
405cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
406bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "sha512";
407bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = vh->sha512;
408bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = sha512_ctx.buf;
409bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = sizeof(vh->sha512);
410bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
411bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
412cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
413cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
414936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha256(struct verify_header *hdr, struct vcont *vc)
415cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
416936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
417546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha256 *vh = hdr_priv(hdr);
418bc77f56f79f6ae155e9eb26263ed686ef28b47ecJens Axboe	uint8_t sha256[64];
419cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha256_ctx sha256_ctx = {
420cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		.buf = sha256,
421cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
422cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
423936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "sha256 verify io_u %p, len %u\n", vc->io_u, hdr->len);
424bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
425cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha256_init(&sha256_ctx);
4268767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	sha256_update(&sha256_ctx, p, hdr->len - hdr_size(hdr));
427cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
428bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (!memcmp(vh->sha256, sha256_ctx.buf, sizeof(sha256)))
429bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
430cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
431bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "sha256";
432bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = vh->sha256;
433bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = sha256_ctx.buf;
434bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = sizeof(vh->sha256);
435bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
436bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
437cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
438cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
439936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha1(struct verify_header *hdr, struct vcont *vc)
4407c353ceb3257b132f4c98326046b42201e070731Jens Axboe{
441936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
4427c353ceb3257b132f4c98326046b42201e070731Jens Axboe	struct vhdr_sha1 *vh = hdr_priv(hdr);
4437c353ceb3257b132f4c98326046b42201e070731Jens Axboe	uint32_t sha1[5];
4447c353ceb3257b132f4c98326046b42201e070731Jens Axboe	struct sha1_ctx sha1_ctx = {
4457c353ceb3257b132f4c98326046b42201e070731Jens Axboe		.H = sha1,
4467c353ceb3257b132f4c98326046b42201e070731Jens Axboe	};
4477c353ceb3257b132f4c98326046b42201e070731Jens Axboe
448936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "sha1 verify io_u %p, len %u\n", vc->io_u, hdr->len);
4497c353ceb3257b132f4c98326046b42201e070731Jens Axboe
4507c353ceb3257b132f4c98326046b42201e070731Jens Axboe	sha1_init(&sha1_ctx);
4517c353ceb3257b132f4c98326046b42201e070731Jens Axboe	sha1_update(&sha1_ctx, p, hdr->len - hdr_size(hdr));
4527c353ceb3257b132f4c98326046b42201e070731Jens Axboe
453bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (!memcmp(vh->sha1, sha1_ctx.H, sizeof(sha1)))
454bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
4557c353ceb3257b132f4c98326046b42201e070731Jens Axboe
456bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "sha1";
457bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = vh->sha1;
458bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = sha1_ctx.H;
459bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = sizeof(vh->sha1);
460bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
461bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
4627c353ceb3257b132f4c98326046b42201e070731Jens Axboe}
4637c353ceb3257b132f4c98326046b42201e070731Jens Axboe
464936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc7(struct verify_header *hdr, struct vcont *vc)
4651e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{
466936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
467546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc7 *vh = hdr_priv(hdr);
4681e154bdbf14a1d352117aea057035235b66f0381Jens Axboe	unsigned char c;
4691e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
470936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc7 verify io_u %p, len %u\n", vc->io_u, hdr->len);
471bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
4728767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc7(p, hdr->len - hdr_size(hdr));
4731e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
474bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc7)
475bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
4761e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
477bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc7";
478bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc7;
479bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
480bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 1;
481bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
482bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
4831e154bdbf14a1d352117aea057035235b66f0381Jens Axboe}
4841e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
485936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc16(struct verify_header *hdr, struct vcont *vc)
486969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{
487936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
488546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc16 *vh = hdr_priv(hdr);
489969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe	unsigned short c;
490969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
491936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc16 verify io_u %p, len %u\n", vc->io_u, hdr->len);
492bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
4938767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc16(p, hdr->len - hdr_size(hdr));
494969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
495bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc16)
496bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
497969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
498bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc16";
499bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc16;
500bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
501bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 2;
502bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
503bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
504969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe}
505969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
506936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc64(struct verify_header *hdr, struct vcont *vc)
507d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{
508936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
509546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc64 *vh = hdr_priv(hdr);
510d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe	unsigned long long c;
511d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
512936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc64 verify io_u %p, len %u\n", vc->io_u, hdr->len);
513bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
5148767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc64(p, hdr->len - hdr_size(hdr));
515d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
516bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc64)
517bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
518d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
519bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc64";
520bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc64;
521bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
522bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 8;
523bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
524bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
525d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe}
526d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
527936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc32(struct verify_header *hdr, struct vcont *vc)
528e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
529936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
530546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
531546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	uint32_t c;
532e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
533936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc32 verify io_u %p, len %u\n", vc->io_u, hdr->len);
534bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
5358767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc32(p, hdr->len - hdr_size(hdr));
536e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
537bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc32)
538bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
539e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
540bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc32";
541bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc32;
542bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
543bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 4;
544bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
545bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
546e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
547e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
548936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc32c(struct verify_header *hdr, struct vcont *vc)
549bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{
550936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
551bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
552bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	uint32_t c;
553bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
554936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc32c verify io_u %p, len %u\n", vc->io_u, hdr->len);
555bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
5563845591fadea480177223e28c9d1c03642d34f0eJens Axboe	if (hdr->verify_type == VERIFY_CRC32C_INTEL)
5573845591fadea480177223e28c9d1c03642d34f0eJens Axboe		c = crc32c_intel(p, hdr->len - hdr_size(hdr));
5583845591fadea480177223e28c9d1c03642d34f0eJens Axboe	else
5593845591fadea480177223e28c9d1c03642d34f0eJens Axboe		c = crc32c(p, hdr->len - hdr_size(hdr));
560bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
561bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc32)
562bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
563bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
564bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc32c";
565bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc32;
566bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
567bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 4;
568bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
569bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
570bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe}
571bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
572936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_md5(struct verify_header *hdr, struct vcont *vc)
573e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
574936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
575546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_md5 *vh = hdr_priv(hdr);
5768c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	uint32_t hash[MD5_HASH_WORDS];
5778c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	struct md5_ctx md5_ctx = {
5788c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe		.hash = hash,
5798c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	};
580e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
581936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "md5 verify io_u %p, len %u\n", vc->io_u, hdr->len);
582bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
58361f821f16cf27d8742e09b3a137c933cd0085e9bJens Axboe	md5_init(&md5_ctx);
5848767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	md5_update(&md5_ctx, p, hdr->len - hdr_size(hdr));
585e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
586bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (!memcmp(vh->md5_digest, md5_ctx.hash, sizeof(hash)))
587bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
588e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
589bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "md5";
590bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = vh->md5_digest;
591bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = md5_ctx.hash;
592bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = sizeof(hash);
593bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
594bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
595e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
596e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
597e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe/*
598e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe * Push IO verification to a separate thread
599e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe */
600e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_io_u_async(struct thread_data *td, struct io_u *io_u)
601e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
602e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	if (io_u->file)
603e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		put_file_log(td, io_u->file);
604e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
605e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_lock(&td->io_u_lock);
606d7ee2a7d431c2cabdf56d04ca14805cad72cf985Steven Lang
6070c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran	if (io_u->flags & IO_U_F_IN_CUR_DEPTH) {
6080c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran		td->cur_depth--;
6090c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran		io_u->flags &= ~IO_U_F_IN_CUR_DEPTH;
6100c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran	}
611e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	flist_del(&io_u->list);
612e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	flist_add_tail(&io_u->list, &td->verify_list);
6132ecc1b57721e3cb72bbf558bc169c97037fe3d0aJens Axboe	io_u->flags |= IO_U_F_FREE_DEF;
614e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_unlock(&td->io_u_lock);
615e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
616e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_cond_signal(&td->verify_cond);
617e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	return 0;
618e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
619e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
6200d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboestatic int verify_trimmed_io_u(struct thread_data *td, struct io_u *io_u)
6210d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe{
6220d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	static char zero_buf[1024];
6230d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	unsigned int this_len, len;
6240d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	int ret = 0;
6250d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	void *p;
6260d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
6270d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	if (!td->o.trim_zero)
6280d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		return 0;
6290d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
6300d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	len = io_u->buflen;
6310d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	p = io_u->buf;
6320d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	do {
6330d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		this_len = sizeof(zero_buf);
6340d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		if (this_len > len)
6350d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe			this_len = len;
6360d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		if (memcmp(p, zero_buf, this_len)) {
6370d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe			ret = EILSEQ;
6380d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe			break;
6390d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		}
6400d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		len -= this_len;
6410d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		p += this_len;
6420d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	} while (len);
6430d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
6440d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	if (!ret)
6450d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		return 0;
6460d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
647a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe	log_err("trim: verify failed at file %s offset %llu, length %lu"
648a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		", block offset %lu\n",
649a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe			io_u->file->file_name, io_u->offset, io_u->buflen,
6502f68124f26e54233db41b462a257dabc48e5c32bJens Axboe			(unsigned long) (p - io_u->buf));
6510d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	return ret;
6520d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe}
6530d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
65436690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboeint verify_io_u(struct thread_data *td, struct io_u *io_u)
655e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
6563f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis	struct verify_header *hdr;
6572b13e716c0921356c0930522718e00b8df34293aJens Axboe	unsigned int header_size, hdr_inc, hdr_num = 0;
65895646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe	void *p;
659e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	int ret;
660e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
6611dcc049824b840df1ee0ef5d019fffa4037e1bb0Shawn Lewis	if (td->o.verify == VERIFY_NULL || io_u->ddir != DDIR_READ)
66236690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe		return 0;
6630d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	if (io_u->flags & IO_U_F_TRIMMED) {
6640d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		ret = verify_trimmed_io_u(td, io_u);
6650d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		goto done;
6660d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	}
66736690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe
668cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe	hdr_inc = get_hdr_inc(td, io_u);
669e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
670a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe	ret = 0;
6715ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	for (p = io_u->buf; p < io_u->buf + io_u->buflen;
6725ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	     p += hdr_inc, hdr_num++) {
673bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		struct vcont vc = {
674bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe			.io_u		= io_u,
675bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe			.hdr_num	= hdr_num,
6767d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			.td		= td,
677bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		};
678936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe
679f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe		if (ret && td->o.verify_fatal)
680a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe			break;
681f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe
6822b13e716c0921356c0930522718e00b8df34293aJens Axboe		header_size = __hdr_size(td->o.verify);
683a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe		if (td->o.verify_offset)
6842b13e716c0921356c0930522718e00b8df34293aJens Axboe			memswp(p, p + td->o.verify_offset, header_size);
68595646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe		hdr = p;
686e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
6873f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe		if (hdr->fio_magic != FIO_HDR_MAGIC) {
688c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe			log_err("verify: bad magic header %x, wanted %x at file %s offset %llu, length %u\n",
689c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe				hdr->fio_magic, FIO_HDR_MAGIC,
690c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe				io_u->file->file_name,
691c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe				io_u->offset + hdr_num * hdr->len, hdr->len);
6929fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe			return EILSEQ;
6933f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe		}
6943f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
6953f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		switch (hdr->verify_type) {
6963f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_MD5:
697936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_md5(hdr, &vc);
6983f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
6993f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC64:
700936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc64(hdr, &vc);
7013f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
702bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe		case VERIFY_CRC32C:
7033845591fadea480177223e28c9d1c03642d34f0eJens Axboe		case VERIFY_CRC32C_INTEL:
704936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc32c(hdr, &vc);
705bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe			break;
7063f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC32:
707936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc32(hdr, &vc);
7083f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
7093f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC16:
710936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc16(hdr, &vc);
7113f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
7123f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC7:
713936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc7(hdr, &vc);
7143f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
715cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA256:
716936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_sha256(hdr, &vc);
717cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
718cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA512:
719936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_sha512(hdr, &vc);
720cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
7217437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		case VERIFY_META:
72292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			ret = verify_io_u_meta(hdr, &vc);
7237437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis			break;
7247c353ceb3257b132f4c98326046b42201e070731Jens Axboe		case VERIFY_SHA1:
725936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_sha1(hdr, &vc);
7267c353ceb3257b132f4c98326046b42201e070731Jens Axboe			break;
72792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		case VERIFY_PATTERN:
72892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			ret = verify_io_u_pattern(hdr, &vc);
72992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			break;
7303f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		default:
7313f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			log_err("Bad verify type %u\n", hdr->verify_type);
732d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe			ret = EINVAL;
7333f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		}
7343f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis	}
735a7dfe862c2e3fe72b8db6a6e67302048d3731c6dJens Axboe
7360d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboedone:
737f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe	if (ret && td->o.verify_fatal)
738f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe		td->terminate = 1;
739f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe
740a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe	return ret;
741e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
742e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
7437437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic void fill_meta(struct verify_header *hdr, struct thread_data *td,
7445ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		      struct io_u *io_u, unsigned int header_num)
7457437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{
7467437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	struct vhdr_meta *vh = hdr_priv(hdr);
7477437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
7487437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->thread = td->thread_number;
7497437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
7507437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->time_sec = io_u->start_time.tv_sec;
7517437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->time_usec = io_u->start_time.tv_usec;
7527437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
7537437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->numberio = td->io_issues[DDIR_WRITE];
7547437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
7557437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->offset = io_u->offset + header_num * td->o.verify_interval;
7567437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis}
7577437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
758cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha512(struct verify_header *hdr, void *p, unsigned int len)
759cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
760546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha512 *vh = hdr_priv(hdr);
761cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha512_ctx sha512_ctx = {
762546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.buf = vh->sha512,
763cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
764cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
765cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha512_init(&sha512_ctx);
766cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha512_update(&sha512_ctx, p, len);
767cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
768cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
769cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha256(struct verify_header *hdr, void *p, unsigned int len)
770cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
771546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha256 *vh = hdr_priv(hdr);
772cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha256_ctx sha256_ctx = {
773546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.buf = vh->sha256,
774cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
775cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
776cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha256_init(&sha256_ctx);
777cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha256_update(&sha256_ctx, p, len);
778cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
779cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
7807c353ceb3257b132f4c98326046b42201e070731Jens Axboestatic void fill_sha1(struct verify_header *hdr, void *p, unsigned int len)
7817c353ceb3257b132f4c98326046b42201e070731Jens Axboe{
7827c353ceb3257b132f4c98326046b42201e070731Jens Axboe	struct vhdr_sha1 *vh = hdr_priv(hdr);
7837c353ceb3257b132f4c98326046b42201e070731Jens Axboe	struct sha1_ctx sha1_ctx = {
7847c353ceb3257b132f4c98326046b42201e070731Jens Axboe		.H = vh->sha1,
7857c353ceb3257b132f4c98326046b42201e070731Jens Axboe	};
7867c353ceb3257b132f4c98326046b42201e070731Jens Axboe
7877c353ceb3257b132f4c98326046b42201e070731Jens Axboe	sha1_init(&sha1_ctx);
7887c353ceb3257b132f4c98326046b42201e070731Jens Axboe	sha1_update(&sha1_ctx, p, len);
7897c353ceb3257b132f4c98326046b42201e070731Jens Axboe}
7907c353ceb3257b132f4c98326046b42201e070731Jens Axboe
7911e154bdbf14a1d352117aea057035235b66f0381Jens Axboestatic void fill_crc7(struct verify_header *hdr, void *p, unsigned int len)
7921e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{
793546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc7 *vh = hdr_priv(hdr);
794546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
795546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc7 = crc7(p, len);
7961e154bdbf14a1d352117aea057035235b66f0381Jens Axboe}
7971e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
798969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboestatic void fill_crc16(struct verify_header *hdr, void *p, unsigned int len)
799969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{
800546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc16 *vh = hdr_priv(hdr);
801546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
802546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc16 = crc16(p, len);
803969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe}
804969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
805e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_crc32(struct verify_header *hdr, void *p, unsigned int len)
806e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
807546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
808546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
809546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc32 = crc32(p, len);
810e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
811e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
812bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboestatic void fill_crc32c(struct verify_header *hdr, void *p, unsigned int len)
813bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{
814bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
815bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
8163845591fadea480177223e28c9d1c03642d34f0eJens Axboe	if (hdr->verify_type == VERIFY_CRC32C_INTEL)
8173845591fadea480177223e28c9d1c03642d34f0eJens Axboe		vh->crc32 = crc32c_intel(p, len);
8183845591fadea480177223e28c9d1c03642d34f0eJens Axboe	else
8193845591fadea480177223e28c9d1c03642d34f0eJens Axboe		vh->crc32 = crc32c(p, len);
820bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe}
821bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
822d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboestatic void fill_crc64(struct verify_header *hdr, void *p, unsigned int len)
823d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{
824546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc64 *vh = hdr_priv(hdr);
825546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
826546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc64 = crc64(p, len);
827d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe}
828d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
829e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_md5(struct verify_header *hdr, void *p, unsigned int len)
830e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
831546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_md5 *vh = hdr_priv(hdr);
8328c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	struct md5_ctx md5_ctx = {
833546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.hash = (uint32_t *) vh->md5_digest,
8348c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	};
835e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
83661f821f16cf27d8742e09b3a137c933cd0085e9bJens Axboe	md5_init(&md5_ctx);
837e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	md5_update(&md5_ctx, p, len);
838e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
839e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
8407d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void populate_hdr(struct thread_data *td, struct io_u *io_u,
8417d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			 struct verify_header *hdr, unsigned int header_num,
8427d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			 unsigned int header_len)
8437d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{
8447d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	unsigned int data_len;
8457d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	void *data, *p;
8467d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
8477d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	p = (void *) hdr;
8487d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
8497d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	hdr->fio_magic = FIO_HDR_MAGIC;
8507d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	hdr->len = header_len;
8517d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	hdr->verify_type = td->o.verify;
8527d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	hdr->rand_seed = io_u->rand_seed;
8537d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	data_len = header_len - hdr_size(hdr);
8547d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
8557d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	data = p + hdr_size(hdr);
8567d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	switch (td->o.verify) {
8577d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_MD5:
8587d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill md5 io_u %p, len %u\n",
8597d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8607d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_md5(hdr, data, data_len);
8617d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8627d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC64:
8637d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc64 io_u %p, len %u\n",
8647d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8657d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc64(hdr, data, data_len);
8667d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8677d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC32C:
8687d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC32C_INTEL:
8697d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc32c io_u %p, len %u\n",
8707d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8717d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc32c(hdr, data, data_len);
8727d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8737d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC32:
8747d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc32 io_u %p, len %u\n",
8757d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8767d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc32(hdr, data, data_len);
8777d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8787d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC16:
8797d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc16 io_u %p, len %u\n",
8807d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8817d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc16(hdr, data, data_len);
8827d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8837d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC7:
8847d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc7 io_u %p, len %u\n",
8857d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8867d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc7(hdr, data, data_len);
8877d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8887d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_SHA256:
8897d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill sha256 io_u %p, len %u\n",
8907d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8917d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_sha256(hdr, data, data_len);
8927d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8937d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_SHA512:
8947d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill sha512 io_u %p, len %u\n",
8957d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8967d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_sha512(hdr, data, data_len);
8977d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8987d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_META:
8997d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill meta io_u %p, len %u\n",
9007d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
9017d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_meta(hdr, td, io_u, header_num);
9027d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
9037d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_SHA1:
9047d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill sha1 io_u %p, len %u\n",
9057d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
9067d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_sha1(hdr, data, data_len);
9077d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
90892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	case VERIFY_PATTERN:
90992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		/* nothing to do here */
91092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		break;
9117d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	default:
9127d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		log_err("fio: bad verify type: %d\n", td->o.verify);
9137d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		assert(0);
9147d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	}
9157d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	if (td->o.verify_offset)
9167d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		memswp(p, p + td->o.verify_offset, hdr_size(hdr));
9177d9fb455aadc0c0363489591775496f27f4a560aJens Axboe}
9187d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
919e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe/*
920e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * fill body of io_u->buf with random data and add a header with the
921c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * checksum of choice
922e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe */
923e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboevoid populate_verify_io_u(struct thread_data *td, struct io_u *io_u)
924e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
9259cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe	if (td->o.verify == VERIFY_NULL)
9269cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe		return;
9279cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe
928c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	fill_pattern_headers(td, io_u, 0, 0);
929e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
930e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
931e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboeint get_next_verify(struct thread_data *td, struct io_u *io_u)
932e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
9338de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	struct io_piece *ipo = NULL;
934e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
935d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	/*
936d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	 * this io_u is from a requeue, we already filled the offsets
937d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	 */
938d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	if (io_u->file)
939d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe		return 0;
940d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe
9418de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	if (!RB_EMPTY_ROOT(&td->io_hist_tree)) {
9428de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe		struct rb_node *n = rb_first(&td->io_hist_tree);
943e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
9448de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe		ipo = rb_entry(n, struct io_piece, rb_node);
9454b87898e8d76aaf05baec83077a11311c1447397Jens Axboe		rb_erase(n, &td->io_hist_tree);
946a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		assert(ipo->flags & IP_F_ONRB);
947a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		ipo->flags &= ~IP_F_ONRB;
94801743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe	} else if (!flist_empty(&td->io_hist_list)) {
94901743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe		ipo = flist_entry(td->io_hist_list.next, struct io_piece, list);
95001743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe		flist_del(&ipo->list);
951a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		assert(ipo->flags & IP_F_ONLIST);
952a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		ipo->flags &= ~IP_F_ONLIST;
9538de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	}
954e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
9558de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	if (ipo) {
9560d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		td->io_hist_len--;
9570d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
958e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->offset = ipo->offset;
959e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->buflen = ipo->len;
96036167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->file = ipo->file;
96197af62cec418cd722fb43c6010d6430534e12353Jens Axboe
9620d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		if (ipo->flags & IP_F_TRIMMED)
9630d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe			io_u->flags |= IO_U_F_TRIMMED;
9640d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
965d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe		if (!fio_file_open(io_u->file)) {
96697af62cec418cd722fb43c6010d6430534e12353Jens Axboe			int r = td_io_open_file(td, io_u->file);
96797af62cec418cd722fb43c6010d6430534e12353Jens Axboe
968bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			if (r) {
969bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe				dprint(FD_VERIFY, "failed file %s open\n",
970bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe						io_u->file->file_name);
97197af62cec418cd722fb43c6010d6430534e12353Jens Axboe				return 1;
972bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			}
97397af62cec418cd722fb43c6010d6430534e12353Jens Axboe		}
97497af62cec418cd722fb43c6010d6430534e12353Jens Axboe
97597af62cec418cd722fb43c6010d6430534e12353Jens Axboe		get_file(ipo->file);
976d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe		assert(fio_file_open(io_u->file));
977e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->ddir = DDIR_READ;
97836167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->xfer_buf = io_u->buf;
97936167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->xfer_buflen = io_u->buflen;
9800d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
9810d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		remove_trim_entry(td, ipo);
982e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		free(ipo);
983bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "get_next_verify: ret io_u %p\n", io_u);
984e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		return 0;
985e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	}
986e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
987bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "get_next_verify: empty\n");
988e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	return 1;
989e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
990e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
991e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboestatic void *verify_async_thread(void *data)
992e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
993e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	struct thread_data *td = data;
994e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	struct io_u *io_u;
995e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	int ret = 0;
996e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
997e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	if (td->o.verify_cpumask_set &&
998e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	    fio_setaffinity(td->pid, td->o.verify_cpumask)) {
999e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		log_err("fio: failed setting verify thread affinity\n");
1000e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		goto done;
1001e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	}
1002e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1003e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	do {
1004e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		FLIST_HEAD(list);
1005e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe
1006e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		read_barrier();
1007e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		if (td->verify_thread_exit)
1008e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			break;
1009e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1010e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		pthread_mutex_lock(&td->io_u_lock);
1011e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1012e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		while (flist_empty(&td->verify_list) &&
1013e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		       !td->verify_thread_exit) {
1014b36e298b5bdfc31ffc9a4c14e94a9c5c748888b0Jens Axboe			ret = pthread_cond_wait(&td->verify_cond,
1015b36e298b5bdfc31ffc9a4c14e94a9c5c748888b0Jens Axboe							&td->io_u_lock);
1016e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			if (ret) {
1017e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe				pthread_mutex_unlock(&td->io_u_lock);
1018e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe				break;
1019e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			}
1020e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		}
1021e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1022e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		flist_splice_init(&td->verify_list, &list);
1023e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		pthread_mutex_unlock(&td->io_u_lock);
1024e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe
1025e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		if (flist_empty(&list))
1026e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			continue;
1027e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1028e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		while (!flist_empty(&list)) {
1029e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe			io_u = flist_entry(list.next, struct io_u, list);
1030e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe			flist_del_init(&io_u->list);
1031e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1032d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			ret = verify_io_u(td, io_u);
1033e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe			put_io_u(td, io_u);
1034d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			if (!ret)
1035d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				continue;
1036d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			if (td->o.continue_on_error &&
1037d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			    td_non_fatal_error(ret)) {
1038d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				update_error_count(td, ret);
1039d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				td_clear_error(td);
1040d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				ret = 0;
1041d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			}
1042e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		}
1043e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	} while (!ret);
1044e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1045d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe	if (ret) {
1046d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe		td_verror(td, ret, "async_verify");
1047f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe		if (td->o.verify_fatal)
1048f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe			td->terminate = 1;
1049d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe	}
1050d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe
1051e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboedone:
1052e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_lock(&td->io_u_lock);
1053e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->nr_verify_threads--;
1054e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_unlock(&td->io_u_lock);
1055e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1056e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_cond_signal(&td->free_cond);
1057e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	return NULL;
1058e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
1059e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1060e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_async_init(struct thread_data *td)
1061e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
1062e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	int i, ret;
1063304a47c7d94f407cc72a87025679a67f02288447bart Van Assche	pthread_attr_t attr;
1064304a47c7d94f407cc72a87025679a67f02288447bart Van Assche
1065304a47c7d94f407cc72a87025679a67f02288447bart Van Assche	pthread_attr_init(&attr);
1066304a47c7d94f407cc72a87025679a67f02288447bart Van Assche	pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN);
1067e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1068e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_thread_exit = 0;
1069e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1070e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_threads = malloc(sizeof(pthread_t) * td->o.verify_async);
1071e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	for (i = 0; i < td->o.verify_async; i++) {
1072304a47c7d94f407cc72a87025679a67f02288447bart Van Assche		ret = pthread_create(&td->verify_threads[i], &attr,
1073e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe					verify_async_thread, td);
1074e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		if (ret) {
1075e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			log_err("fio: async verify creation failed: %s\n",
1076e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe					strerror(ret));
1077e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			break;
1078e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		}
1079e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		ret = pthread_detach(td->verify_threads[i]);
1080e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		if (ret) {
1081e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			log_err("fio: async verify thread detach failed: %s\n",
1082e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe					strerror(ret));
1083e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			break;
1084e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		}
1085e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		td->nr_verify_threads++;
1086e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	}
1087e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1088304a47c7d94f407cc72a87025679a67f02288447bart Van Assche	pthread_attr_destroy(&attr);
1089304a47c7d94f407cc72a87025679a67f02288447bart Van Assche
1090e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	if (i != td->o.verify_async) {
1091e40823b10920f679d84f3f2222e319c168b1e7daJens Axboe		log_err("fio: only %d verify threads started, exiting\n", i);
1092e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		td->verify_thread_exit = 1;
1093e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		write_barrier();
1094e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		pthread_cond_broadcast(&td->verify_cond);
1095e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		return 1;
1096e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	}
1097e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1098e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	return 0;
1099e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
1100e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1101e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboevoid verify_async_exit(struct thread_data *td)
1102e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
1103e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_thread_exit = 1;
1104e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	write_barrier();
1105e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_cond_broadcast(&td->verify_cond);
1106e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1107e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_lock(&td->io_u_lock);
1108e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1109e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	while (td->nr_verify_threads)
1110e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		pthread_cond_wait(&td->free_cond, &td->io_u_lock);
1111e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1112e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_unlock(&td->io_u_lock);
1113e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	free(td->verify_threads);
1114e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_threads = NULL;
1115e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
1116