verify.c revision bf65415f8d080f1649ee3432d4f11f62216f6cee
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"
130d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe#include "trim.h"
14637ef8d9f7645135cf4829894d1e3983cd7a042eJens Axboe#include "lib/rand.h"
1551aa2da8cf422a06ddfa1ce673f3bfc03f96b86eJens Axboe#include "lib/hweight.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"
26844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe#include "crc/xxhash.h"
27cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
287d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void populate_hdr(struct thread_data *td, struct io_u *io_u,
297d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			 struct verify_header *hdr, unsigned int header_num,
307d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			 unsigned int header_len);
317d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
32ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboestatic void fill_pattern(struct thread_data *td, void *p, unsigned int len,
33ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe			 char *pattern, unsigned int pattern_bytes)
3490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe{
35ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe	switch (pattern_bytes) {
3690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	case 0:
37ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe		assert(0);
3890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		break;
3990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	case 1:
40bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "fill verify pattern b=0 len=%u\n", len);
41ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe		memset(p, pattern[0], len);
4290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		break;
430e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran	default: {
440e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran		unsigned int i = 0, size = 0;
4590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		unsigned char *b = p;
4690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe
47bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "fill verify pattern b=%d len=%u\n",
48ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe					pattern_bytes, len);
49bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
5090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		while (i < len) {
51ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe			size = pattern_bytes;
520e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran			if (size > (len - i))
530e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran				size = len - i;
54ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe			memcpy(b+i, pattern, size);
550e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran			i += size;
5690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		}
5790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		break;
5890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		}
5990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	}
6090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe}
6190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe
62ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboevoid fill_buffer_pattern(struct thread_data *td, void *p, unsigned int len)
63ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe{
64ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe	fill_pattern(td, p, len, td->o.buffer_pattern, td->o.buffer_pattern_bytes);
65ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe}
66ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe
67ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboevoid fill_verify_pattern(struct thread_data *td, void *p, unsigned int len,
68ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe			 struct io_u *io_u, unsigned long seed, int use_seed)
69ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe{
70ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe	if (!td->o.verify_pattern_bytes) {
71ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe		dprint(FD_VERIFY, "fill random bytes len=%u\n", len);
72ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe
73ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe		if (use_seed)
74ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe			__fill_random_buf(p, len, seed);
75ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe		else
76c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat			io_u->rand_seed = fill_random_buf(&td->__verify_state, p, len);
77ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe		return;
78ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe	}
79c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat
80ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe	if (io_u->buf_filled_len >= len) {
81ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe		dprint(FD_VERIFY, "using already filled verify pattern b=%d len=%u\n",
82ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe			td->o.verify_pattern_bytes, len);
83ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe		return;
84ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe	}
85ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe
86ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe	fill_pattern(td, p, len, td->o.verify_pattern, td->o.verify_pattern_bytes);
87ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe
88ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe	io_u->buf_filled_len = len;
89ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe}
90ce35b1ece06ce27ebff111e47c2a6610c311a92bJens 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;
968a99fdf63e1350fc2c35794e1c1f779885905b29Jens Axboe	if (td->o.verify_interval && td->o.verify_interval <= io_u->buflen)
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
109ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe	fill_verify_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/*
142de8f6de97438d5664cd8765e60102b9109a273e2Anatol Pomozov * Prepare for separation 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;
176844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	case VERIFY_XXHASH:
177844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe		len = sizeof(struct vhdr_xxhash);
178844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe		break;
1797437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	case VERIFY_META:
1807437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		len = sizeof(struct vhdr_meta);
1817437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		break;
1827c353ceb3257b132f4c98326046b42201e070731Jens Axboe	case VERIFY_SHA1:
1837c353ceb3257b132f4c98326046b42201e070731Jens Axboe		len = sizeof(struct vhdr_sha1);
1847c353ceb3257b132f4c98326046b42201e070731Jens Axboe		break;
18592bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	case VERIFY_PATTERN:
18692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		len = 0;
18792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		break;
188546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	default:
189546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		log_err("fio: unknown verify header!\n");
190546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		assert(0);
191546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	}
192546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
193546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	return len + sizeof(struct verify_header);
1948767783245faac99a7e1c330a1d6536e579c8402Jens Axboe}
1958767783245faac99a7e1c330a1d6536e579c8402Jens Axboe
1968767783245faac99a7e1c330a1d6536e579c8402Jens Axboestatic inline unsigned int hdr_size(struct verify_header *hdr)
1978767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{
198546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	return __hdr_size(hdr->verify_type);
199546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe}
200546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
201546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic void *hdr_priv(struct verify_header *hdr)
202546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe{
203546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	void *priv = hdr;
204546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
205546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	return priv + sizeof(struct verify_header);
2068767783245faac99a7e1c330a1d6536e579c8402Jens Axboe}
2078767783245faac99a7e1c330a1d6536e579c8402Jens Axboe
2088767783245faac99a7e1c330a1d6536e579c8402Jens Axboe/*
209936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * Verify container, pass info to verify handlers and allow them to
210936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * pass info back in case of error
211936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe */
212936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestruct vcont {
213936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	/*
214936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	 * Input
215936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	 */
216936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	struct io_u *io_u;
217936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	unsigned int hdr_num;
2187d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	struct thread_data *td;
219936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe
220936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	/*
221936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	 * Output, only valid in case of error
222936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	 */
223bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	const char *name;
224bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	void *good_crc;
225bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	void *bad_crc;
226936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	unsigned int crc_len;
227936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe};
228936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe
229dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe#define DUMP_BUF_SZ	255
230dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboestatic int dump_buf_warned;
231dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe
232c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboestatic void dump_buf(char *buf, unsigned int len, unsigned long long offset,
233c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe		     const char *type, struct fio_file *f)
2347d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{
235dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe	char *ptr, fname[DUMP_BUF_SZ];
236dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe	size_t buf_left = DUMP_BUF_SZ;
2377d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	int ret, fd;
2387d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2396f260b317f4cec3027f79b8b329dd3f98c3906acJens Axboe	ptr = strdup(f->file_name);
240c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe
241dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe	fname[DUMP_BUF_SZ - 1] = '\0';
242dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe	strncpy(fname, basename(ptr), DUMP_BUF_SZ - 1);
243dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe
244dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe	buf_left -= strlen(fname);
245dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe	if (buf_left <= 0) {
246dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe		if (!dump_buf_warned) {
247dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe			log_err("fio: verify failure dump buffer too small\n");
248dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe			dump_buf_warned = 1;
249dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe		}
250dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe		free(ptr);
251dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe		return;
252dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe	}
253dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe
254dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe	snprintf(fname + strlen(fname), buf_left, ".%llu.%s", offset, type);
2557d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2567d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	fd = open(fname, O_CREAT | O_TRUNC | O_WRONLY, 0644);
2577d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	if (fd < 0) {
2587d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		perror("open verify buf file");
2597d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		return;
2607d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	}
2617d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2627d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	while (len) {
2637d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		ret = write(fd, buf, len);
2647d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		if (!ret)
2657d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			break;
2667d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		else if (ret < 0) {
2677d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			perror("write verify buf file");
2687d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			break;
2697d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		}
2707d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		len -= ret;
2717d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		buf += ret;
2727d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	}
2737d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2747d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	close(fd);
275c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	log_err("       %s data dumped as %s\n", type, fname);
2766f260b317f4cec3027f79b8b329dd3f98c3906acJens Axboe	free(ptr);
2777d9fb455aadc0c0363489591775496f27f4a560aJens Axboe}
2787d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
279c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe/*
280c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * Dump the contents of the read block and re-generate the correct data
281c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * and dump that too.
282c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe */
2837d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void dump_verify_buffers(struct verify_header *hdr, struct vcont *vc)
2847d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{
2857d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	struct thread_data *td = vc->td;
2867d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	struct io_u *io_u = vc->io_u;
2877d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	unsigned long hdr_offset;
2887d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	struct io_u dummy;
289c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	void *buf;
2907d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2910dce9bc9b21a8d91aa55a29258dfaeffc57bd466Steven Lang	if (!td->o.verify_dump)
2920dce9bc9b21a8d91aa55a29258dfaeffc57bd466Steven Lang		return;
2930dce9bc9b21a8d91aa55a29258dfaeffc57bd466Steven Lang
294c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	/*
295c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	 * Dump the contents we just read off disk
296c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	 */
2977d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	hdr_offset = vc->hdr_num * hdr->len;
2987d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
299c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	dump_buf(io_u->buf + hdr_offset, hdr->len, io_u->offset + hdr_offset,
300c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe			"received", vc->io_u->file);
3017d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
302c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	/*
303c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	 * Allocate a new buf and re-generate the original data
304c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	 */
305c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	buf = malloc(io_u->buflen);
3067d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	dummy = *io_u;
307c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	dummy.buf = buf;
3084aae38a645f3315ca2f8cc57a7ec4110ba7d8319Jens Axboe	dummy.rand_seed = hdr->rand_seed;
309cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe	dummy.buf_filled_len = 0;
3100d81daf9d164c4bf829f4911e1f7b211c2e661fbJosef Bacik	dummy.buflen = io_u->buflen;
3117d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
312c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	fill_pattern_headers(td, &dummy, hdr->rand_seed, 1);
3137d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
314c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	dump_buf(buf + hdr_offset, hdr->len, io_u->offset + hdr_offset,
315c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe			"expected", vc->io_u->file);
3167d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	free(buf);
3177d9fb455aadc0c0363489591775496f27f4a560aJens Axboe}
3187d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
319bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboestatic void log_verify_failure(struct verify_header *hdr, struct vcont *vc)
320bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe{
321bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	unsigned long long offset;
322bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe
323bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	offset = vc->io_u->offset;
324bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	offset += vc->hdr_num * hdr->len;
32532c17adf7f75da1f0957d4691633fea60259910fJens Axboe	log_err("%.8s: verify failed at file %s offset %llu, length %u\n",
32632c17adf7f75da1f0957d4691633fea60259910fJens Axboe			vc->name, vc->io_u->file->file_name, offset, hdr->len);
327bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe
328bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (vc->good_crc && vc->bad_crc) {
329bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		log_err("       Expected CRC: ");
330bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		hexdump(vc->good_crc, vc->crc_len);
331bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		log_err("       Received CRC: ");
332bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		hexdump(vc->bad_crc, vc->crc_len);
333bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	}
3347d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
3357d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	dump_verify_buffers(hdr, vc);
336bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe}
337bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe
338936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe/*
339d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe * Return data area 'header_num'
340d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe */
341936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic inline void *io_u_verify_off(struct verify_header *hdr, struct vcont *vc)
342d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe{
343936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	return vc->io_u->buf + vc->hdr_num * hdr->len + hdr_size(hdr);
344d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe}
345d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe
34692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboestatic int verify_io_u_pattern(struct verify_header *hdr, struct vcont *vc)
34792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe{
34892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	struct thread_data *td = vc->td;
34992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	struct io_u *io_u = vc->io_u;
35092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	char *buf, *pattern;
3512b13e716c0921356c0930522718e00b8df34293aJens Axboe	unsigned int header_size = __hdr_size(td->o.verify);
3529a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang	unsigned int len, mod, i, size, pattern_size;
35392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe
35492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	pattern = td->o.verify_pattern;
3559a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang	pattern_size = td->o.verify_pattern_bytes;
3569a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang	if (pattern_size <= 1)
3579a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang		pattern_size = MAX_PATTERN_SIZE;
3582b13e716c0921356c0930522718e00b8df34293aJens Axboe	buf = (void *) hdr + header_size;
3592b13e716c0921356c0930522718e00b8df34293aJens Axboe	len = get_hdr_inc(td, io_u) - header_size;
3609a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang	mod = header_size % pattern_size;
3619a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang
3629a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang	for (i = 0; i < len; i += size) {
3639a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang		size = pattern_size - mod;
3649a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang		if (size > (len - i))
3659a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang			size = len - i;
3669a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang		if (memcmp(buf + i, pattern + mod, size))
367e4ad68b1364aebfe949e2d6a649c7b1001ebca07Jens Axboe			/* Let the slow compare find the first mismatch byte. */
3689a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang			break;
3699a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang		mod = 0;
3709a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang	}
37192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe
3729a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang	for (; i < len; i++) {
37392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		if (buf[i] != pattern[mod]) {
37492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			unsigned int bits;
37592bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe
37692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			bits = hweight8(buf[i] ^ pattern[mod]);
37792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			log_err("fio: got pattern %x, wanted %x. Bad bits %d\n",
37892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe				buf[i], pattern[mod], bits);
37992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			log_err("fio: bad pattern block offset %u\n", i);
38092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			dump_verify_buffers(hdr, vc);
38192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			return EILSEQ;
38292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		}
38392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		mod++;
38492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		if (mod == td->o.verify_pattern_bytes)
38592bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			mod = 0;
38692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	}
38792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe
38892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	return 0;
38992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe}
39092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe
39192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboestatic int verify_io_u_meta(struct verify_header *hdr, struct vcont *vc)
3927437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{
39392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	struct thread_data *td = vc->td;
3947437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	struct vhdr_meta *vh = hdr_priv(hdr);
395936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	struct io_u *io_u = vc->io_u;
39692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	int ret = EILSEQ;
3977437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
398bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "meta verify io_u %p, len %u\n", io_u, hdr->len);
399bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
400bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (vh->offset == io_u->offset + vc->hdr_num * td->o.verify_interval)
40192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		ret = 0;
40292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe
40392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	if (td->o.verify_pattern_bytes)
40492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		ret |= verify_io_u_pattern(hdr, vc);
40592bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe
406da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse	/*
407da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse	 * For read-only workloads, the program cannot be certain of the
408da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse	 * last numberio written to a block. Checking of numberio will be done
409da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse	 * only for workloads that write data.
410621677626f2551bedfdc4a5fc3b3e5f8492b94faJuan Casse	 * For verify_only, numberio will be checked in the last iteration when
411621677626f2551bedfdc4a5fc3b3e5f8492b94faJuan Casse	 * the correct state of numberio, that would have been written to each
412621677626f2551bedfdc4a5fc3b3e5f8492b94faJuan Casse	 * block in a previous run of fio, has been reached.
413da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse	 */
414da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse	if (td_write(td) || td_rw(td))
415621677626f2551bedfdc4a5fc3b3e5f8492b94faJuan Casse		if (!td->o.verify_only || td->o.loops == 0)
416621677626f2551bedfdc4a5fc3b3e5f8492b94faJuan Casse			if (vh->numberio != io_u->numberio)
417621677626f2551bedfdc4a5fc3b3e5f8492b94faJuan Casse				ret = EILSEQ;
418da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse
41992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	if (!ret)
420bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
4217437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
422bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "meta";
423bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
42492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	return ret;
4257437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis}
4267437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
427844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboestatic int verify_io_u_xxhash(struct verify_header *hdr, struct vcont *vc)
428844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe{
429844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	void *p = io_u_verify_off(hdr, vc);
430844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	struct vhdr_xxhash *vh = hdr_priv(hdr);
431844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	uint32_t hash;
432844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	void *state;
433844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe
434844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	dprint(FD_VERIFY, "xxhash verify io_u %p, len %u\n", vc->io_u, hdr->len);
435844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe
436844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	state = XXH32_init(1);
437844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	XXH32_update(state, p, hdr->len - hdr_size(hdr));
438844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	hash = XXH32_digest(state);
439844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe
440844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	if (vh->hash == hash)
441844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe		return 0;
442844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe
443844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	vc->name = "xxhash";
444844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	vc->good_crc = &vh->hash;
445844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	vc->bad_crc = &hash;
446844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	vc->crc_len = sizeof(hash);
447844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	log_verify_failure(hdr, vc);
448844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	return EILSEQ;
449844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe}
450844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe
451936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha512(struct verify_header *hdr, struct vcont *vc)
452cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
453936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
454546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha512 *vh = hdr_priv(hdr);
455cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	uint8_t sha512[128];
45625dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	struct fio_sha512_ctx sha512_ctx = {
457cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		.buf = sha512,
458cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
459cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
460936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "sha512 verify io_u %p, len %u\n", vc->io_u, hdr->len);
461bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
46225dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha512_init(&sha512_ctx);
46325dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha512_update(&sha512_ctx, p, hdr->len - hdr_size(hdr));
464cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
465bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (!memcmp(vh->sha512, sha512_ctx.buf, sizeof(sha512)))
466bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
467cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
468bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "sha512";
469bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = vh->sha512;
470bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = sha512_ctx.buf;
471bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = sizeof(vh->sha512);
472bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
473bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
474cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
475cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
476936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha256(struct verify_header *hdr, struct vcont *vc)
477cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
478936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
479546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha256 *vh = hdr_priv(hdr);
480bc77f56f79f6ae155e9eb26263ed686ef28b47ecJens Axboe	uint8_t sha256[64];
48125dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	struct fio_sha256_ctx sha256_ctx = {
482cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		.buf = sha256,
483cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
484cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
485936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "sha256 verify io_u %p, len %u\n", vc->io_u, hdr->len);
486bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
48725dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha256_init(&sha256_ctx);
48825dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha256_update(&sha256_ctx, p, hdr->len - hdr_size(hdr));
489cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
490bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (!memcmp(vh->sha256, sha256_ctx.buf, sizeof(sha256)))
491bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
492cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
493bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "sha256";
494bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = vh->sha256;
495bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = sha256_ctx.buf;
496bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = sizeof(vh->sha256);
497bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
498bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
499cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
500cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
501936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha1(struct verify_header *hdr, struct vcont *vc)
5027c353ceb3257b132f4c98326046b42201e070731Jens Axboe{
503936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
5047c353ceb3257b132f4c98326046b42201e070731Jens Axboe	struct vhdr_sha1 *vh = hdr_priv(hdr);
5057c353ceb3257b132f4c98326046b42201e070731Jens Axboe	uint32_t sha1[5];
50625dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	struct fio_sha1_ctx sha1_ctx = {
5077c353ceb3257b132f4c98326046b42201e070731Jens Axboe		.H = sha1,
5087c353ceb3257b132f4c98326046b42201e070731Jens Axboe	};
5097c353ceb3257b132f4c98326046b42201e070731Jens Axboe
510936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "sha1 verify io_u %p, len %u\n", vc->io_u, hdr->len);
5117c353ceb3257b132f4c98326046b42201e070731Jens Axboe
51225dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha1_init(&sha1_ctx);
51325dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha1_update(&sha1_ctx, p, hdr->len - hdr_size(hdr));
5147c353ceb3257b132f4c98326046b42201e070731Jens Axboe
515bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (!memcmp(vh->sha1, sha1_ctx.H, sizeof(sha1)))
516bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
5177c353ceb3257b132f4c98326046b42201e070731Jens Axboe
518bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "sha1";
519bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = vh->sha1;
520bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = sha1_ctx.H;
521bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = sizeof(vh->sha1);
522bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
523bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
5247c353ceb3257b132f4c98326046b42201e070731Jens Axboe}
5257c353ceb3257b132f4c98326046b42201e070731Jens Axboe
526936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc7(struct verify_header *hdr, struct vcont *vc)
5271e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{
528936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
529546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc7 *vh = hdr_priv(hdr);
5301e154bdbf14a1d352117aea057035235b66f0381Jens Axboe	unsigned char c;
5311e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
532936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc7 verify io_u %p, len %u\n", vc->io_u, hdr->len);
533bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
53425dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	c = fio_crc7(p, hdr->len - hdr_size(hdr));
5351e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
536bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc7)
537bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
5381e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
539bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc7";
540bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc7;
541bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
542bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 1;
543bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
544bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
5451e154bdbf14a1d352117aea057035235b66f0381Jens Axboe}
5461e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
547936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc16(struct verify_header *hdr, struct vcont *vc)
548969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{
549936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
550546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc16 *vh = hdr_priv(hdr);
551969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe	unsigned short c;
552969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
553936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc16 verify io_u %p, len %u\n", vc->io_u, hdr->len);
554bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
55525dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	c = fio_crc16(p, hdr->len - hdr_size(hdr));
556969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
557bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc16)
558bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
559969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
560bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc16";
561bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc16;
562bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
563bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 2;
564bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
565bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
566969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe}
567969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
568936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc64(struct verify_header *hdr, struct vcont *vc)
569d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{
570936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
571546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc64 *vh = hdr_priv(hdr);
572d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe	unsigned long long c;
573d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
574936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc64 verify io_u %p, len %u\n", vc->io_u, hdr->len);
575bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
57625dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	c = fio_crc64(p, hdr->len - hdr_size(hdr));
577d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
578bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc64)
579bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
580d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
581bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc64";
582bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc64;
583bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
584bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 8;
585bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
586bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
587d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe}
588d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
589936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc32(struct verify_header *hdr, struct vcont *vc)
590e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
591936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
592546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
593546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	uint32_t c;
594e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
595936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc32 verify io_u %p, len %u\n", vc->io_u, hdr->len);
596bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
59725dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	c = fio_crc32(p, hdr->len - hdr_size(hdr));
598e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
599bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc32)
600bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
601e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
602bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc32";
603bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc32;
604bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
605bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 4;
606bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
607bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
608e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
609e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
610936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc32c(struct verify_header *hdr, struct vcont *vc)
611bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{
612936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
613bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
614bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	uint32_t c;
615bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
616936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc32c verify io_u %p, len %u\n", vc->io_u, hdr->len);
617bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
61825dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	c = fio_crc32c(p, hdr->len - hdr_size(hdr));
619bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
620bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc32)
621bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
622bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
623bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc32c";
624bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc32;
625bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
626bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 4;
627bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
628bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
629bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe}
630bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
631936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_md5(struct verify_header *hdr, struct vcont *vc)
632e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
633936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
634546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_md5 *vh = hdr_priv(hdr);
6358c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	uint32_t hash[MD5_HASH_WORDS];
63625dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	struct fio_md5_ctx md5_ctx = {
6378c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe		.hash = hash,
6388c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	};
639e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
640936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "md5 verify io_u %p, len %u\n", vc->io_u, hdr->len);
641bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
64225dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_md5_init(&md5_ctx);
64325dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_md5_update(&md5_ctx, p, hdr->len - hdr_size(hdr));
644e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
645bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (!memcmp(vh->md5_digest, md5_ctx.hash, sizeof(hash)))
646bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
647e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
648bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "md5";
649bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = vh->md5_digest;
650bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = md5_ctx.hash;
651bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = sizeof(hash);
652bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
653bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
654e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
655e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
656e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe/*
657e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe * Push IO verification to a separate thread
658e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe */
659e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_io_u_async(struct thread_data *td, struct io_u *io_u)
660e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
661e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	if (io_u->file)
662e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		put_file_log(td, io_u->file);
663e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
664e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_lock(&td->io_u_lock);
665d7ee2a7d431c2cabdf56d04ca14805cad72cf985Steven Lang
6660c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran	if (io_u->flags & IO_U_F_IN_CUR_DEPTH) {
6670c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran		td->cur_depth--;
6680c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran		io_u->flags &= ~IO_U_F_IN_CUR_DEPTH;
6690c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran	}
6702ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe	flist_add_tail(&io_u->verify_list, &td->verify_list);
6712ecc1b57721e3cb72bbf558bc169c97037fe3d0aJens Axboe	io_u->flags |= IO_U_F_FREE_DEF;
672e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_unlock(&td->io_u_lock);
673e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
674e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_cond_signal(&td->verify_cond);
675e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	return 0;
676e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
677e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
6780d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboestatic int verify_trimmed_io_u(struct thread_data *td, struct io_u *io_u)
6790d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe{
6800d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	static char zero_buf[1024];
6810d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	unsigned int this_len, len;
6820d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	int ret = 0;
6830d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	void *p;
6840d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
6850d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	if (!td->o.trim_zero)
6860d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		return 0;
6870d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
6880d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	len = io_u->buflen;
6890d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	p = io_u->buf;
6900d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	do {
6910d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		this_len = sizeof(zero_buf);
6920d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		if (this_len > len)
6930d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe			this_len = len;
6940d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		if (memcmp(p, zero_buf, this_len)) {
6950d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe			ret = EILSEQ;
6960d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe			break;
6970d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		}
6980d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		len -= this_len;
6990d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		p += this_len;
7000d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	} while (len);
7010d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
7020d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	if (!ret)
7030d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		return 0;
7040d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
705a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe	log_err("trim: verify failed at file %s offset %llu, length %lu"
706a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		", block offset %lu\n",
707a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe			io_u->file->file_name, io_u->offset, io_u->buflen,
7082f68124f26e54233db41b462a257dabc48e5c32bJens Axboe			(unsigned long) (p - io_u->buf));
7090d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	return ret;
7100d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe}
7110d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
712bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacherstatic int verify_header(struct io_u *io_u, struct verify_header *hdr,
713bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher			 unsigned int hdr_num, unsigned int hdr_len)
714f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe{
715f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe	void *p = hdr;
716f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe	uint32_t crc;
717f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe
718bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher	if (hdr->magic != FIO_HDR_MAGIC) {
719bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher		log_err("verify: bad magic header %x, wanted %x",
720bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher			hdr->magic, FIO_HDR_MAGIC);
721bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher		goto err;
722bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher	}
723bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher	if (hdr->len > io_u->buflen) {
724bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher		log_err("verify: bad header length %u, wanted %u",
725bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher			hdr->len, hdr_len);
726bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher		goto err;
727bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher	}
728bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher	if (hdr->rand_seed != io_u->rand_seed) {
729bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher		log_err("verify: bad header rand_seed %"PRIu64
730bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher			", wanted %"PRIu64,
731bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher			hdr->rand_seed, io_u->rand_seed);
732bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher		goto err;
733bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher	}
734ae38c0dcd570265aef09aa132ce27278d8909a1dJens Axboe
73525dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	crc = fio_crc32c(p, offsetof(struct verify_header, crc32));
736bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher	if (crc != hdr->crc32) {
737bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher		log_err("verify: bad header crc %x, calculated %x",
738bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher			hdr->crc32, crc);
739bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher		goto err;
740bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher	}
741bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher	return 0;
742bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher
743bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbachererr:
744bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher	log_err(" at file %s offset %llu, length %u\n",
745bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher		io_u->file->file_name,
746bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher		io_u->offset + hdr_num * hdr_len, hdr_len);
747bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher	return EILSEQ;
748f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe}
749f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe
75036690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboeint verify_io_u(struct thread_data *td, struct io_u *io_u)
751e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
7523f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis	struct verify_header *hdr;
7532b13e716c0921356c0930522718e00b8df34293aJens Axboe	unsigned int header_size, hdr_inc, hdr_num = 0;
75495646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe	void *p;
755e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	int ret;
756e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
7571dcc049824b840df1ee0ef5d019fffa4037e1bb0Shawn Lewis	if (td->o.verify == VERIFY_NULL || io_u->ddir != DDIR_READ)
75836690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe		return 0;
7590d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	if (io_u->flags & IO_U_F_TRIMMED) {
7600d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		ret = verify_trimmed_io_u(td, io_u);
7610d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		goto done;
7620d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	}
76336690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe
764cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe	hdr_inc = get_hdr_inc(td, io_u);
765e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
766a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe	ret = 0;
7675ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	for (p = io_u->buf; p < io_u->buf + io_u->buflen;
7685ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	     p += hdr_inc, hdr_num++) {
769bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		struct vcont vc = {
770bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe			.io_u		= io_u,
771bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe			.hdr_num	= hdr_num,
7727d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			.td		= td,
773bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		};
774f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe		unsigned int verify_type;
775936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe
776f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe		if (ret && td->o.verify_fatal)
777a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe			break;
778f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe
7792b13e716c0921356c0930522718e00b8df34293aJens Axboe		header_size = __hdr_size(td->o.verify);
780a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe		if (td->o.verify_offset)
7812b13e716c0921356c0930522718e00b8df34293aJens Axboe			memswp(p, p + td->o.verify_offset, header_size);
78295646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe		hdr = p;
783e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
784c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat		/*
785c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat		 * Make rand_seed check pass when have verifysort or
786c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat		 * verify_backlog.
787c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat		 */
788c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat		if (td->o.verifysort || (td->flags & TD_F_VER_BACKLOG))
789c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat			io_u->rand_seed = hdr->rand_seed;
790c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat
791bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher		ret = verify_header(io_u, hdr, hdr_num, hdr_inc);
792bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher		if (ret)
793bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher			return ret;
7943f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
795f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe		if (td->o.verify != VERIFY_NONE)
796f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe			verify_type = td->o.verify;
797f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe		else
798f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe			verify_type = hdr->verify_type;
799f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe
800f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe		switch (verify_type) {
8013f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_MD5:
802936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_md5(hdr, &vc);
8033f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
8043f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC64:
805936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc64(hdr, &vc);
8063f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
807bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe		case VERIFY_CRC32C:
8083845591fadea480177223e28c9d1c03642d34f0eJens Axboe		case VERIFY_CRC32C_INTEL:
809936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc32c(hdr, &vc);
810bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe			break;
8113f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC32:
812936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc32(hdr, &vc);
8133f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
8143f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC16:
815936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc16(hdr, &vc);
8163f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
8173f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC7:
818936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc7(hdr, &vc);
8193f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
820cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA256:
821936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_sha256(hdr, &vc);
822cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
823cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA512:
824936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_sha512(hdr, &vc);
825cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
826844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe		case VERIFY_XXHASH:
827844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe			ret = verify_io_u_xxhash(hdr, &vc);
828844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe			break;
8297437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		case VERIFY_META:
83092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			ret = verify_io_u_meta(hdr, &vc);
8317437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis			break;
8327c353ceb3257b132f4c98326046b42201e070731Jens Axboe		case VERIFY_SHA1:
833936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_sha1(hdr, &vc);
8347c353ceb3257b132f4c98326046b42201e070731Jens Axboe			break;
83592bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		case VERIFY_PATTERN:
83692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			ret = verify_io_u_pattern(hdr, &vc);
83792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			break;
8383f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		default:
8393f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			log_err("Bad verify type %u\n", hdr->verify_type);
840d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe			ret = EINVAL;
8413f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		}
842f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe
843f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe		if (ret && verify_type != hdr->verify_type)
844f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe			log_err("fio: verify type mismatch (%u media, %u given)\n",
845f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe					hdr->verify_type, verify_type);
8463f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis	}
847a7dfe862c2e3fe72b8db6a6e67302048d3731c6dJens Axboe
8480d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboedone:
849f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe	if (ret && td->o.verify_fatal)
850f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe		td->terminate = 1;
851f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe
852a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe	return ret;
853e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
854e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
8557437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic void fill_meta(struct verify_header *hdr, struct thread_data *td,
8565ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		      struct io_u *io_u, unsigned int header_num)
8577437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{
8587437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	struct vhdr_meta *vh = hdr_priv(hdr);
8597437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
8607437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->thread = td->thread_number;
8617437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
8627437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->time_sec = io_u->start_time.tv_sec;
8637437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->time_usec = io_u->start_time.tv_usec;
8647437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
865da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse	vh->numberio = io_u->numberio;
8667437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
8677437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->offset = io_u->offset + header_num * td->o.verify_interval;
8687437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis}
8697437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
870844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboestatic void fill_xxhash(struct verify_header *hdr, void *p, unsigned int len)
871844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe{
872844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	struct vhdr_xxhash *vh = hdr_priv(hdr);
873844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	void *state;
874844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe
875844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	state = XXH32_init(1);
876844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	XXH32_update(state, p, len);
877844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	vh->hash = XXH32_digest(state);
878844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe}
879844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe
880cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha512(struct verify_header *hdr, void *p, unsigned int len)
881cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
882546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha512 *vh = hdr_priv(hdr);
88325dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	struct fio_sha512_ctx sha512_ctx = {
884546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.buf = vh->sha512,
885cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
886cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
88725dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha512_init(&sha512_ctx);
88825dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha512_update(&sha512_ctx, p, len);
889cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
890cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
891cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha256(struct verify_header *hdr, void *p, unsigned int len)
892cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
893546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha256 *vh = hdr_priv(hdr);
89425dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	struct fio_sha256_ctx sha256_ctx = {
895546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.buf = vh->sha256,
896cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
897cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
89825dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha256_init(&sha256_ctx);
89925dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha256_update(&sha256_ctx, p, len);
900cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
901cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
9027c353ceb3257b132f4c98326046b42201e070731Jens Axboestatic void fill_sha1(struct verify_header *hdr, void *p, unsigned int len)
9037c353ceb3257b132f4c98326046b42201e070731Jens Axboe{
9047c353ceb3257b132f4c98326046b42201e070731Jens Axboe	struct vhdr_sha1 *vh = hdr_priv(hdr);
90525dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	struct fio_sha1_ctx sha1_ctx = {
9067c353ceb3257b132f4c98326046b42201e070731Jens Axboe		.H = vh->sha1,
9077c353ceb3257b132f4c98326046b42201e070731Jens Axboe	};
9087c353ceb3257b132f4c98326046b42201e070731Jens Axboe
90925dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha1_init(&sha1_ctx);
91025dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha1_update(&sha1_ctx, p, len);
9117c353ceb3257b132f4c98326046b42201e070731Jens Axboe}
9127c353ceb3257b132f4c98326046b42201e070731Jens Axboe
9131e154bdbf14a1d352117aea057035235b66f0381Jens Axboestatic void fill_crc7(struct verify_header *hdr, void *p, unsigned int len)
9141e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{
915546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc7 *vh = hdr_priv(hdr);
916546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
91725dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	vh->crc7 = fio_crc7(p, len);
9181e154bdbf14a1d352117aea057035235b66f0381Jens Axboe}
9191e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
920969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboestatic void fill_crc16(struct verify_header *hdr, void *p, unsigned int len)
921969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{
922546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc16 *vh = hdr_priv(hdr);
923546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
92425dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	vh->crc16 = fio_crc16(p, len);
925969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe}
926969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
927e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_crc32(struct verify_header *hdr, void *p, unsigned int len)
928e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
929546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
930546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
93125dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	vh->crc32 = fio_crc32(p, len);
932e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
933e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
934bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboestatic void fill_crc32c(struct verify_header *hdr, void *p, unsigned int len)
935bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{
936bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
937bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
93825dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	vh->crc32 = fio_crc32c(p, len);
939bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe}
940bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
941d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboestatic void fill_crc64(struct verify_header *hdr, void *p, unsigned int len)
942d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{
943546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc64 *vh = hdr_priv(hdr);
944546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
94525dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	vh->crc64 = fio_crc64(p, len);
946d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe}
947d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
948e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_md5(struct verify_header *hdr, void *p, unsigned int len)
949e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
950546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_md5 *vh = hdr_priv(hdr);
95125dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	struct fio_md5_ctx md5_ctx = {
952546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.hash = (uint32_t *) vh->md5_digest,
9538c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	};
954e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
95525dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_md5_init(&md5_ctx);
95625dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_md5_update(&md5_ctx, p, len);
957e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
958e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
9597d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void populate_hdr(struct thread_data *td, struct io_u *io_u,
9607d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			 struct verify_header *hdr, unsigned int header_num,
9617d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			 unsigned int header_len)
9627d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{
9637d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	unsigned int data_len;
9647d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	void *data, *p;
9657d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
9667d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	p = (void *) hdr;
9677d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
968d3a173a927084660c365d6aa162016ebb0746946Jens Axboe	hdr->magic = FIO_HDR_MAGIC;
9697d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	hdr->verify_type = td->o.verify;
970d3a173a927084660c365d6aa162016ebb0746946Jens Axboe	hdr->len = header_len;
9717d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	hdr->rand_seed = io_u->rand_seed;
97225dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	hdr->crc32 = fio_crc32c(p, offsetof(struct verify_header, crc32));
973f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe
9747d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	data_len = header_len - hdr_size(hdr);
9757d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
9767d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	data = p + hdr_size(hdr);
9777d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	switch (td->o.verify) {
9787d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_MD5:
9797d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill md5 io_u %p, len %u\n",
9807d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
9817d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_md5(hdr, data, data_len);
9827d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
9837d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC64:
9847d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc64 io_u %p, len %u\n",
9857d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
9867d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc64(hdr, data, data_len);
9877d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
9887d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC32C:
9897d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC32C_INTEL:
9907d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc32c io_u %p, len %u\n",
9917d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
9927d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc32c(hdr, data, data_len);
9937d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
9947d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC32:
9957d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc32 io_u %p, len %u\n",
9967d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
9977d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc32(hdr, data, data_len);
9987d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
9997d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC16:
10007d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc16 io_u %p, len %u\n",
10017d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
10027d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc16(hdr, data, data_len);
10037d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
10047d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC7:
10057d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc7 io_u %p, len %u\n",
10067d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
10077d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc7(hdr, data, data_len);
10087d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
10097d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_SHA256:
10107d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill sha256 io_u %p, len %u\n",
10117d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
10127d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_sha256(hdr, data, data_len);
10137d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
10147d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_SHA512:
10157d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill sha512 io_u %p, len %u\n",
10167d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
10177d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_sha512(hdr, data, data_len);
10187d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
1019844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe	case VERIFY_XXHASH:
1020844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe		dprint(FD_VERIFY, "fill xxhash io_u %p, len %u\n",
1021844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe						io_u, hdr->len);
1022844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe		fill_xxhash(hdr, data, data_len);
1023844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe		break;
10247d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_META:
10257d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill meta io_u %p, len %u\n",
10267d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
10277d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_meta(hdr, td, io_u, header_num);
10287d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
10297d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_SHA1:
10307d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill sha1 io_u %p, len %u\n",
10317d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
10327d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_sha1(hdr, data, data_len);
10337d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
103492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	case VERIFY_PATTERN:
103592bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		/* nothing to do here */
103692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		break;
10377d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	default:
10387d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		log_err("fio: bad verify type: %d\n", td->o.verify);
10397d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		assert(0);
10407d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	}
10417d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	if (td->o.verify_offset)
10427d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		memswp(p, p + td->o.verify_offset, hdr_size(hdr));
10437d9fb455aadc0c0363489591775496f27f4a560aJens Axboe}
10447d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
1045e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe/*
1046e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * fill body of io_u->buf with random data and add a header with the
1047c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * checksum of choice
1048e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe */
1049e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboevoid populate_verify_io_u(struct thread_data *td, struct io_u *io_u)
1050e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
10519cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe	if (td->o.verify == VERIFY_NULL)
10529cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe		return;
10539cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe
1054da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse	io_u->numberio = td->io_issues[io_u->ddir];
1055da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse
1056c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	fill_pattern_headers(td, io_u, 0, 0);
1057e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
1058e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
1059e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboeint get_next_verify(struct thread_data *td, struct io_u *io_u)
1060e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
10618de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	struct io_piece *ipo = NULL;
1062e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
1063d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	/*
1064d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	 * this io_u is from a requeue, we already filled the offsets
1065d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	 */
1066d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	if (io_u->file)
1067d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe		return 0;
1068d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe
10698de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	if (!RB_EMPTY_ROOT(&td->io_hist_tree)) {
10708de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe		struct rb_node *n = rb_first(&td->io_hist_tree);
1071e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
10728de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe		ipo = rb_entry(n, struct io_piece, rb_node);
1073f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe
1074f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe		/*
1075f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe		 * Ensure that the associated IO has completed
1076f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe		 */
1077f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe		read_barrier();
1078f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe		if (ipo->flags & IP_F_IN_FLIGHT)
1079f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe			goto nothing;
1080f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe
10814b87898e8d76aaf05baec83077a11311c1447397Jens Axboe		rb_erase(n, &td->io_hist_tree);
1082a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		assert(ipo->flags & IP_F_ONRB);
1083a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		ipo->flags &= ~IP_F_ONRB;
108401743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe	} else if (!flist_empty(&td->io_hist_list)) {
108501743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe		ipo = flist_entry(td->io_hist_list.next, struct io_piece, list);
1086f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe
1087f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe		/*
1088f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe		 * Ensure that the associated IO has completed
1089f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe		 */
1090f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe		read_barrier();
1091f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe		if (ipo->flags & IP_F_IN_FLIGHT)
1092f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe			goto nothing;
1093f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe
109401743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe		flist_del(&ipo->list);
1095a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		assert(ipo->flags & IP_F_ONLIST);
1096a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		ipo->flags &= ~IP_F_ONLIST;
10978de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	}
1098e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
10998de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	if (ipo) {
11000d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		td->io_hist_len--;
11010d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
1102e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->offset = ipo->offset;
1103e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->buflen = ipo->len;
1104da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse		io_u->numberio = ipo->numberio;
110536167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->file = ipo->file;
110682af2a7ca1a543b41c003de69d5e3c36860f47d5Jens Axboe		io_u->flags |= IO_U_F_VER_LIST;
110797af62cec418cd722fb43c6010d6430534e12353Jens Axboe
11080d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		if (ipo->flags & IP_F_TRIMMED)
11090d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe			io_u->flags |= IO_U_F_TRIMMED;
11100d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
1111d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe		if (!fio_file_open(io_u->file)) {
111297af62cec418cd722fb43c6010d6430534e12353Jens Axboe			int r = td_io_open_file(td, io_u->file);
111397af62cec418cd722fb43c6010d6430534e12353Jens Axboe
1114bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			if (r) {
1115bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe				dprint(FD_VERIFY, "failed file %s open\n",
1116bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe						io_u->file->file_name);
111797af62cec418cd722fb43c6010d6430534e12353Jens Axboe				return 1;
1118bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			}
111997af62cec418cd722fb43c6010d6430534e12353Jens Axboe		}
112097af62cec418cd722fb43c6010d6430534e12353Jens Axboe
112197af62cec418cd722fb43c6010d6430534e12353Jens Axboe		get_file(ipo->file);
1122d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe		assert(fio_file_open(io_u->file));
1123e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->ddir = DDIR_READ;
112436167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->xfer_buf = io_u->buf;
112536167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->xfer_buflen = io_u->buflen;
11260d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
11270d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		remove_trim_entry(td, ipo);
1128e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		free(ipo);
1129bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "get_next_verify: ret io_u %p\n", io_u);
1130c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat
1131c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat		if (!td->o.verify_pattern_bytes) {
1132c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat			io_u->rand_seed = __rand(&td->__verify_state);
1133c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat			if (sizeof(int) != sizeof(long *))
1134c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat				io_u->rand_seed *= __rand(&td->__verify_state);
1135c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat		}
1136e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		return 0;
1137e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	}
1138e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
1139f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboenothing:
1140bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "get_next_verify: empty\n");
1141e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	return 1;
1142e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
1143e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1144dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboevoid fio_verify_init(struct thread_data *td)
1145dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe{
1146dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe	if (td->o.verify == VERIFY_CRC32C_INTEL ||
1147dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe	    td->o.verify == VERIFY_CRC32C) {
1148dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe		crc32c_intel_probe();
1149dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe	}
1150dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe}
1151dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe
1152e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboestatic void *verify_async_thread(void *data)
1153e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
1154e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	struct thread_data *td = data;
1155e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	struct io_u *io_u;
1156e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	int ret = 0;
1157e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1158e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	if (td->o.verify_cpumask_set &&
1159e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	    fio_setaffinity(td->pid, td->o.verify_cpumask)) {
1160e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		log_err("fio: failed setting verify thread affinity\n");
1161e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		goto done;
1162e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	}
1163e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1164e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	do {
1165e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		FLIST_HEAD(list);
1166e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe
1167e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		read_barrier();
1168e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		if (td->verify_thread_exit)
1169e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			break;
1170e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1171e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		pthread_mutex_lock(&td->io_u_lock);
1172e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1173e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		while (flist_empty(&td->verify_list) &&
1174e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		       !td->verify_thread_exit) {
1175b36e298b5bdfc31ffc9a4c14e94a9c5c748888b0Jens Axboe			ret = pthread_cond_wait(&td->verify_cond,
1176b36e298b5bdfc31ffc9a4c14e94a9c5c748888b0Jens Axboe							&td->io_u_lock);
1177e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			if (ret) {
1178e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe				pthread_mutex_unlock(&td->io_u_lock);
1179e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe				break;
1180e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			}
1181e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		}
1182e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1183e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		flist_splice_init(&td->verify_list, &list);
1184e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		pthread_mutex_unlock(&td->io_u_lock);
1185e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe
1186e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		if (flist_empty(&list))
1187e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			continue;
1188e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1189e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		while (!flist_empty(&list)) {
11902ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe			io_u = flist_entry(list.next, struct io_u, verify_list);
11912ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe			flist_del(&io_u->verify_list);
1192e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1193d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			ret = verify_io_u(td, io_u);
1194e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe			put_io_u(td, io_u);
1195d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			if (!ret)
1196d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				continue;
11978b28bd41375930664a0ff9ff9b101a88ac416ac5Dmitry Monakhov			if (td_non_fatal_error(td, ERROR_TYPE_VERIFY_BIT, ret)) {
1198d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				update_error_count(td, ret);
1199d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				td_clear_error(td);
1200d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				ret = 0;
1201d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			}
1202e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		}
1203e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	} while (!ret);
1204e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1205d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe	if (ret) {
1206d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe		td_verror(td, ret, "async_verify");
1207f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe		if (td->o.verify_fatal)
1208f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe			td->terminate = 1;
1209d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe	}
1210d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe
1211e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboedone:
1212e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_lock(&td->io_u_lock);
1213e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->nr_verify_threads--;
1214e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_unlock(&td->io_u_lock);
1215e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1216e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_cond_signal(&td->free_cond);
1217e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	return NULL;
1218e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
1219e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1220e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_async_init(struct thread_data *td)
1221e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
1222e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	int i, ret;
1223304a47c7d94f407cc72a87025679a67f02288447bart Van Assche	pthread_attr_t attr;
1224304a47c7d94f407cc72a87025679a67f02288447bart Van Assche
1225304a47c7d94f407cc72a87025679a67f02288447bart Van Assche	pthread_attr_init(&attr);
1226304a47c7d94f407cc72a87025679a67f02288447bart Van Assche	pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN);
1227e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1228e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_thread_exit = 0;
1229e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1230e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_threads = malloc(sizeof(pthread_t) * td->o.verify_async);
1231e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	for (i = 0; i < td->o.verify_async; i++) {
1232304a47c7d94f407cc72a87025679a67f02288447bart Van Assche		ret = pthread_create(&td->verify_threads[i], &attr,
1233e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe					verify_async_thread, td);
1234e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		if (ret) {
1235e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			log_err("fio: async verify creation failed: %s\n",
1236e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe					strerror(ret));
1237e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			break;
1238e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		}
1239e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		ret = pthread_detach(td->verify_threads[i]);
1240e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		if (ret) {
1241e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			log_err("fio: async verify thread detach failed: %s\n",
1242e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe					strerror(ret));
1243e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			break;
1244e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		}
1245e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		td->nr_verify_threads++;
1246e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	}
1247e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1248304a47c7d94f407cc72a87025679a67f02288447bart Van Assche	pthread_attr_destroy(&attr);
1249304a47c7d94f407cc72a87025679a67f02288447bart Van Assche
1250e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	if (i != td->o.verify_async) {
1251e40823b10920f679d84f3f2222e319c168b1e7daJens Axboe		log_err("fio: only %d verify threads started, exiting\n", i);
1252e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		td->verify_thread_exit = 1;
1253e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		write_barrier();
1254e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		pthread_cond_broadcast(&td->verify_cond);
1255e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		return 1;
1256e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	}
1257e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1258e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	return 0;
1259e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
1260e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1261e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboevoid verify_async_exit(struct thread_data *td)
1262e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
1263e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_thread_exit = 1;
1264e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	write_barrier();
1265e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_cond_broadcast(&td->verify_cond);
1266e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1267e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_lock(&td->io_u_lock);
1268e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1269e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	while (td->nr_verify_threads)
1270e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		pthread_cond_wait(&td->free_cond, &td->io_u_lock);
1271e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1272e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_unlock(&td->io_u_lock);
1273e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	free(td->verify_threads);
1274e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_threads = NULL;
1275e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
1276