verify.c revision 2ecc1b57721e3cb72bbf558bc169c97037fe3d0a
1e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe/*
2e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * IO verification helpers
3e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe */
4e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe#include <unistd.h>
5e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe#include <fcntl.h>
6e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe#include <string.h>
797af62cec418cd722fb43c6010d6430534e12353Jens Axboe#include <assert.h>
8e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe#include <pthread.h>
9e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
10e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe#include "fio.h"
114f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe#include "verify.h"
12e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe#include "smalloc.h"
13e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
14eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/md5.h"
15eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc64.h"
16eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc32.h"
17bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe#include "crc/crc32c.h"
18eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc16.h"
19eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc7.h"
20eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/sha256.h"
21eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/sha512.h"
227c353ceb3257b132f4c98326046b42201e070731Jens Axboe#include "crc/sha1.h"
23cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
2490059d65bde4804e4da07401ad6902c1d956b592Jens Axboestatic void fill_random_bytes(struct thread_data *td, void *p, unsigned int len)
25e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
26e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	unsigned int todo;
274c5946c6606abc87ba7e2bfc57a5030d19b6d4d5Jens Axboe	int r;
28e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
29e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	while (len) {
304c5946c6606abc87ba7e2bfc57a5030d19b6d4d5Jens Axboe		r = os_random_long(&td->verify_state);
31e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
32e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		/*
33e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		 * lrand48_r seems to be broken and only fill the bottom
34e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		 * 32-bits, even on 64-bit archs with 64-bit longs
35e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		 */
36e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		todo = sizeof(r);
37e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		if (todo > len)
38e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe			todo = len;
39e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
40e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		memcpy(p, &r, todo);
41e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
42e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		len -= todo;
43e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		p += todo;
44e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	}
45e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
46e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
4790059d65bde4804e4da07401ad6902c1d956b592Jens Axboestatic void fill_pattern(struct thread_data *td, void *p, unsigned int len)
4890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe{
4990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	switch (td->o.verify_pattern_bytes) {
5090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	case 0:
51bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "fill random bytes len=%u\n", len);
5290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		fill_random_bytes(td, p, len);
5390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		break;
5490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	case 1:
55bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "fill verify pattern b=0 len=%u\n", len);
560e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran		memset(p, td->o.verify_pattern[0], len);
5790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		break;
580e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran	default: {
590e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran		unsigned int i = 0, size = 0;
6090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		unsigned char *b = p;
6190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe
62bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "fill verify pattern b=%d len=%u\n",
63bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe					td->o.verify_pattern_bytes, len);
64bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
6590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		while (i < len) {
660e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran			size = td->o.verify_pattern_bytes;
670e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran			if (size > (len - i))
680e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran				size = len - i;
690e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran			memcpy(b+i, td->o.verify_pattern, size);
700e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran			i += size;
7190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		}
7290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		break;
7390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		}
7490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	}
7590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe}
7690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe
774764aec9fe5988281bdc114c13ac771fb16713ccJens Axboestatic void memswp(void *buf1, void *buf2, unsigned int len)
78546a9142511875524850ac92776184fd9fb7196eShawn Lewis{
79dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis	char swap[200];
80dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis
81dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis	assert(len <= sizeof(swap));
8290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe
83546a9142511875524850ac92776184fd9fb7196eShawn Lewis	memcpy(&swap, buf1, len);
84546a9142511875524850ac92776184fd9fb7196eShawn Lewis	memcpy(buf1, buf2, len);
85546a9142511875524850ac92776184fd9fb7196eShawn Lewis	memcpy(buf2, &swap, len);
86546a9142511875524850ac92776184fd9fb7196eShawn Lewis}
87546a9142511875524850ac92776184fd9fb7196eShawn Lewis
88e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void hexdump(void *buffer, int len)
89e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
90e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	unsigned char *p = buffer;
91e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	int i;
92e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
93e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	for (i = 0; i < len; i++)
946d86144dd10b05e8b82e9b895c35dd778e5e71abJens Axboe		log_info("%02x", p[i]);
956d86144dd10b05e8b82e9b895c35dd778e5e71abJens Axboe	log_info("\n");
96e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
97e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
98d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe/*
998767783245faac99a7e1c330a1d6536e579c8402Jens Axboe * Prepare for seperation of verify_header and checksum header
1008767783245faac99a7e1c330a1d6536e579c8402Jens Axboe */
101546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic inline unsigned int __hdr_size(int verify_type)
1028767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{
1035921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe	unsigned int len = len;
1048767783245faac99a7e1c330a1d6536e579c8402Jens Axboe
105546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	switch (verify_type) {
106546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_NONE:
107546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_NULL:
108546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = 0;
109546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
110546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_MD5:
111546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_md5);
112546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
113546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC64:
114546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc64);
115546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
116bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	case VERIFY_CRC32C:
117546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC32:
1183845591fadea480177223e28c9d1c03642d34f0eJens Axboe	case VERIFY_CRC32C_INTEL:
119546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc32);
120546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
121546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC16:
122546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc16);
123546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
124546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC7:
125546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc7);
126546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
127546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_SHA256:
128546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_sha256);
129546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
130546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_SHA512:
131546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_sha512);
132546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
1337437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	case VERIFY_META:
1347437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		len = sizeof(struct vhdr_meta);
1357437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		break;
1367c353ceb3257b132f4c98326046b42201e070731Jens Axboe	case VERIFY_SHA1:
1377c353ceb3257b132f4c98326046b42201e070731Jens Axboe		len = sizeof(struct vhdr_sha1);
1387c353ceb3257b132f4c98326046b42201e070731Jens Axboe		break;
139546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	default:
140546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		log_err("fio: unknown verify header!\n");
141546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		assert(0);
142546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	}
143546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
144546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	return len + sizeof(struct verify_header);
1458767783245faac99a7e1c330a1d6536e579c8402Jens Axboe}
1468767783245faac99a7e1c330a1d6536e579c8402Jens Axboe
1478767783245faac99a7e1c330a1d6536e579c8402Jens Axboestatic inline unsigned int hdr_size(struct verify_header *hdr)
1488767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{
149546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	return __hdr_size(hdr->verify_type);
150546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe}
151546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
152546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic void *hdr_priv(struct verify_header *hdr)
153546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe{
154546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	void *priv = hdr;
155546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
156546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	return priv + sizeof(struct verify_header);
1578767783245faac99a7e1c330a1d6536e579c8402Jens Axboe}
1588767783245faac99a7e1c330a1d6536e579c8402Jens Axboe
1598767783245faac99a7e1c330a1d6536e579c8402Jens Axboe/*
160d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe * Return data area 'header_num'
161d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe */
162d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboestatic inline void *io_u_verify_off(struct verify_header *hdr,
1635ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				    struct io_u *io_u, unsigned char header_num)
164d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe{
1658767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	return io_u->buf + header_num * hdr->len + hdr_size(hdr);
166d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe}
167d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe
1687437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic int verify_io_u_meta(struct verify_header *hdr, struct thread_data *td,
1695ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			    struct io_u *io_u, unsigned int header_num)
1707437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{
1717437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	struct vhdr_meta *vh = hdr_priv(hdr);
1727437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
173bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "meta verify io_u %p, len %u\n", io_u, hdr->len);
174bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
1757437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	if (vh->offset != io_u->offset + header_num * td->o.verify_interval) {
1767437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		log_err("meta: verify failed at %llu/%u\n",
1775ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				io_u->offset + header_num * hdr->len, hdr->len);
1789fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
1797437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	}
1807437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
1817437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	return 0;
1827437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis}
1837437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
184cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic int verify_io_u_sha512(struct verify_header *hdr, struct io_u *io_u,
185cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			      unsigned int header_num)
186cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
187cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	void *p = io_u_verify_off(hdr, io_u, header_num);
188546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha512 *vh = hdr_priv(hdr);
189cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	uint8_t sha512[128];
190cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha512_ctx sha512_ctx = {
191cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		.buf = sha512,
192cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
193cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
194bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "sha512 verify io_u %p, len %u\n", io_u, hdr->len);
195bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
196cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha512_init(&sha512_ctx);
1978767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	sha512_update(&sha512_ctx, p, hdr->len - hdr_size(hdr));
198cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
199546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (memcmp(vh->sha512, sha512_ctx.buf, sizeof(sha512))) {
200cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		log_err("sha512: verify failed at %llu/%u\n",
2015ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				io_u->offset + header_num * hdr->len, hdr->len);
202546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		hexdump(vh->sha512, sizeof(vh->sha512));
203cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		hexdump(sha512_ctx.buf, sizeof(sha512));
2049fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
205cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	}
206cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
207cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	return 0;
208cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
209cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
210cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic int verify_io_u_sha256(struct verify_header *hdr, struct io_u *io_u,
211cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			      unsigned int header_num)
212cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
213cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	void *p = io_u_verify_off(hdr, io_u, header_num);
214546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha256 *vh = hdr_priv(hdr);
215cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	uint8_t sha256[128];
216cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha256_ctx sha256_ctx = {
217cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		.buf = sha256,
218cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
219cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
220bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "sha256 verify io_u %p, len %u\n", io_u, hdr->len);
221bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
222cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha256_init(&sha256_ctx);
2238767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	sha256_update(&sha256_ctx, p, hdr->len - hdr_size(hdr));
224cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
225546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (memcmp(vh->sha256, sha256_ctx.buf, sizeof(sha256))) {
226cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		log_err("sha256: verify failed at %llu/%u\n",
2275ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				io_u->offset + header_num * hdr->len, hdr->len);
228546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		hexdump(vh->sha256, sizeof(vh->sha256));
229cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		hexdump(sha256_ctx.buf, sizeof(sha256));
2309fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
231cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	}
232cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
233cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	return 0;
234cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
235cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
2367c353ceb3257b132f4c98326046b42201e070731Jens Axboestatic int verify_io_u_sha1(struct verify_header *hdr, struct io_u *io_u,
2377c353ceb3257b132f4c98326046b42201e070731Jens Axboe			    unsigned int header_num)
2387c353ceb3257b132f4c98326046b42201e070731Jens Axboe{
2397c353ceb3257b132f4c98326046b42201e070731Jens Axboe	void *p = io_u_verify_off(hdr, io_u, header_num);
2407c353ceb3257b132f4c98326046b42201e070731Jens Axboe	struct vhdr_sha1 *vh = hdr_priv(hdr);
2417c353ceb3257b132f4c98326046b42201e070731Jens Axboe	uint32_t sha1[5];
2427c353ceb3257b132f4c98326046b42201e070731Jens Axboe	struct sha1_ctx sha1_ctx = {
2437c353ceb3257b132f4c98326046b42201e070731Jens Axboe		.H = sha1,
2447c353ceb3257b132f4c98326046b42201e070731Jens Axboe	};
2457c353ceb3257b132f4c98326046b42201e070731Jens Axboe
2467c353ceb3257b132f4c98326046b42201e070731Jens Axboe	dprint(FD_VERIFY, "sha1 verify io_u %p, len %u\n", io_u, hdr->len);
2477c353ceb3257b132f4c98326046b42201e070731Jens Axboe
2487c353ceb3257b132f4c98326046b42201e070731Jens Axboe	sha1_init(&sha1_ctx);
2497c353ceb3257b132f4c98326046b42201e070731Jens Axboe	sha1_update(&sha1_ctx, p, hdr->len - hdr_size(hdr));
2507c353ceb3257b132f4c98326046b42201e070731Jens Axboe
2517c353ceb3257b132f4c98326046b42201e070731Jens Axboe	if (memcmp(vh->sha1, sha1_ctx.H, sizeof(sha1))) {
2527c353ceb3257b132f4c98326046b42201e070731Jens Axboe		log_err("sha1: verify failed at %llu/%u\n",
2537c353ceb3257b132f4c98326046b42201e070731Jens Axboe				io_u->offset + header_num * hdr->len, hdr->len);
2547c353ceb3257b132f4c98326046b42201e070731Jens Axboe		hexdump(vh->sha1, sizeof(vh->sha1));
2557c353ceb3257b132f4c98326046b42201e070731Jens Axboe		hexdump(sha1_ctx.H, sizeof(sha1));
2567c353ceb3257b132f4c98326046b42201e070731Jens Axboe		return EILSEQ;
2577c353ceb3257b132f4c98326046b42201e070731Jens Axboe	}
2587c353ceb3257b132f4c98326046b42201e070731Jens Axboe
2597c353ceb3257b132f4c98326046b42201e070731Jens Axboe	return 0;
2607c353ceb3257b132f4c98326046b42201e070731Jens Axboe}
2617c353ceb3257b132f4c98326046b42201e070731Jens Axboe
2623f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_crc7(struct verify_header *hdr, struct io_u *io_u,
2635ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			    unsigned char header_num)
2641e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{
265d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe	void *p = io_u_verify_off(hdr, io_u, header_num);
266546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc7 *vh = hdr_priv(hdr);
2671e154bdbf14a1d352117aea057035235b66f0381Jens Axboe	unsigned char c;
2681e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
269bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "crc7 verify io_u %p, len %u\n", io_u, hdr->len);
270bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
2718767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc7(p, hdr->len - hdr_size(hdr));
2721e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
273546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (c != vh->crc7) {
2743f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		log_err("crc7: verify failed at %llu/%u\n",
2755ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				io_u->offset + header_num * hdr->len, hdr->len);
276546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		log_err("crc7: wanted %x, got %x\n", vh->crc7, c);
2779fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
2781e154bdbf14a1d352117aea057035235b66f0381Jens Axboe	}
2791e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
2801e154bdbf14a1d352117aea057035235b66f0381Jens Axboe	return 0;
2811e154bdbf14a1d352117aea057035235b66f0381Jens Axboe}
2821e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
2833f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_crc16(struct verify_header *hdr, struct io_u *io_u,
2845ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			     unsigned int header_num)
285969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{
286d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe	void *p = io_u_verify_off(hdr, io_u, header_num);
287546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc16 *vh = hdr_priv(hdr);
288969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe	unsigned short c;
289969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
290bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "crc16 verify io_u %p, len %u\n", io_u, hdr->len);
291bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
2928767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc16(p, hdr->len - hdr_size(hdr));
293969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
294546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (c != vh->crc16) {
2953f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		log_err("crc16: verify failed at %llu/%u\n",
2965ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				io_u->offset + header_num * hdr->len, hdr->len);
297546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		log_err("crc16: wanted %x, got %x\n", vh->crc16, c);
2989fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
299969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe	}
300969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
301969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe	return 0;
302969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe}
303969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
3043f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_crc64(struct verify_header *hdr, struct io_u *io_u,
3055ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			     unsigned int header_num)
306d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{
307d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe	void *p = io_u_verify_off(hdr, io_u, header_num);
308546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc64 *vh = hdr_priv(hdr);
309d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe	unsigned long long c;
310d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
311bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "crc64 verify io_u %p, len %u\n", io_u, hdr->len);
312bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
3138767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc64(p, hdr->len - hdr_size(hdr));
314d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
315546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (c != vh->crc64) {
3163f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		log_err("crc64: verify failed at %llu/%u\n",
3173f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis				io_u->offset + header_num * hdr->len,
3183f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis				hdr->len);
3195ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		log_err("crc64: wanted %llx, got %llx\n",
3205ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe					(unsigned long long) vh->crc64, c);
3219fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
322d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe	}
323d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
324d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe	return 0;
325d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe}
326d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
3273f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_crc32(struct verify_header *hdr, struct io_u *io_u,
3285ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			     unsigned int header_num)
329e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
330d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe	void *p = io_u_verify_off(hdr, io_u, header_num);
331546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
332546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	uint32_t c;
333e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
334bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "crc32 verify io_u %p, len %u\n", io_u, hdr->len);
335bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
3368767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc32(p, hdr->len - hdr_size(hdr));
337e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
338546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (c != vh->crc32) {
3393f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		log_err("crc32: verify failed at %llu/%u\n",
3405ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				io_u->offset + header_num * hdr->len, hdr->len);
341546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		log_err("crc32: wanted %x, got %x\n", vh->crc32, c);
3429fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
343e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	}
344e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
345e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	return 0;
346e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
347e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
348bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboestatic int verify_io_u_crc32c(struct verify_header *hdr, struct io_u *io_u,
349bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe			      unsigned int header_num)
350bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{
351bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	void *p = io_u_verify_off(hdr, io_u, header_num);
352bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
353bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	uint32_t c;
354bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
355bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	dprint(FD_VERIFY, "crc32c verify io_u %p, len %u\n", io_u, hdr->len);
356bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
3573845591fadea480177223e28c9d1c03642d34f0eJens Axboe	if (hdr->verify_type == VERIFY_CRC32C_INTEL)
3583845591fadea480177223e28c9d1c03642d34f0eJens Axboe		c = crc32c_intel(p, hdr->len - hdr_size(hdr));
3593845591fadea480177223e28c9d1c03642d34f0eJens Axboe	else
3603845591fadea480177223e28c9d1c03642d34f0eJens Axboe		c = crc32c(p, hdr->len - hdr_size(hdr));
361bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
362bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	if (c != vh->crc32) {
363bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe		log_err("crc32c: verify failed at %llu/%u\n",
364bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe				io_u->offset + header_num * hdr->len, hdr->len);
365bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe		log_err("crc32c: wanted %x, got %x\n", vh->crc32, c);
3669fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
367bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	}
368bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
369bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	return 0;
370bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe}
371bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
3723f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_md5(struct verify_header *hdr, struct io_u *io_u,
3735ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			   unsigned int header_num)
374e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
375d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe	void *p = io_u_verify_off(hdr, io_u, header_num);
376546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_md5 *vh = hdr_priv(hdr);
3778c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	uint32_t hash[MD5_HASH_WORDS];
3788c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	struct md5_ctx md5_ctx = {
3798c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe		.hash = hash,
3808c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	};
381e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
382bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "md5 verify io_u %p, len %u\n", io_u, hdr->len);
383bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
38461f821f16cf27d8742e09b3a137c933cd0085e9bJens Axboe	md5_init(&md5_ctx);
3858767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	md5_update(&md5_ctx, p, hdr->len - hdr_size(hdr));
386e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
387546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (memcmp(vh->md5_digest, md5_ctx.hash, sizeof(hash))) {
3883f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		log_err("md5: verify failed at %llu/%u\n",
3895ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe				io_u->offset + header_num * hdr->len, hdr->len);
390546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		hexdump(vh->md5_digest, sizeof(vh->md5_digest));
3918c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe		hexdump(md5_ctx.hash, sizeof(hash));
3929fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
393e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	}
394e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
395e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	return 0;
396e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
397e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
3983f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboestatic unsigned int hweight8(unsigned int w)
3993f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe{
4003f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe	unsigned int res = w - ((w >> 1) & 0x55);
4013f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
4023f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe	res = (res & 0x33) + ((res >> 2) & 0x33);
4033f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe	return (res + (res >> 4)) & 0x0F;
4043f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe}
4053f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
4060e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandranint verify_io_u_pattern(char *pattern, unsigned long pattern_size,
4075ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			char *buf, unsigned int len, unsigned int mod)
408a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis{
409a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	unsigned int i;
410a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis
411a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	for (i = 0; i < len; i++) {
4120e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran		if (buf[i] != pattern[mod]) {
4133f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe			unsigned int bits;
4143f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
4150e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran			bits = hweight8(buf[i] ^ pattern[mod]);
4163f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe			log_err("fio: got pattern %x, wanted %x. Bad bits %d\n",
4170e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran				buf[i], pattern[mod], bits);
4183f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe			log_err("fio: bad pattern block offset %u\n", i);
4199fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe			return EILSEQ;
4203f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe		}
421a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis		mod++;
422a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis		if (mod == pattern_size)
423a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis			mod = 0;
424a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	}
425a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis
426a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	return 0;
427a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis}
428a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis
429e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe/*
430e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe * Push IO verification to a separate thread
431e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe */
432e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_io_u_async(struct thread_data *td, struct io_u *io_u)
433e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
434e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	if (io_u->file)
435e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		put_file_log(td, io_u->file);
436e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
437e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	io_u->file = NULL;
438e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
439e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_lock(&td->io_u_lock);
4400c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran
4410c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran	if (io_u->flags & IO_U_F_IN_CUR_DEPTH) {
4420c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran		td->cur_depth--;
4430c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran		io_u->flags &= ~IO_U_F_IN_CUR_DEPTH;
4440c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran	}
445e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	flist_del(&io_u->list);
446e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	flist_add_tail(&io_u->list, &td->verify_list);
4472ecc1b57721e3cb72bbf558bc169c97037fe3d0aJens Axboe	io_u->flags |= IO_U_F_FREE_DEF;
448e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_unlock(&td->io_u_lock);
449e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
450e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_cond_signal(&td->verify_cond);
451e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	return 0;
452e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
453e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
45436690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboeint verify_io_u(struct thread_data *td, struct io_u *io_u)
455e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
4563f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis	struct verify_header *hdr;
457a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	unsigned int hdr_size, hdr_inc, hdr_num = 0;
45895646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe	void *p;
459e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	int ret;
460e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
4611dcc049824b840df1ee0ef5d019fffa4037e1bb0Shawn Lewis	if (td->o.verify == VERIFY_NULL || io_u->ddir != DDIR_READ)
46236690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe		return 0;
46336690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe
4643f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis	hdr_inc = io_u->buflen;
465a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe	if (td->o.verify_interval)
466a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe		hdr_inc = td->o.verify_interval;
467e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
468a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe	ret = 0;
4695ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	for (p = io_u->buf; p < io_u->buf + io_u->buflen;
4705ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	     p += hdr_inc, hdr_num++) {
471a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe		if (ret && td->o.verify_fatal) {
472a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe			td->terminate = 1;
473a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe			break;
474a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe		}
475a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis		hdr_size = __hdr_size(td->o.verify);
476a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe		if (td->o.verify_offset)
477a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis			memswp(p, p + td->o.verify_offset, hdr_size);
47895646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe		hdr = p;
479e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
4803f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe		if (hdr->fio_magic != FIO_HDR_MAGIC) {
4813f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe			log_err("Bad verify header %x\n", hdr->fio_magic);
4829fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe			return EILSEQ;
4833f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe		}
4843f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
485e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis		if (td->o.verify_pattern_bytes) {
486bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "pattern verify io_u %p, len %u\n",
487bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe								io_u, hdr->len);
488e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis			ret = verify_io_u_pattern(td->o.verify_pattern,
4890e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran				  td->o.verify_pattern_bytes,
4900e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran				  p + hdr_size,
4910e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran				  hdr_inc - hdr_size,
4920e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran				  hdr_size % td->o.verify_pattern_bytes);
493e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran			/*
494e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran			 * Also verify the meta data, if applicable
495e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran			 */
496e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran			if (hdr->verify_type == VERIFY_META)
497e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran				ret |= verify_io_u_meta(hdr, td, io_u, hdr_num);
498e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran
499e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis			if (ret)
500e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis				log_err("fio: verify failed at %llu/%u\n",
501e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis					io_u->offset + hdr_num * hdr->len,
502e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis					hdr->len);
503e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis			continue;
504e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis		}
505e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis
5063f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		switch (hdr->verify_type) {
5073f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_MD5:
5083f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			ret = verify_io_u_md5(hdr, io_u, hdr_num);
5093f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
5103f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC64:
5113f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			ret = verify_io_u_crc64(hdr, io_u, hdr_num);
5123f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
513bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe		case VERIFY_CRC32C:
5143845591fadea480177223e28c9d1c03642d34f0eJens Axboe		case VERIFY_CRC32C_INTEL:
515bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe			ret = verify_io_u_crc32c(hdr, io_u, hdr_num);
516bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe			break;
5173f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC32:
5183f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			ret = verify_io_u_crc32(hdr, io_u, hdr_num);
5193f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
5203f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC16:
5213f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			ret = verify_io_u_crc16(hdr, io_u, hdr_num);
5223f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
5233f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC7:
5243f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			ret = verify_io_u_crc7(hdr, io_u, hdr_num);
5253f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
526cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA256:
527cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			ret = verify_io_u_sha256(hdr, io_u, hdr_num);
528cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
529cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA512:
530cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			ret = verify_io_u_sha512(hdr, io_u, hdr_num);
531cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
5327437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		case VERIFY_META:
5337437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis			ret = verify_io_u_meta(hdr, td, io_u, hdr_num);
5347437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis			break;
5357c353ceb3257b132f4c98326046b42201e070731Jens Axboe		case VERIFY_SHA1:
5367c353ceb3257b132f4c98326046b42201e070731Jens Axboe			ret = verify_io_u_sha1(hdr, io_u, hdr_num);
5377c353ceb3257b132f4c98326046b42201e070731Jens Axboe			break;
5383f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		default:
5393f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			log_err("Bad verify type %u\n", hdr->verify_type);
540d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe			ret = EINVAL;
5413f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		}
5423f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis	}
543a7dfe862c2e3fe72b8db6a6e67302048d3731c6dJens Axboe
544a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe	return ret;
545e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
546e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
5477437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic void fill_meta(struct verify_header *hdr, struct thread_data *td,
5485ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		      struct io_u *io_u, unsigned int header_num)
5497437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{
5507437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	struct vhdr_meta *vh = hdr_priv(hdr);
5517437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
5527437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->thread = td->thread_number;
5537437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
5547437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->time_sec = io_u->start_time.tv_sec;
5557437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->time_usec = io_u->start_time.tv_usec;
5567437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
5577437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->numberio = td->io_issues[DDIR_WRITE];
5587437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
5597437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->offset = io_u->offset + header_num * td->o.verify_interval;
5607437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis}
5617437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
562cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha512(struct verify_header *hdr, void *p, unsigned int len)
563cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
564546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha512 *vh = hdr_priv(hdr);
565cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha512_ctx sha512_ctx = {
566546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.buf = vh->sha512,
567cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
568cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
569cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha512_init(&sha512_ctx);
570cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha512_update(&sha512_ctx, p, len);
571cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
572cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
573cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha256(struct verify_header *hdr, void *p, unsigned int len)
574cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
575546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha256 *vh = hdr_priv(hdr);
576cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha256_ctx sha256_ctx = {
577546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.buf = vh->sha256,
578cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
579cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
580cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha256_init(&sha256_ctx);
581cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha256_update(&sha256_ctx, p, len);
582cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
583cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
5847c353ceb3257b132f4c98326046b42201e070731Jens Axboestatic void fill_sha1(struct verify_header *hdr, void *p, unsigned int len)
5857c353ceb3257b132f4c98326046b42201e070731Jens Axboe{
5867c353ceb3257b132f4c98326046b42201e070731Jens Axboe	struct vhdr_sha1 *vh = hdr_priv(hdr);
5877c353ceb3257b132f4c98326046b42201e070731Jens Axboe	struct sha1_ctx sha1_ctx = {
5887c353ceb3257b132f4c98326046b42201e070731Jens Axboe		.H = vh->sha1,
5897c353ceb3257b132f4c98326046b42201e070731Jens Axboe	};
5907c353ceb3257b132f4c98326046b42201e070731Jens Axboe
5917c353ceb3257b132f4c98326046b42201e070731Jens Axboe	sha1_init(&sha1_ctx);
5927c353ceb3257b132f4c98326046b42201e070731Jens Axboe	sha1_update(&sha1_ctx, p, len);
5937c353ceb3257b132f4c98326046b42201e070731Jens Axboe}
5947c353ceb3257b132f4c98326046b42201e070731Jens Axboe
5951e154bdbf14a1d352117aea057035235b66f0381Jens Axboestatic void fill_crc7(struct verify_header *hdr, void *p, unsigned int len)
5961e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{
597546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc7 *vh = hdr_priv(hdr);
598546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
599546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc7 = crc7(p, len);
6001e154bdbf14a1d352117aea057035235b66f0381Jens Axboe}
6011e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
602969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboestatic void fill_crc16(struct verify_header *hdr, void *p, unsigned int len)
603969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{
604546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc16 *vh = hdr_priv(hdr);
605546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
606546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc16 = crc16(p, len);
607969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe}
608969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
609e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_crc32(struct verify_header *hdr, void *p, unsigned int len)
610e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
611546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
612546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
613546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc32 = crc32(p, len);
614e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
615e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
616bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboestatic void fill_crc32c(struct verify_header *hdr, void *p, unsigned int len)
617bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{
618bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
619bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
6203845591fadea480177223e28c9d1c03642d34f0eJens Axboe	if (hdr->verify_type == VERIFY_CRC32C_INTEL)
6213845591fadea480177223e28c9d1c03642d34f0eJens Axboe		vh->crc32 = crc32c_intel(p, len);
6223845591fadea480177223e28c9d1c03642d34f0eJens Axboe	else
6233845591fadea480177223e28c9d1c03642d34f0eJens Axboe		vh->crc32 = crc32c(p, len);
624bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe}
625bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
626d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboestatic void fill_crc64(struct verify_header *hdr, void *p, unsigned int len)
627d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{
628546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc64 *vh = hdr_priv(hdr);
629546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
630546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc64 = crc64(p, len);
631d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe}
632d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
633e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_md5(struct verify_header *hdr, void *p, unsigned int len)
634e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
635546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_md5 *vh = hdr_priv(hdr);
6368c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	struct md5_ctx md5_ctx = {
637546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.hash = (uint32_t *) vh->md5_digest,
6388c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	};
639e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
64061f821f16cf27d8742e09b3a137c933cd0085e9bJens Axboe	md5_init(&md5_ctx);
641e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	md5_update(&md5_ctx, p, len);
642e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
643e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
644e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe/*
645e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * fill body of io_u->buf with random data and add a header with the
646e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * crc32 or md5 sum of that data.
647e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe */
648e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboevoid populate_verify_io_u(struct thread_data *td, struct io_u *io_u)
649e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
650baefa9beacca430b8e3275c07d2f46ef14654468Jens Axboe	struct verify_header *hdr;
65195646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe	void *p = io_u->buf, *data;
6527437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	unsigned int hdr_inc, data_len, header_num = 0;
653e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
6549cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe	if (td->o.verify == VERIFY_NULL)
6559cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe		return;
6569cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe
65790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	fill_pattern(td, p, io_u->buflen);
658546a9142511875524850ac92776184fd9fb7196eShawn Lewis
659546a9142511875524850ac92776184fd9fb7196eShawn Lewis	hdr_inc = io_u->buflen;
660a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe	if (td->o.verify_interval)
661a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe		hdr_inc = td->o.verify_interval;
662baefa9beacca430b8e3275c07d2f46ef14654468Jens Axboe
6635ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	for (; p < io_u->buf + io_u->buflen; p += hdr_inc) {
66495646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe		hdr = p;
6653f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis
6663f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		hdr->fio_magic = FIO_HDR_MAGIC;
6673f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		hdr->verify_type = td->o.verify;
668546a9142511875524850ac92776184fd9fb7196eShawn Lewis		hdr->len = hdr_inc;
6698767783245faac99a7e1c330a1d6536e579c8402Jens Axboe		data_len = hdr_inc - hdr_size(hdr);
6703f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis
6718767783245faac99a7e1c330a1d6536e579c8402Jens Axboe		data = p + hdr_size(hdr);
6723f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		switch (td->o.verify) {
6733f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_MD5:
674bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "fill md5 io_u %p, len %u\n",
675bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe							io_u, hdr->len);
6763f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			fill_md5(hdr, data, data_len);
6773f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
6783f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC64:
679bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "fill crc64 io_u %p, len %u\n",
680bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe							io_u, hdr->len);
6813f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			fill_crc64(hdr, data, data_len);
6823f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
683bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe		case VERIFY_CRC32C:
6843845591fadea480177223e28c9d1c03642d34f0eJens Axboe		case VERIFY_CRC32C_INTEL:
685bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe			dprint(FD_VERIFY, "fill crc32c io_u %p, len %u\n",
686bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe							io_u, hdr->len);
687bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe			fill_crc32c(hdr, data, data_len);
688bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe			break;
6893f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC32:
690bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "fill crc32 io_u %p, len %u\n",
691bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe							io_u, hdr->len);
6923f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			fill_crc32(hdr, data, data_len);
6933f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
6943f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC16:
695bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "fill crc16 io_u %p, len %u\n",
696bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe							io_u, hdr->len);
6973f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			fill_crc16(hdr, data, data_len);
6983f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
6993f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC7:
700bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "fill crc7 io_u %p, len %u\n",
701bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe							io_u, hdr->len);
7023f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			fill_crc7(hdr, data, data_len);
7033f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
704cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA256:
705bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "fill sha256 io_u %p, len %u\n",
706bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe							io_u, hdr->len);
707cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			fill_sha256(hdr, data, data_len);
708cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
709cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA512:
710bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "fill sha512 io_u %p, len %u\n",
711bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe							io_u, hdr->len);
712cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			fill_sha512(hdr, data, data_len);
713cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
7147437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		case VERIFY_META:
715bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "fill meta io_u %p, len %u\n",
716bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe							io_u, hdr->len);
7177437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis			fill_meta(hdr, td, io_u, header_num);
7187437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis			break;
7197c353ceb3257b132f4c98326046b42201e070731Jens Axboe		case VERIFY_SHA1:
7207c353ceb3257b132f4c98326046b42201e070731Jens Axboe			dprint(FD_VERIFY, "fill sha1 io_u %p, len %u\n",
7217c353ceb3257b132f4c98326046b42201e070731Jens Axboe							io_u, hdr->len);
7227c353ceb3257b132f4c98326046b42201e070731Jens Axboe			fill_sha1(hdr, data, data_len);
7237c353ceb3257b132f4c98326046b42201e070731Jens Axboe			break;
7243f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		default:
7253f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			log_err("fio: bad verify type: %d\n", td->o.verify);
7263f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			assert(0);
7273f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		}
728a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe		if (td->o.verify_offset)
7298767783245faac99a7e1c330a1d6536e579c8402Jens Axboe			memswp(p, p + td->o.verify_offset, hdr_size(hdr));
7307437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		header_num++;
731e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	}
732e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
733e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
734e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboeint get_next_verify(struct thread_data *td, struct io_u *io_u)
735e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
7368de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	struct io_piece *ipo = NULL;
737e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
738d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	/*
739d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	 * this io_u is from a requeue, we already filled the offsets
740d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	 */
741d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	if (io_u->file)
742d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe		return 0;
743d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe
7448de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	if (!RB_EMPTY_ROOT(&td->io_hist_tree)) {
7458de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe		struct rb_node *n = rb_first(&td->io_hist_tree);
746e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
7478de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe		ipo = rb_entry(n, struct io_piece, rb_node);
7484b87898e8d76aaf05baec83077a11311c1447397Jens Axboe		rb_erase(n, &td->io_hist_tree);
74901743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe	} else if (!flist_empty(&td->io_hist_list)) {
75001743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe		ipo = flist_entry(td->io_hist_list.next, struct io_piece, list);
75101743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe		flist_del(&ipo->list);
7528de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	}
753e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
7548de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	if (ipo) {
755e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->offset = ipo->offset;
756e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->buflen = ipo->len;
75736167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->file = ipo->file;
75897af62cec418cd722fb43c6010d6430534e12353Jens Axboe
759d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe		if (!fio_file_open(io_u->file)) {
76097af62cec418cd722fb43c6010d6430534e12353Jens Axboe			int r = td_io_open_file(td, io_u->file);
76197af62cec418cd722fb43c6010d6430534e12353Jens Axboe
762bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			if (r) {
763bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe				dprint(FD_VERIFY, "failed file %s open\n",
764bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe						io_u->file->file_name);
76597af62cec418cd722fb43c6010d6430534e12353Jens Axboe				return 1;
766bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			}
76797af62cec418cd722fb43c6010d6430534e12353Jens Axboe		}
76897af62cec418cd722fb43c6010d6430534e12353Jens Axboe
76997af62cec418cd722fb43c6010d6430534e12353Jens Axboe		get_file(ipo->file);
770d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe		assert(fio_file_open(io_u->file));
771e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->ddir = DDIR_READ;
77236167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->xfer_buf = io_u->buf;
77336167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->xfer_buflen = io_u->buflen;
774e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		free(ipo);
775bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "get_next_verify: ret io_u %p\n", io_u);
776e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		return 0;
777e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	}
778e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
779bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "get_next_verify: empty\n");
780e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	return 1;
781e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
782e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
783e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboestatic void *verify_async_thread(void *data)
784e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
785e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	struct thread_data *td = data;
786e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	struct io_u *io_u;
787e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	int ret = 0;
788e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
789e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	if (td->o.verify_cpumask_set &&
790e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	    fio_setaffinity(td->pid, td->o.verify_cpumask)) {
791e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		log_err("fio: failed setting verify thread affinity\n");
792e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		goto done;
793e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	}
794e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
795e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	do {
796e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		FLIST_HEAD(list);
797e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe
798e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		read_barrier();
799e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		if (td->verify_thread_exit)
800e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			break;
801e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
802e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		pthread_mutex_lock(&td->io_u_lock);
803e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
804e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		while (flist_empty(&td->verify_list) &&
805e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		       !td->verify_thread_exit) {
806b36e298b5bdfc31ffc9a4c14e94a9c5c748888b0Jens Axboe			ret = pthread_cond_wait(&td->verify_cond,
807b36e298b5bdfc31ffc9a4c14e94a9c5c748888b0Jens Axboe							&td->io_u_lock);
808e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			if (ret) {
809e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe				pthread_mutex_unlock(&td->io_u_lock);
810e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe				break;
811e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			}
812e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		}
813e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
814e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		flist_splice_init(&td->verify_list, &list);
815e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		pthread_mutex_unlock(&td->io_u_lock);
816e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe
817e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		if (flist_empty(&list))
818e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			continue;
819e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
820e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		while (!flist_empty(&list)) {
821e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe			io_u = flist_entry(list.next, struct io_u, list);
822e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe			flist_del_init(&io_u->list);
823e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
824d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			ret = verify_io_u(td, io_u);
825e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe			put_io_u(td, io_u);
826d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			if (!ret)
827d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				continue;
828d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			if (td->o.continue_on_error &&
829d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			    td_non_fatal_error(ret)) {
830d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				update_error_count(td, ret);
831d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				td_clear_error(td);
832d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				ret = 0;
833d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			}
834e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		}
835e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	} while (!ret);
836e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
837d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe	if (ret) {
838d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe		td_verror(td, ret, "async_verify");
839d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe		td->terminate = 1;
840d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe	}
841d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe
842e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboedone:
843e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_lock(&td->io_u_lock);
844e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->nr_verify_threads--;
845e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_unlock(&td->io_u_lock);
846e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
847e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_cond_signal(&td->free_cond);
848e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	return NULL;
849e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
850e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
851e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_async_init(struct thread_data *td)
852e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
853e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	int i, ret;
854e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
855e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_thread_exit = 0;
856e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
857e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_threads = malloc(sizeof(pthread_t) * td->o.verify_async);
858e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	for (i = 0; i < td->o.verify_async; i++) {
859e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		ret = pthread_create(&td->verify_threads[i], NULL,
860e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe					verify_async_thread, td);
861e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		if (ret) {
862e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			log_err("fio: async verify creation failed: %s\n",
863e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe					strerror(ret));
864e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			break;
865e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		}
866e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		ret = pthread_detach(td->verify_threads[i]);
867e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		if (ret) {
868e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			log_err("fio: async verify thread detach failed: %s\n",
869e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe					strerror(ret));
870e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			break;
871e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		}
872e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		td->nr_verify_threads++;
873e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	}
874e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
875e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	if (i != td->o.verify_async) {
876e40823b10920f679d84f3f2222e319c168b1e7daJens Axboe		log_err("fio: only %d verify threads started, exiting\n", i);
877e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		td->verify_thread_exit = 1;
878e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		write_barrier();
879e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		pthread_cond_broadcast(&td->verify_cond);
880e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		return 1;
881e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	}
882e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
883e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	return 0;
884e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
885e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
886e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboevoid verify_async_exit(struct thread_data *td)
887e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
888e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_thread_exit = 1;
889e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	write_barrier();
890e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_cond_broadcast(&td->verify_cond);
891e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
892e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_lock(&td->io_u_lock);
893e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
894e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	while (td->nr_verify_threads)
895e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		pthread_cond_wait(&td->free_cond, &td->io_u_lock);
896e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
897e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_unlock(&td->io_u_lock);
898e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	free(td->verify_threads);
899e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_threads = NULL;
900e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
901