verify.c revision f940128526dbe468a1951cce10c2fe5dbd23875f
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"
26cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
277d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void populate_hdr(struct thread_data *td, struct io_u *io_u,
287d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			 struct verify_header *hdr, unsigned int header_num,
297d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			 unsigned int header_len);
307d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
31ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboestatic void fill_pattern(struct thread_data *td, void *p, unsigned int len,
32ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe			 char *pattern, unsigned int pattern_bytes)
3390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe{
34ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe	switch (pattern_bytes) {
3590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	case 0:
36ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe		assert(0);
3790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		break;
3890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	case 1:
39bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "fill verify pattern b=0 len=%u\n", len);
40ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe		memset(p, pattern[0], len);
4190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		break;
420e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran	default: {
430e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran		unsigned int i = 0, size = 0;
4490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		unsigned char *b = p;
4590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe
46bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "fill verify pattern b=%d len=%u\n",
47ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe					pattern_bytes, len);
48bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
4990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		while (i < len) {
50ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe			size = pattern_bytes;
510e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran			if (size > (len - i))
520e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran				size = len - i;
53ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe			memcpy(b+i, pattern, size);
540e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran			i += size;
5590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		}
5690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		break;
5790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		}
5890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	}
5990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe}
6090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe
61ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboevoid fill_buffer_pattern(struct thread_data *td, void *p, unsigned int len)
62ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe{
63ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe	fill_pattern(td, p, len, td->o.buffer_pattern, td->o.buffer_pattern_bytes);
64ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe}
65ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe
66ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboevoid fill_verify_pattern(struct thread_data *td, void *p, unsigned int len,
67ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe			 struct io_u *io_u, unsigned long seed, int use_seed)
68ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe{
69ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe	if (!td->o.verify_pattern_bytes) {
70ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe		dprint(FD_VERIFY, "fill random bytes len=%u\n", len);
71ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe
72ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe		if (use_seed)
73ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe			__fill_random_buf(p, len, seed);
74ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe		else
75c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat			io_u->rand_seed = fill_random_buf(&td->__verify_state, p, len);
76ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe		return;
77ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe	}
78c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat
79ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe	if (io_u->buf_filled_len >= len) {
80ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe		dprint(FD_VERIFY, "using already filled verify pattern b=%d len=%u\n",
81ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe			td->o.verify_pattern_bytes, len);
82ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe		return;
83ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe	}
84ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe
85ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe	fill_pattern(td, p, len, td->o.verify_pattern, td->o.verify_pattern_bytes);
86ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe
87ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe	io_u->buf_filled_len = len;
88ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe}
89ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe
90cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboestatic unsigned int get_hdr_inc(struct thread_data *td, struct io_u *io_u)
91cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe{
92cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe	unsigned int hdr_inc;
93cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe
94cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe	hdr_inc = io_u->buflen;
958a99fdf63e1350fc2c35794e1c1f779885905b29Jens Axboe	if (td->o.verify_interval && td->o.verify_interval <= io_u->buflen)
96cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe		hdr_inc = td->o.verify_interval;
97cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe
98cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe	return hdr_inc;
99cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe}
100cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe
101c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboestatic void fill_pattern_headers(struct thread_data *td, struct io_u *io_u,
102c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe				 unsigned long seed, int use_seed)
103c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe{
104c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	unsigned int hdr_inc, header_num;
105c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	struct verify_header *hdr;
106c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	void *p = io_u->buf;
107c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe
108ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe	fill_verify_pattern(td, p, io_u->buflen, io_u, seed, use_seed);
109c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe
110cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe	hdr_inc = get_hdr_inc(td, io_u);
111c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	header_num = 0;
112c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	for (; p < io_u->buf + io_u->buflen; p += hdr_inc) {
113c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe		hdr = p;
114c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe		populate_hdr(td, io_u, hdr, header_num, hdr_inc);
115c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe		header_num++;
116c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	}
117c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe}
118c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe
1194764aec9fe5988281bdc114c13ac771fb16713ccJens Axboestatic void memswp(void *buf1, void *buf2, unsigned int len)
120546a9142511875524850ac92776184fd9fb7196eShawn Lewis{
121dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis	char swap[200];
122dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis
123dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis	assert(len <= sizeof(swap));
12490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe
125546a9142511875524850ac92776184fd9fb7196eShawn Lewis	memcpy(&swap, buf1, len);
126546a9142511875524850ac92776184fd9fb7196eShawn Lewis	memcpy(buf1, buf2, len);
127546a9142511875524850ac92776184fd9fb7196eShawn Lewis	memcpy(buf2, &swap, len);
128546a9142511875524850ac92776184fd9fb7196eShawn Lewis}
129546a9142511875524850ac92776184fd9fb7196eShawn Lewis
130e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void hexdump(void *buffer, int len)
131e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
132e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	unsigned char *p = buffer;
133e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	int i;
134e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
135e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	for (i = 0; i < len; i++)
136bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		log_err("%02x", p[i]);
137bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_err("\n");
138e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
139e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
140d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe/*
141de8f6de97438d5664cd8765e60102b9109a273e2Anatol Pomozov * Prepare for separation of verify_header and checksum header
1428767783245faac99a7e1c330a1d6536e579c8402Jens Axboe */
143546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic inline unsigned int __hdr_size(int verify_type)
1448767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{
14503e20d687566753b90383571e5e152c5142bdffdBruce Cran	unsigned int len = 0;
1468767783245faac99a7e1c330a1d6536e579c8402Jens Axboe
147546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	switch (verify_type) {
148546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_NONE:
149546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_NULL:
150546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = 0;
151546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
152546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_MD5:
153546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_md5);
154546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
155546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC64:
156546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc64);
157546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
158bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	case VERIFY_CRC32C:
159546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC32:
1603845591fadea480177223e28c9d1c03642d34f0eJens Axboe	case VERIFY_CRC32C_INTEL:
161546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc32);
162546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
163546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC16:
164546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc16);
165546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
166546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC7:
167546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc7);
168546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
169546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_SHA256:
170546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_sha256);
171546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
172546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_SHA512:
173546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_sha512);
174546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
1757437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	case VERIFY_META:
1767437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		len = sizeof(struct vhdr_meta);
1777437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		break;
1787c353ceb3257b132f4c98326046b42201e070731Jens Axboe	case VERIFY_SHA1:
1797c353ceb3257b132f4c98326046b42201e070731Jens Axboe		len = sizeof(struct vhdr_sha1);
1807c353ceb3257b132f4c98326046b42201e070731Jens Axboe		break;
18192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	case VERIFY_PATTERN:
18292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		len = 0;
18392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		break;
184546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	default:
185546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		log_err("fio: unknown verify header!\n");
186546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		assert(0);
187546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	}
188546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
189546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	return len + sizeof(struct verify_header);
1908767783245faac99a7e1c330a1d6536e579c8402Jens Axboe}
1918767783245faac99a7e1c330a1d6536e579c8402Jens Axboe
1928767783245faac99a7e1c330a1d6536e579c8402Jens Axboestatic inline unsigned int hdr_size(struct verify_header *hdr)
1938767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{
194546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	return __hdr_size(hdr->verify_type);
195546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe}
196546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
197546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic void *hdr_priv(struct verify_header *hdr)
198546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe{
199546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	void *priv = hdr;
200546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
201546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	return priv + sizeof(struct verify_header);
2028767783245faac99a7e1c330a1d6536e579c8402Jens Axboe}
2038767783245faac99a7e1c330a1d6536e579c8402Jens Axboe
2048767783245faac99a7e1c330a1d6536e579c8402Jens Axboe/*
205936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * Verify container, pass info to verify handlers and allow them to
206936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * pass info back in case of error
207936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe */
208936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestruct vcont {
209936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	/*
210936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	 * Input
211936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	 */
212936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	struct io_u *io_u;
213936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	unsigned int hdr_num;
2147d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	struct thread_data *td;
215936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe
216936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	/*
217936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	 * Output, only valid in case of error
218936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	 */
219bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	const char *name;
220bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	void *good_crc;
221bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	void *bad_crc;
222936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	unsigned int crc_len;
223936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe};
224936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe
225c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboestatic void dump_buf(char *buf, unsigned int len, unsigned long long offset,
226c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe		     const char *type, struct fio_file *f)
2277d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{
2286f260b317f4cec3027f79b8b329dd3f98c3906acJens Axboe	char *ptr, fname[256];
2297d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	int ret, fd;
2307d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2316f260b317f4cec3027f79b8b329dd3f98c3906acJens Axboe	ptr = strdup(f->file_name);
2326f260b317f4cec3027f79b8b329dd3f98c3906acJens Axboe	strcpy(fname, basename(ptr));
233c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe
234c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	sprintf(fname + strlen(fname), ".%llu.%s", offset, type);
2357d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2367d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	fd = open(fname, O_CREAT | O_TRUNC | O_WRONLY, 0644);
2377d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	if (fd < 0) {
2387d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		perror("open verify buf file");
2397d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		return;
2407d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	}
2417d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2427d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	while (len) {
2437d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		ret = write(fd, buf, len);
2447d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		if (!ret)
2457d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			break;
2467d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		else if (ret < 0) {
2477d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			perror("write verify buf file");
2487d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			break;
2497d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		}
2507d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		len -= ret;
2517d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		buf += ret;
2527d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	}
2537d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2547d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	close(fd);
255c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	log_err("       %s data dumped as %s\n", type, fname);
2566f260b317f4cec3027f79b8b329dd3f98c3906acJens Axboe	free(ptr);
2577d9fb455aadc0c0363489591775496f27f4a560aJens Axboe}
2587d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
259c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe/*
260c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * Dump the contents of the read block and re-generate the correct data
261c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * and dump that too.
262c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe */
2637d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void dump_verify_buffers(struct verify_header *hdr, struct vcont *vc)
2647d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{
2657d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	struct thread_data *td = vc->td;
2667d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	struct io_u *io_u = vc->io_u;
2677d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	unsigned long hdr_offset;
2687d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	struct io_u dummy;
269c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	void *buf;
2707d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2710dce9bc9b21a8d91aa55a29258dfaeffc57bd466Steven Lang	if (!td->o.verify_dump)
2720dce9bc9b21a8d91aa55a29258dfaeffc57bd466Steven Lang		return;
2730dce9bc9b21a8d91aa55a29258dfaeffc57bd466Steven Lang
274c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	/*
275c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	 * Dump the contents we just read off disk
276c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	 */
2777d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	hdr_offset = vc->hdr_num * hdr->len;
2787d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
279c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	dump_buf(io_u->buf + hdr_offset, hdr->len, io_u->offset + hdr_offset,
280c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe			"received", vc->io_u->file);
2817d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
282c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	/*
283c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	 * Allocate a new buf and re-generate the original data
284c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	 */
285c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	buf = malloc(io_u->buflen);
2867d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	dummy = *io_u;
287c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	dummy.buf = buf;
2884aae38a645f3315ca2f8cc57a7ec4110ba7d8319Jens Axboe	dummy.rand_seed = hdr->rand_seed;
289cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe	dummy.buf_filled_len = 0;
2900d81daf9d164c4bf829f4911e1f7b211c2e661fbJosef Bacik	dummy.buflen = io_u->buflen;
2917d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
292c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	fill_pattern_headers(td, &dummy, hdr->rand_seed, 1);
2937d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
294c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	dump_buf(buf + hdr_offset, hdr->len, io_u->offset + hdr_offset,
295c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe			"expected", vc->io_u->file);
2967d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	free(buf);
2977d9fb455aadc0c0363489591775496f27f4a560aJens Axboe}
2987d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
299bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboestatic void log_verify_failure(struct verify_header *hdr, struct vcont *vc)
300bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe{
301bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	unsigned long long offset;
302bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe
303bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	offset = vc->io_u->offset;
304bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	offset += vc->hdr_num * hdr->len;
30532c17adf7f75da1f0957d4691633fea60259910fJens Axboe	log_err("%.8s: verify failed at file %s offset %llu, length %u\n",
30632c17adf7f75da1f0957d4691633fea60259910fJens Axboe			vc->name, vc->io_u->file->file_name, offset, hdr->len);
307bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe
308bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (vc->good_crc && vc->bad_crc) {
309bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		log_err("       Expected CRC: ");
310bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		hexdump(vc->good_crc, vc->crc_len);
311bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		log_err("       Received CRC: ");
312bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		hexdump(vc->bad_crc, vc->crc_len);
313bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	}
3147d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
3157d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	dump_verify_buffers(hdr, vc);
316bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe}
317bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe
318936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe/*
319d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe * Return data area 'header_num'
320d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe */
321936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic inline void *io_u_verify_off(struct verify_header *hdr, struct vcont *vc)
322d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe{
323936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	return vc->io_u->buf + vc->hdr_num * hdr->len + hdr_size(hdr);
324d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe}
325d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe
32692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboestatic int verify_io_u_pattern(struct verify_header *hdr, struct vcont *vc)
32792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe{
32892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	struct thread_data *td = vc->td;
32992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	struct io_u *io_u = vc->io_u;
33092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	char *buf, *pattern;
3312b13e716c0921356c0930522718e00b8df34293aJens Axboe	unsigned int header_size = __hdr_size(td->o.verify);
3329a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang	unsigned int len, mod, i, size, pattern_size;
33392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe
33492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	pattern = td->o.verify_pattern;
3359a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang	pattern_size = td->o.verify_pattern_bytes;
3369a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang	if (pattern_size <= 1)
3379a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang		pattern_size = MAX_PATTERN_SIZE;
3382b13e716c0921356c0930522718e00b8df34293aJens Axboe	buf = (void *) hdr + header_size;
3392b13e716c0921356c0930522718e00b8df34293aJens Axboe	len = get_hdr_inc(td, io_u) - header_size;
3409a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang	mod = header_size % pattern_size;
3419a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang
3429a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang	for (i = 0; i < len; i += size) {
3439a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang		size = pattern_size - mod;
3449a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang		if (size > (len - i))
3459a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang			size = len - i;
3469a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang		if (memcmp(buf + i, pattern + mod, size))
347e4ad68b1364aebfe949e2d6a649c7b1001ebca07Jens Axboe			/* Let the slow compare find the first mismatch byte. */
3489a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang			break;
3499a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang		mod = 0;
3509a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang	}
35192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe
3529a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang	for (; i < len; i++) {
35392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		if (buf[i] != pattern[mod]) {
35492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			unsigned int bits;
35592bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe
35692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			bits = hweight8(buf[i] ^ pattern[mod]);
35792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			log_err("fio: got pattern %x, wanted %x. Bad bits %d\n",
35892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe				buf[i], pattern[mod], bits);
35992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			log_err("fio: bad pattern block offset %u\n", i);
36092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			dump_verify_buffers(hdr, vc);
36192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			return EILSEQ;
36292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		}
36392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		mod++;
36492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		if (mod == td->o.verify_pattern_bytes)
36592bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			mod = 0;
36692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	}
36792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe
36892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	return 0;
36992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe}
37092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe
37192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboestatic int verify_io_u_meta(struct verify_header *hdr, struct vcont *vc)
3727437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{
37392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	struct thread_data *td = vc->td;
3747437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	struct vhdr_meta *vh = hdr_priv(hdr);
375936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	struct io_u *io_u = vc->io_u;
37692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	int ret = EILSEQ;
3777437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
378bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "meta verify io_u %p, len %u\n", io_u, hdr->len);
379bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
380bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (vh->offset == io_u->offset + vc->hdr_num * td->o.verify_interval)
38192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		ret = 0;
38292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe
38392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	if (td->o.verify_pattern_bytes)
38492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		ret |= verify_io_u_pattern(hdr, vc);
38592bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe
386da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse	/*
387da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse	 * For read-only workloads, the program cannot be certain of the
388da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse	 * last numberio written to a block. Checking of numberio will be done
389da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse	 * only for workloads that write data.
390621677626f2551bedfdc4a5fc3b3e5f8492b94faJuan Casse	 * For verify_only, numberio will be checked in the last iteration when
391621677626f2551bedfdc4a5fc3b3e5f8492b94faJuan Casse	 * the correct state of numberio, that would have been written to each
392621677626f2551bedfdc4a5fc3b3e5f8492b94faJuan Casse	 * block in a previous run of fio, has been reached.
393da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse	 */
394da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse	if (td_write(td) || td_rw(td))
395621677626f2551bedfdc4a5fc3b3e5f8492b94faJuan Casse		if (!td->o.verify_only || td->o.loops == 0)
396621677626f2551bedfdc4a5fc3b3e5f8492b94faJuan Casse			if (vh->numberio != io_u->numberio)
397621677626f2551bedfdc4a5fc3b3e5f8492b94faJuan Casse				ret = EILSEQ;
398da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse
39992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	if (!ret)
400bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
4017437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
402bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "meta";
403bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
40492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	return ret;
4057437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis}
4067437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
407936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha512(struct verify_header *hdr, struct vcont *vc)
408cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
409936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
410546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha512 *vh = hdr_priv(hdr);
411cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	uint8_t sha512[128];
41225dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	struct fio_sha512_ctx sha512_ctx = {
413cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		.buf = sha512,
414cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
415cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
416936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "sha512 verify io_u %p, len %u\n", vc->io_u, hdr->len);
417bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
41825dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha512_init(&sha512_ctx);
41925dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha512_update(&sha512_ctx, p, hdr->len - hdr_size(hdr));
420cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
421bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (!memcmp(vh->sha512, sha512_ctx.buf, sizeof(sha512)))
422bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
423cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
424bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "sha512";
425bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = vh->sha512;
426bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = sha512_ctx.buf;
427bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = sizeof(vh->sha512);
428bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
429bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
430cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
431cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
432936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha256(struct verify_header *hdr, struct vcont *vc)
433cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
434936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
435546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha256 *vh = hdr_priv(hdr);
436bc77f56f79f6ae155e9eb26263ed686ef28b47ecJens Axboe	uint8_t sha256[64];
43725dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	struct fio_sha256_ctx sha256_ctx = {
438cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		.buf = sha256,
439cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
440cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
441936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "sha256 verify io_u %p, len %u\n", vc->io_u, hdr->len);
442bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
44325dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha256_init(&sha256_ctx);
44425dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha256_update(&sha256_ctx, p, hdr->len - hdr_size(hdr));
445cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
446bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (!memcmp(vh->sha256, sha256_ctx.buf, sizeof(sha256)))
447bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
448cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
449bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "sha256";
450bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = vh->sha256;
451bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = sha256_ctx.buf;
452bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = sizeof(vh->sha256);
453bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
454bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
455cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
456cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
457936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha1(struct verify_header *hdr, struct vcont *vc)
4587c353ceb3257b132f4c98326046b42201e070731Jens Axboe{
459936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
4607c353ceb3257b132f4c98326046b42201e070731Jens Axboe	struct vhdr_sha1 *vh = hdr_priv(hdr);
4617c353ceb3257b132f4c98326046b42201e070731Jens Axboe	uint32_t sha1[5];
46225dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	struct fio_sha1_ctx sha1_ctx = {
4637c353ceb3257b132f4c98326046b42201e070731Jens Axboe		.H = sha1,
4647c353ceb3257b132f4c98326046b42201e070731Jens Axboe	};
4657c353ceb3257b132f4c98326046b42201e070731Jens Axboe
466936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "sha1 verify io_u %p, len %u\n", vc->io_u, hdr->len);
4677c353ceb3257b132f4c98326046b42201e070731Jens Axboe
46825dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha1_init(&sha1_ctx);
46925dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha1_update(&sha1_ctx, p, hdr->len - hdr_size(hdr));
4707c353ceb3257b132f4c98326046b42201e070731Jens Axboe
471bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (!memcmp(vh->sha1, sha1_ctx.H, sizeof(sha1)))
472bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
4737c353ceb3257b132f4c98326046b42201e070731Jens Axboe
474bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "sha1";
475bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = vh->sha1;
476bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = sha1_ctx.H;
477bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = sizeof(vh->sha1);
478bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
479bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
4807c353ceb3257b132f4c98326046b42201e070731Jens Axboe}
4817c353ceb3257b132f4c98326046b42201e070731Jens Axboe
482936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc7(struct verify_header *hdr, struct vcont *vc)
4831e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{
484936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
485546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc7 *vh = hdr_priv(hdr);
4861e154bdbf14a1d352117aea057035235b66f0381Jens Axboe	unsigned char c;
4871e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
488936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc7 verify io_u %p, len %u\n", vc->io_u, hdr->len);
489bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
49025dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	c = fio_crc7(p, hdr->len - hdr_size(hdr));
4911e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
492bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc7)
493bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
4941e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
495bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc7";
496bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc7;
497bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
498bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 1;
499bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
500bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
5011e154bdbf14a1d352117aea057035235b66f0381Jens Axboe}
5021e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
503936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc16(struct verify_header *hdr, struct vcont *vc)
504969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{
505936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
506546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc16 *vh = hdr_priv(hdr);
507969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe	unsigned short c;
508969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
509936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc16 verify io_u %p, len %u\n", vc->io_u, hdr->len);
510bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
51125dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	c = fio_crc16(p, hdr->len - hdr_size(hdr));
512969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
513bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc16)
514bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
515969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
516bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc16";
517bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc16;
518bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
519bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 2;
520bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
521bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
522969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe}
523969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
524936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc64(struct verify_header *hdr, struct vcont *vc)
525d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{
526936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
527546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc64 *vh = hdr_priv(hdr);
528d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe	unsigned long long c;
529d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
530936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc64 verify io_u %p, len %u\n", vc->io_u, hdr->len);
531bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
53225dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	c = fio_crc64(p, hdr->len - hdr_size(hdr));
533d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
534bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc64)
535bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
536d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
537bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc64";
538bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc64;
539bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
540bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 8;
541bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
542bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
543d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe}
544d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
545936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc32(struct verify_header *hdr, struct vcont *vc)
546e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
547936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
548546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
549546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	uint32_t c;
550e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
551936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc32 verify io_u %p, len %u\n", vc->io_u, hdr->len);
552bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
55325dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	c = fio_crc32(p, hdr->len - hdr_size(hdr));
554e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
555bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc32)
556bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
557e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
558bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc32";
559bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc32;
560bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
561bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 4;
562bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
563bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
564e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
565e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
566936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc32c(struct verify_header *hdr, struct vcont *vc)
567bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{
568936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
569bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
570bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	uint32_t c;
571bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
572936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc32c verify io_u %p, len %u\n", vc->io_u, hdr->len);
573bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
57425dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	c = fio_crc32c(p, hdr->len - hdr_size(hdr));
575bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
576bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc32)
577bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
578bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
579bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc32c";
580bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc32;
581bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
582bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 4;
583bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
584bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
585bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe}
586bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
587936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_md5(struct verify_header *hdr, struct vcont *vc)
588e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
589936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
590546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_md5 *vh = hdr_priv(hdr);
5918c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	uint32_t hash[MD5_HASH_WORDS];
59225dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	struct fio_md5_ctx md5_ctx = {
5938c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe		.hash = hash,
5948c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	};
595e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
596936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "md5 verify io_u %p, len %u\n", vc->io_u, hdr->len);
597bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
59825dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_md5_init(&md5_ctx);
59925dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_md5_update(&md5_ctx, p, hdr->len - hdr_size(hdr));
600e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
601bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (!memcmp(vh->md5_digest, md5_ctx.hash, sizeof(hash)))
602bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
603e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
604bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "md5";
605bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = vh->md5_digest;
606bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = md5_ctx.hash;
607bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = sizeof(hash);
608bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
609bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
610e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
611e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
612e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe/*
613e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe * Push IO verification to a separate thread
614e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe */
615e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_io_u_async(struct thread_data *td, struct io_u *io_u)
616e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
617e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	if (io_u->file)
618e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		put_file_log(td, io_u->file);
619e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
620e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_lock(&td->io_u_lock);
621d7ee2a7d431c2cabdf56d04ca14805cad72cf985Steven Lang
6220c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran	if (io_u->flags & IO_U_F_IN_CUR_DEPTH) {
6230c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran		td->cur_depth--;
6240c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran		io_u->flags &= ~IO_U_F_IN_CUR_DEPTH;
6250c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran	}
6262ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe	flist_add_tail(&io_u->verify_list, &td->verify_list);
6272ecc1b57721e3cb72bbf558bc169c97037fe3d0aJens Axboe	io_u->flags |= IO_U_F_FREE_DEF;
628e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_unlock(&td->io_u_lock);
629e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
630e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_cond_signal(&td->verify_cond);
631e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	return 0;
632e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
633e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
6340d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboestatic int verify_trimmed_io_u(struct thread_data *td, struct io_u *io_u)
6350d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe{
6360d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	static char zero_buf[1024];
6370d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	unsigned int this_len, len;
6380d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	int ret = 0;
6390d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	void *p;
6400d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
6410d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	if (!td->o.trim_zero)
6420d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		return 0;
6430d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
6440d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	len = io_u->buflen;
6450d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	p = io_u->buf;
6460d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	do {
6470d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		this_len = sizeof(zero_buf);
6480d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		if (this_len > len)
6490d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe			this_len = len;
6500d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		if (memcmp(p, zero_buf, this_len)) {
6510d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe			ret = EILSEQ;
6520d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe			break;
6530d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		}
6540d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		len -= this_len;
6550d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		p += this_len;
6560d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	} while (len);
6570d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
6580d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	if (!ret)
6590d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		return 0;
6600d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
661a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe	log_err("trim: verify failed at file %s offset %llu, length %lu"
662a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		", block offset %lu\n",
663a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe			io_u->file->file_name, io_u->offset, io_u->buflen,
6642f68124f26e54233db41b462a257dabc48e5c32bJens Axboe			(unsigned long) (p - io_u->buf));
6650d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	return ret;
6660d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe}
6670d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
6680ae2c6e1d4727515e35e682eae6776fe55fa0275Jens Axboestatic int verify_header(struct io_u *io_u, struct verify_header *hdr)
669f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe{
670f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe	void *p = hdr;
671f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe	uint32_t crc;
672f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe
673ae38c0dcd570265aef09aa132ce27278d8909a1dJens Axboe	if (hdr->magic != FIO_HDR_MAGIC)
674e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse		return 1;
675e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse	if (hdr->len > io_u->buflen)
676e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse		return 2;
677e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse	if (hdr->rand_seed != io_u->rand_seed)
678e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse		return 3;
679ae38c0dcd570265aef09aa132ce27278d8909a1dJens Axboe
68025dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	crc = fio_crc32c(p, offsetof(struct verify_header, crc32));
681f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe	if (crc == hdr->crc32)
682e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse		return 0;
683f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe	log_err("fio: verify header crc %x, calculated %x\n", hdr->crc32, crc);
684e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse	return 4;
685f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe}
686f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe
68736690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboeint verify_io_u(struct thread_data *td, struct io_u *io_u)
688e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
6893f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis	struct verify_header *hdr;
6902b13e716c0921356c0930522718e00b8df34293aJens Axboe	unsigned int header_size, hdr_inc, hdr_num = 0;
69195646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe	void *p;
692e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	int ret;
693e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
6941dcc049824b840df1ee0ef5d019fffa4037e1bb0Shawn Lewis	if (td->o.verify == VERIFY_NULL || io_u->ddir != DDIR_READ)
69536690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe		return 0;
6960d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	if (io_u->flags & IO_U_F_TRIMMED) {
6970d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		ret = verify_trimmed_io_u(td, io_u);
6980d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		goto done;
6990d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	}
70036690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe
701cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe	hdr_inc = get_hdr_inc(td, io_u);
702e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
703a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe	ret = 0;
7045ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	for (p = io_u->buf; p < io_u->buf + io_u->buflen;
7055ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	     p += hdr_inc, hdr_num++) {
706bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		struct vcont vc = {
707bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe			.io_u		= io_u,
708bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe			.hdr_num	= hdr_num,
7097d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			.td		= td,
710bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		};
711f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe		unsigned int verify_type;
712936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe
713f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe		if (ret && td->o.verify_fatal)
714a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe			break;
715f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe
7162b13e716c0921356c0930522718e00b8df34293aJens Axboe		header_size = __hdr_size(td->o.verify);
717a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe		if (td->o.verify_offset)
7182b13e716c0921356c0930522718e00b8df34293aJens Axboe			memswp(p, p + td->o.verify_offset, header_size);
71995646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe		hdr = p;
720e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
721c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat		/*
722c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat		 * Make rand_seed check pass when have verifysort or
723c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat		 * verify_backlog.
724c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat		 */
725c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat		if (td->o.verifysort || (td->flags & TD_F_VER_BACKLOG))
726c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat			io_u->rand_seed = hdr->rand_seed;
727c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat
728e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse		ret = verify_header(io_u, hdr);
729e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse		switch (ret) {
730e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse		case 0:
731e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse			break;
732e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse		case 1:
733ae38c0dcd570265aef09aa132ce27278d8909a1dJens Axboe			log_err("verify: bad magic header %x, wanted %x at "
734ae38c0dcd570265aef09aa132ce27278d8909a1dJens Axboe				"file %s offset %llu, length %u\n",
735d3a173a927084660c365d6aa162016ebb0746946Jens Axboe				hdr->magic, FIO_HDR_MAGIC,
736c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe				io_u->file->file_name,
737c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe				io_u->offset + hdr_num * hdr->len, hdr->len);
7389fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe			return EILSEQ;
739e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse			break;
740e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse		case 2:
741e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse			log_err("fio: verify header exceeds buffer length (%u "
742e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse				"> %lu)\n", hdr->len, io_u->buflen);
743e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse			return EILSEQ;
744e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse			break;
745e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse		case 3:
746e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse			log_err("verify: bad header rand_seed %"PRIu64
747e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse				", wanted %"PRIu64" at file %s offset %llu, "
748e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse				"length %u\n",
749e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse				hdr->rand_seed, io_u->rand_seed,
750e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse				io_u->file->file_name,
751e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse				io_u->offset + hdr_num * hdr->len, hdr->len);
752e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse			return EILSEQ;
753e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse			break;
754e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse		case 4:
755e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse			return EILSEQ;
756e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse			break;
757e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse		default:
758e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse			log_err("verify: unknown header error at file %s "
759e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse			"offset %llu, length %u\n",
760e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse			io_u->file->file_name,
761e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse			io_u->offset + hdr_num * hdr->len, hdr->len);
762e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse			return EILSEQ;
7633f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe		}
7643f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
765f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe		if (td->o.verify != VERIFY_NONE)
766f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe			verify_type = td->o.verify;
767f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe		else
768f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe			verify_type = hdr->verify_type;
769f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe
770f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe		switch (verify_type) {
7713f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_MD5:
772936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_md5(hdr, &vc);
7733f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
7743f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC64:
775936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc64(hdr, &vc);
7763f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
777bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe		case VERIFY_CRC32C:
7783845591fadea480177223e28c9d1c03642d34f0eJens Axboe		case VERIFY_CRC32C_INTEL:
779936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc32c(hdr, &vc);
780bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe			break;
7813f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC32:
782936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc32(hdr, &vc);
7833f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
7843f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC16:
785936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc16(hdr, &vc);
7863f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
7873f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC7:
788936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc7(hdr, &vc);
7893f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
790cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA256:
791936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_sha256(hdr, &vc);
792cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
793cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA512:
794936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_sha512(hdr, &vc);
795cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
7967437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		case VERIFY_META:
79792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			ret = verify_io_u_meta(hdr, &vc);
7987437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis			break;
7997c353ceb3257b132f4c98326046b42201e070731Jens Axboe		case VERIFY_SHA1:
800936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_sha1(hdr, &vc);
8017c353ceb3257b132f4c98326046b42201e070731Jens Axboe			break;
80292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		case VERIFY_PATTERN:
80392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			ret = verify_io_u_pattern(hdr, &vc);
80492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			break;
8053f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		default:
8063f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			log_err("Bad verify type %u\n", hdr->verify_type);
807d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe			ret = EINVAL;
8083f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		}
809f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe
810f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe		if (ret && verify_type != hdr->verify_type)
811f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe			log_err("fio: verify type mismatch (%u media, %u given)\n",
812f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe					hdr->verify_type, verify_type);
8133f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis	}
814a7dfe862c2e3fe72b8db6a6e67302048d3731c6dJens Axboe
8150d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboedone:
816f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe	if (ret && td->o.verify_fatal)
817f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe		td->terminate = 1;
818f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe
819a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe	return ret;
820e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
821e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
8227437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic void fill_meta(struct verify_header *hdr, struct thread_data *td,
8235ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		      struct io_u *io_u, unsigned int header_num)
8247437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{
8257437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	struct vhdr_meta *vh = hdr_priv(hdr);
8267437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
8277437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->thread = td->thread_number;
8287437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
8297437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->time_sec = io_u->start_time.tv_sec;
8307437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->time_usec = io_u->start_time.tv_usec;
8317437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
832da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse	vh->numberio = io_u->numberio;
8337437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
8347437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->offset = io_u->offset + header_num * td->o.verify_interval;
8357437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis}
8367437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
837cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha512(struct verify_header *hdr, void *p, unsigned int len)
838cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
839546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha512 *vh = hdr_priv(hdr);
84025dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	struct fio_sha512_ctx sha512_ctx = {
841546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.buf = vh->sha512,
842cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
843cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
84425dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha512_init(&sha512_ctx);
84525dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha512_update(&sha512_ctx, p, len);
846cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
847cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
848cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha256(struct verify_header *hdr, void *p, unsigned int len)
849cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
850546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha256 *vh = hdr_priv(hdr);
85125dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	struct fio_sha256_ctx sha256_ctx = {
852546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.buf = vh->sha256,
853cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
854cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
85525dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha256_init(&sha256_ctx);
85625dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha256_update(&sha256_ctx, p, len);
857cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
858cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
8597c353ceb3257b132f4c98326046b42201e070731Jens Axboestatic void fill_sha1(struct verify_header *hdr, void *p, unsigned int len)
8607c353ceb3257b132f4c98326046b42201e070731Jens Axboe{
8617c353ceb3257b132f4c98326046b42201e070731Jens Axboe	struct vhdr_sha1 *vh = hdr_priv(hdr);
86225dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	struct fio_sha1_ctx sha1_ctx = {
8637c353ceb3257b132f4c98326046b42201e070731Jens Axboe		.H = vh->sha1,
8647c353ceb3257b132f4c98326046b42201e070731Jens Axboe	};
8657c353ceb3257b132f4c98326046b42201e070731Jens Axboe
86625dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha1_init(&sha1_ctx);
86725dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha1_update(&sha1_ctx, p, len);
8687c353ceb3257b132f4c98326046b42201e070731Jens Axboe}
8697c353ceb3257b132f4c98326046b42201e070731Jens Axboe
8701e154bdbf14a1d352117aea057035235b66f0381Jens Axboestatic void fill_crc7(struct verify_header *hdr, void *p, unsigned int len)
8711e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{
872546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc7 *vh = hdr_priv(hdr);
873546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
87425dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	vh->crc7 = fio_crc7(p, len);
8751e154bdbf14a1d352117aea057035235b66f0381Jens Axboe}
8761e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
877969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboestatic void fill_crc16(struct verify_header *hdr, void *p, unsigned int len)
878969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{
879546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc16 *vh = hdr_priv(hdr);
880546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
88125dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	vh->crc16 = fio_crc16(p, len);
882969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe}
883969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
884e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_crc32(struct verify_header *hdr, void *p, unsigned int len)
885e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
886546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
887546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
88825dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	vh->crc32 = fio_crc32(p, len);
889e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
890e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
891bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboestatic void fill_crc32c(struct verify_header *hdr, void *p, unsigned int len)
892bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{
893bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
894bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
89525dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	vh->crc32 = fio_crc32c(p, len);
896bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe}
897bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
898d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboestatic void fill_crc64(struct verify_header *hdr, void *p, unsigned int len)
899d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{
900546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc64 *vh = hdr_priv(hdr);
901546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
90225dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	vh->crc64 = fio_crc64(p, len);
903d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe}
904d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
905e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_md5(struct verify_header *hdr, void *p, unsigned int len)
906e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
907546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_md5 *vh = hdr_priv(hdr);
90825dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	struct fio_md5_ctx md5_ctx = {
909546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.hash = (uint32_t *) vh->md5_digest,
9108c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	};
911e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
91225dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_md5_init(&md5_ctx);
91325dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_md5_update(&md5_ctx, p, len);
914e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
915e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
9167d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void populate_hdr(struct thread_data *td, struct io_u *io_u,
9177d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			 struct verify_header *hdr, unsigned int header_num,
9187d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			 unsigned int header_len)
9197d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{
9207d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	unsigned int data_len;
9217d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	void *data, *p;
9227d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
9237d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	p = (void *) hdr;
9247d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
925d3a173a927084660c365d6aa162016ebb0746946Jens Axboe	hdr->magic = FIO_HDR_MAGIC;
9267d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	hdr->verify_type = td->o.verify;
927d3a173a927084660c365d6aa162016ebb0746946Jens Axboe	hdr->len = header_len;
9287d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	hdr->rand_seed = io_u->rand_seed;
92925dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	hdr->crc32 = fio_crc32c(p, offsetof(struct verify_header, crc32));
930f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe
9317d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	data_len = header_len - hdr_size(hdr);
9327d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
9337d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	data = p + hdr_size(hdr);
9347d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	switch (td->o.verify) {
9357d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_MD5:
9367d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill md5 io_u %p, len %u\n",
9377d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
9387d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_md5(hdr, data, data_len);
9397d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
9407d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC64:
9417d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc64 io_u %p, len %u\n",
9427d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
9437d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc64(hdr, data, data_len);
9447d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
9457d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC32C:
9467d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC32C_INTEL:
9477d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc32c io_u %p, len %u\n",
9487d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
9497d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc32c(hdr, data, data_len);
9507d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
9517d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC32:
9527d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc32 io_u %p, len %u\n",
9537d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
9547d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc32(hdr, data, data_len);
9557d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
9567d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC16:
9577d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc16 io_u %p, len %u\n",
9587d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
9597d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc16(hdr, data, data_len);
9607d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
9617d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC7:
9627d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc7 io_u %p, len %u\n",
9637d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
9647d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc7(hdr, data, data_len);
9657d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
9667d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_SHA256:
9677d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill sha256 io_u %p, len %u\n",
9687d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
9697d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_sha256(hdr, data, data_len);
9707d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
9717d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_SHA512:
9727d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill sha512 io_u %p, len %u\n",
9737d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
9747d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_sha512(hdr, data, data_len);
9757d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
9767d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_META:
9777d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill meta io_u %p, len %u\n",
9787d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
9797d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_meta(hdr, td, io_u, header_num);
9807d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
9817d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_SHA1:
9827d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill sha1 io_u %p, len %u\n",
9837d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
9847d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_sha1(hdr, data, data_len);
9857d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
98692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	case VERIFY_PATTERN:
98792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		/* nothing to do here */
98892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		break;
9897d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	default:
9907d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		log_err("fio: bad verify type: %d\n", td->o.verify);
9917d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		assert(0);
9927d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	}
9937d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	if (td->o.verify_offset)
9947d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		memswp(p, p + td->o.verify_offset, hdr_size(hdr));
9957d9fb455aadc0c0363489591775496f27f4a560aJens Axboe}
9967d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
997e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe/*
998e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * fill body of io_u->buf with random data and add a header with the
999c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * checksum of choice
1000e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe */
1001e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboevoid populate_verify_io_u(struct thread_data *td, struct io_u *io_u)
1002e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
10039cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe	if (td->o.verify == VERIFY_NULL)
10049cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe		return;
10059cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe
1006da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse	io_u->numberio = td->io_issues[io_u->ddir];
1007da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse
1008c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	fill_pattern_headers(td, io_u, 0, 0);
1009e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
1010e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
1011e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboeint get_next_verify(struct thread_data *td, struct io_u *io_u)
1012e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
10138de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	struct io_piece *ipo = NULL;
1014e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
1015d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	/*
1016d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	 * this io_u is from a requeue, we already filled the offsets
1017d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	 */
1018d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	if (io_u->file)
1019d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe		return 0;
1020d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe
10218de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	if (!RB_EMPTY_ROOT(&td->io_hist_tree)) {
10228de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe		struct rb_node *n = rb_first(&td->io_hist_tree);
1023e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
10248de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe		ipo = rb_entry(n, struct io_piece, rb_node);
1025f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe
1026f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe		/*
1027f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe		 * Ensure that the associated IO has completed
1028f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe		 */
1029f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe		read_barrier();
1030f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe		if (ipo->flags & IP_F_IN_FLIGHT)
1031f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe			goto nothing;
1032f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe
10334b87898e8d76aaf05baec83077a11311c1447397Jens Axboe		rb_erase(n, &td->io_hist_tree);
1034a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		assert(ipo->flags & IP_F_ONRB);
1035a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		ipo->flags &= ~IP_F_ONRB;
103601743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe	} else if (!flist_empty(&td->io_hist_list)) {
103701743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe		ipo = flist_entry(td->io_hist_list.next, struct io_piece, list);
1038f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe
1039f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe		/*
1040f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe		 * Ensure that the associated IO has completed
1041f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe		 */
1042f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe		read_barrier();
1043f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe		if (ipo->flags & IP_F_IN_FLIGHT)
1044f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe			goto nothing;
1045f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe
104601743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe		flist_del(&ipo->list);
1047a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		assert(ipo->flags & IP_F_ONLIST);
1048a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		ipo->flags &= ~IP_F_ONLIST;
10498de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	}
1050e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
10518de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	if (ipo) {
10520d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		td->io_hist_len--;
10530d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
1054e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->offset = ipo->offset;
1055e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->buflen = ipo->len;
1056da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse		io_u->numberio = ipo->numberio;
105736167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->file = ipo->file;
105882af2a7ca1a543b41c003de69d5e3c36860f47d5Jens Axboe		io_u->flags |= IO_U_F_VER_LIST;
105997af62cec418cd722fb43c6010d6430534e12353Jens Axboe
10600d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		if (ipo->flags & IP_F_TRIMMED)
10610d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe			io_u->flags |= IO_U_F_TRIMMED;
10620d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
1063d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe		if (!fio_file_open(io_u->file)) {
106497af62cec418cd722fb43c6010d6430534e12353Jens Axboe			int r = td_io_open_file(td, io_u->file);
106597af62cec418cd722fb43c6010d6430534e12353Jens Axboe
1066bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			if (r) {
1067bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe				dprint(FD_VERIFY, "failed file %s open\n",
1068bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe						io_u->file->file_name);
106997af62cec418cd722fb43c6010d6430534e12353Jens Axboe				return 1;
1070bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			}
107197af62cec418cd722fb43c6010d6430534e12353Jens Axboe		}
107297af62cec418cd722fb43c6010d6430534e12353Jens Axboe
107397af62cec418cd722fb43c6010d6430534e12353Jens Axboe		get_file(ipo->file);
1074d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe		assert(fio_file_open(io_u->file));
1075e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->ddir = DDIR_READ;
107636167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->xfer_buf = io_u->buf;
107736167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->xfer_buflen = io_u->buflen;
10780d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
10790d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		remove_trim_entry(td, ipo);
1080e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		free(ipo);
1081bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "get_next_verify: ret io_u %p\n", io_u);
1082c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat
1083c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat		if (!td->o.verify_pattern_bytes) {
1084c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat			io_u->rand_seed = __rand(&td->__verify_state);
1085c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat			if (sizeof(int) != sizeof(long *))
1086c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat				io_u->rand_seed *= __rand(&td->__verify_state);
1087c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat		}
1088e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		return 0;
1089e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	}
1090e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
1091f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboenothing:
1092bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "get_next_verify: empty\n");
1093e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	return 1;
1094e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
1095e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1096dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboevoid fio_verify_init(struct thread_data *td)
1097dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe{
1098dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe	if (td->o.verify == VERIFY_CRC32C_INTEL ||
1099dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe	    td->o.verify == VERIFY_CRC32C) {
1100dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe		crc32c_intel_probe();
1101dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe	}
1102dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe}
1103dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe
1104e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboestatic void *verify_async_thread(void *data)
1105e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
1106e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	struct thread_data *td = data;
1107e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	struct io_u *io_u;
1108e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	int ret = 0;
1109e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1110e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	if (td->o.verify_cpumask_set &&
1111e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	    fio_setaffinity(td->pid, td->o.verify_cpumask)) {
1112e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		log_err("fio: failed setting verify thread affinity\n");
1113e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		goto done;
1114e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	}
1115e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1116e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	do {
1117e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		FLIST_HEAD(list);
1118e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe
1119e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		read_barrier();
1120e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		if (td->verify_thread_exit)
1121e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			break;
1122e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1123e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		pthread_mutex_lock(&td->io_u_lock);
1124e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1125e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		while (flist_empty(&td->verify_list) &&
1126e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		       !td->verify_thread_exit) {
1127b36e298b5bdfc31ffc9a4c14e94a9c5c748888b0Jens Axboe			ret = pthread_cond_wait(&td->verify_cond,
1128b36e298b5bdfc31ffc9a4c14e94a9c5c748888b0Jens Axboe							&td->io_u_lock);
1129e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			if (ret) {
1130e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe				pthread_mutex_unlock(&td->io_u_lock);
1131e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe				break;
1132e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			}
1133e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		}
1134e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1135e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		flist_splice_init(&td->verify_list, &list);
1136e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		pthread_mutex_unlock(&td->io_u_lock);
1137e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe
1138e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		if (flist_empty(&list))
1139e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			continue;
1140e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1141e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		while (!flist_empty(&list)) {
11422ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe			io_u = flist_entry(list.next, struct io_u, verify_list);
11432ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe			flist_del(&io_u->verify_list);
1144e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1145d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			ret = verify_io_u(td, io_u);
1146e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe			put_io_u(td, io_u);
1147d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			if (!ret)
1148d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				continue;
11498b28bd41375930664a0ff9ff9b101a88ac416ac5Dmitry Monakhov			if (td_non_fatal_error(td, ERROR_TYPE_VERIFY_BIT, ret)) {
1150d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				update_error_count(td, ret);
1151d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				td_clear_error(td);
1152d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				ret = 0;
1153d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			}
1154e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		}
1155e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	} while (!ret);
1156e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1157d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe	if (ret) {
1158d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe		td_verror(td, ret, "async_verify");
1159f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe		if (td->o.verify_fatal)
1160f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe			td->terminate = 1;
1161d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe	}
1162d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe
1163e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboedone:
1164e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_lock(&td->io_u_lock);
1165e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->nr_verify_threads--;
1166e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_unlock(&td->io_u_lock);
1167e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1168e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_cond_signal(&td->free_cond);
1169e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	return NULL;
1170e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
1171e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1172e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_async_init(struct thread_data *td)
1173e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
1174e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	int i, ret;
1175304a47c7d94f407cc72a87025679a67f02288447bart Van Assche	pthread_attr_t attr;
1176304a47c7d94f407cc72a87025679a67f02288447bart Van Assche
1177304a47c7d94f407cc72a87025679a67f02288447bart Van Assche	pthread_attr_init(&attr);
1178304a47c7d94f407cc72a87025679a67f02288447bart Van Assche	pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN);
1179e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1180e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_thread_exit = 0;
1181e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1182e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_threads = malloc(sizeof(pthread_t) * td->o.verify_async);
1183e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	for (i = 0; i < td->o.verify_async; i++) {
1184304a47c7d94f407cc72a87025679a67f02288447bart Van Assche		ret = pthread_create(&td->verify_threads[i], &attr,
1185e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe					verify_async_thread, td);
1186e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		if (ret) {
1187e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			log_err("fio: async verify creation failed: %s\n",
1188e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe					strerror(ret));
1189e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			break;
1190e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		}
1191e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		ret = pthread_detach(td->verify_threads[i]);
1192e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		if (ret) {
1193e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			log_err("fio: async verify thread detach failed: %s\n",
1194e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe					strerror(ret));
1195e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			break;
1196e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		}
1197e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		td->nr_verify_threads++;
1198e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	}
1199e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1200304a47c7d94f407cc72a87025679a67f02288447bart Van Assche	pthread_attr_destroy(&attr);
1201304a47c7d94f407cc72a87025679a67f02288447bart Van Assche
1202e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	if (i != td->o.verify_async) {
1203e40823b10920f679d84f3f2222e319c168b1e7daJens Axboe		log_err("fio: only %d verify threads started, exiting\n", i);
1204e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		td->verify_thread_exit = 1;
1205e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		write_barrier();
1206e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		pthread_cond_broadcast(&td->verify_cond);
1207e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		return 1;
1208e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	}
1209e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1210e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	return 0;
1211e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
1212e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1213e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboevoid verify_async_exit(struct thread_data *td)
1214e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
1215e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_thread_exit = 1;
1216e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	write_barrier();
1217e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_cond_broadcast(&td->verify_cond);
1218e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1219e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_lock(&td->io_u_lock);
1220e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1221e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	while (td->nr_verify_threads)
1222e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		pthread_cond_wait(&td->free_cond, &td->io_u_lock);
1223e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1224e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_unlock(&td->io_u_lock);
1225e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	free(td->verify_threads);
1226e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_threads = NULL;
1227e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
1228