verify.c revision 936216f8cd8ae2261282453d82a2a8232bb4db45
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/*
160936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * Verify container, pass info to verify handlers and allow them to
161936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * pass info back in case of error
162936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe */
163936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestruct vcont {
164936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	/*
165936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	 * Input
166936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	 */
167936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	struct io_u *io_u;
168936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	unsigned int hdr_num;
169936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe
170936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	/*
171936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	 * Output, only valid in case of error
172936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	 */
173936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	unsigned char *good_crc;
174936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	unsigned char *bad_crc;
175936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	unsigned int crc_len;
176936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe};
177936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe
178936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe/*
179d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe * Return data area 'header_num'
180d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe */
181936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic inline void *io_u_verify_off(struct verify_header *hdr, struct vcont *vc)
182d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe{
183936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	return vc->io_u->buf + vc->hdr_num * hdr->len + hdr_size(hdr);
184d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe}
185d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe
1867437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic int verify_io_u_meta(struct verify_header *hdr, struct thread_data *td,
187936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			    struct vcont *vc)
1887437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{
1897437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	struct vhdr_meta *vh = hdr_priv(hdr);
190936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	struct io_u *io_u = vc->io_u;
1917437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
192bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "meta verify io_u %p, len %u\n", io_u, hdr->len);
193bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
194936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	if (vh->offset != io_u->offset + vc->hdr_num * td->o.verify_interval) {
1957437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		log_err("meta: verify failed at %llu/%u\n",
196936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			io_u->offset + vc->hdr_num * hdr->len, hdr->len);
1979fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
1987437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	}
1997437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
2007437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	return 0;
2017437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis}
2027437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
203936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha512(struct verify_header *hdr, struct vcont *vc)
204cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
205936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
206546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha512 *vh = hdr_priv(hdr);
207cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	uint8_t sha512[128];
208cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha512_ctx sha512_ctx = {
209cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		.buf = sha512,
210cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
211cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
212936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "sha512 verify io_u %p, len %u\n", vc->io_u, hdr->len);
213bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
214cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha512_init(&sha512_ctx);
2158767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	sha512_update(&sha512_ctx, p, hdr->len - hdr_size(hdr));
216cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
217546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (memcmp(vh->sha512, sha512_ctx.buf, sizeof(sha512))) {
218cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		log_err("sha512: verify failed at %llu/%u\n",
219936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			vc->io_u->offset + vc->hdr_num * hdr->len, hdr->len);
220546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		hexdump(vh->sha512, sizeof(vh->sha512));
221cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		hexdump(sha512_ctx.buf, sizeof(sha512));
2229fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
223cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	}
224cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
225cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	return 0;
226cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
227cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
228936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha256(struct verify_header *hdr, struct vcont *vc)
229cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
230936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
231546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha256 *vh = hdr_priv(hdr);
232bc77f56f79f6ae155e9eb26263ed686ef28b47ecJens Axboe	uint8_t sha256[64];
233cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha256_ctx sha256_ctx = {
234cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		.buf = sha256,
235cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
236cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
237936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "sha256 verify io_u %p, len %u\n", vc->io_u, hdr->len);
238bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
239cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha256_init(&sha256_ctx);
2408767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	sha256_update(&sha256_ctx, p, hdr->len - hdr_size(hdr));
241cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
242546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (memcmp(vh->sha256, sha256_ctx.buf, sizeof(sha256))) {
243cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		log_err("sha256: verify failed at %llu/%u\n",
244936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			vc->io_u->offset + vc->hdr_num * hdr->len, hdr->len);
245546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		hexdump(vh->sha256, sizeof(vh->sha256));
246cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		hexdump(sha256_ctx.buf, sizeof(sha256));
2479fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
248cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	}
249cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
250cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	return 0;
251cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
252cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
253936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha1(struct verify_header *hdr, struct vcont *vc)
2547c353ceb3257b132f4c98326046b42201e070731Jens Axboe{
255936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
2567c353ceb3257b132f4c98326046b42201e070731Jens Axboe	struct vhdr_sha1 *vh = hdr_priv(hdr);
2577c353ceb3257b132f4c98326046b42201e070731Jens Axboe	uint32_t sha1[5];
2587c353ceb3257b132f4c98326046b42201e070731Jens Axboe	struct sha1_ctx sha1_ctx = {
2597c353ceb3257b132f4c98326046b42201e070731Jens Axboe		.H = sha1,
2607c353ceb3257b132f4c98326046b42201e070731Jens Axboe	};
2617c353ceb3257b132f4c98326046b42201e070731Jens Axboe
262936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "sha1 verify io_u %p, len %u\n", vc->io_u, hdr->len);
2637c353ceb3257b132f4c98326046b42201e070731Jens Axboe
2647c353ceb3257b132f4c98326046b42201e070731Jens Axboe	sha1_init(&sha1_ctx);
2657c353ceb3257b132f4c98326046b42201e070731Jens Axboe	sha1_update(&sha1_ctx, p, hdr->len - hdr_size(hdr));
2667c353ceb3257b132f4c98326046b42201e070731Jens Axboe
2677c353ceb3257b132f4c98326046b42201e070731Jens Axboe	if (memcmp(vh->sha1, sha1_ctx.H, sizeof(sha1))) {
2687c353ceb3257b132f4c98326046b42201e070731Jens Axboe		log_err("sha1: verify failed at %llu/%u\n",
269936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			vc->io_u->offset + vc->hdr_num * hdr->len, hdr->len);
2707c353ceb3257b132f4c98326046b42201e070731Jens Axboe		hexdump(vh->sha1, sizeof(vh->sha1));
2717c353ceb3257b132f4c98326046b42201e070731Jens Axboe		hexdump(sha1_ctx.H, sizeof(sha1));
2727c353ceb3257b132f4c98326046b42201e070731Jens Axboe		return EILSEQ;
2737c353ceb3257b132f4c98326046b42201e070731Jens Axboe	}
2747c353ceb3257b132f4c98326046b42201e070731Jens Axboe
2757c353ceb3257b132f4c98326046b42201e070731Jens Axboe	return 0;
2767c353ceb3257b132f4c98326046b42201e070731Jens Axboe}
2777c353ceb3257b132f4c98326046b42201e070731Jens Axboe
278936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc7(struct verify_header *hdr, struct vcont *vc)
2791e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{
280936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
281546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc7 *vh = hdr_priv(hdr);
2821e154bdbf14a1d352117aea057035235b66f0381Jens Axboe	unsigned char c;
2831e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
284936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc7 verify io_u %p, len %u\n", vc->io_u, hdr->len);
285bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
2868767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc7(p, hdr->len - hdr_size(hdr));
2871e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
288546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (c != vh->crc7) {
2893f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		log_err("crc7: verify failed at %llu/%u\n",
290936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			vc->io_u->offset + vc->hdr_num * hdr->len, hdr->len);
291546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		log_err("crc7: wanted %x, got %x\n", vh->crc7, c);
2929fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
2931e154bdbf14a1d352117aea057035235b66f0381Jens Axboe	}
2941e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
2951e154bdbf14a1d352117aea057035235b66f0381Jens Axboe	return 0;
2961e154bdbf14a1d352117aea057035235b66f0381Jens Axboe}
2971e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
298936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc16(struct verify_header *hdr, struct vcont *vc)
299969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{
300936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
301546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc16 *vh = hdr_priv(hdr);
302969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe	unsigned short c;
303969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
304936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc16 verify io_u %p, len %u\n", vc->io_u, hdr->len);
305bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
3068767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc16(p, hdr->len - hdr_size(hdr));
307969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
308546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (c != vh->crc16) {
3093f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		log_err("crc16: verify failed at %llu/%u\n",
310936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			vc->io_u->offset + vc->hdr_num * hdr->len, hdr->len);
311546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		log_err("crc16: wanted %x, got %x\n", vh->crc16, c);
3129fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
313969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe	}
314969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
315969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe	return 0;
316969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe}
317969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
318936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc64(struct verify_header *hdr, struct vcont *vc)
319d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{
320936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
321546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc64 *vh = hdr_priv(hdr);
322d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe	unsigned long long c;
323d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
324936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc64 verify io_u %p, len %u\n", vc->io_u, hdr->len);
325bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
3268767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc64(p, hdr->len - hdr_size(hdr));
327d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
328546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (c != vh->crc64) {
3293f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		log_err("crc64: verify failed at %llu/%u\n",
330936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe				vc->io_u->offset + vc->hdr_num * hdr->len,
3313f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis				hdr->len);
3325ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		log_err("crc64: wanted %llx, got %llx\n",
3335ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe					(unsigned long long) vh->crc64, c);
3349fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
335d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe	}
336d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
337d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe	return 0;
338d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe}
339d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
340936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc32(struct verify_header *hdr, struct vcont *vc)
341e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
342936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
343546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
344546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	uint32_t c;
345e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
346936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc32 verify io_u %p, len %u\n", vc->io_u, hdr->len);
347bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
3488767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc32(p, hdr->len - hdr_size(hdr));
349e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
350546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (c != vh->crc32) {
3513f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		log_err("crc32: verify failed at %llu/%u\n",
352936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			vc->io_u->offset + vc->hdr_num * hdr->len, hdr->len);
353546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		log_err("crc32: wanted %x, got %x\n", vh->crc32, c);
3549fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
355e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	}
356e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
357e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	return 0;
358e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
359e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
360936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc32c(struct verify_header *hdr, struct vcont *vc)
361bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{
362936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
363bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
364bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	uint32_t c;
365bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
366936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc32c verify io_u %p, len %u\n", vc->io_u, hdr->len);
367bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
3683845591fadea480177223e28c9d1c03642d34f0eJens Axboe	if (hdr->verify_type == VERIFY_CRC32C_INTEL)
3693845591fadea480177223e28c9d1c03642d34f0eJens Axboe		c = crc32c_intel(p, hdr->len - hdr_size(hdr));
3703845591fadea480177223e28c9d1c03642d34f0eJens Axboe	else
3713845591fadea480177223e28c9d1c03642d34f0eJens Axboe		c = crc32c(p, hdr->len - hdr_size(hdr));
372bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
373bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	if (c != vh->crc32) {
374bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe		log_err("crc32c: verify failed at %llu/%u\n",
375936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			vc->io_u->offset + vc->hdr_num * hdr->len, hdr->len);
376bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe		log_err("crc32c: wanted %x, got %x\n", vh->crc32, c);
3779fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
378bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	}
379bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
380bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	return 0;
381bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe}
382bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
383936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_md5(struct verify_header *hdr, struct vcont *vc)
384e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
385936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
386546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_md5 *vh = hdr_priv(hdr);
3878c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	uint32_t hash[MD5_HASH_WORDS];
3888c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	struct md5_ctx md5_ctx = {
3898c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe		.hash = hash,
3908c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	};
391e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
392936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "md5 verify io_u %p, len %u\n", vc->io_u, hdr->len);
393bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
39461f821f16cf27d8742e09b3a137c933cd0085e9bJens Axboe	md5_init(&md5_ctx);
3958767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	md5_update(&md5_ctx, p, hdr->len - hdr_size(hdr));
396e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
397546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (memcmp(vh->md5_digest, md5_ctx.hash, sizeof(hash))) {
3983f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		log_err("md5: verify failed at %llu/%u\n",
399936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			vc->io_u->offset + vc->hdr_num * hdr->len, hdr->len);
400546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		hexdump(vh->md5_digest, sizeof(vh->md5_digest));
4018c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe		hexdump(md5_ctx.hash, sizeof(hash));
4029fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe		return EILSEQ;
403e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	}
404e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
405e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	return 0;
406e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
407e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
4083f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboestatic unsigned int hweight8(unsigned int w)
4093f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe{
4103f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe	unsigned int res = w - ((w >> 1) & 0x55);
4113f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
4123f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe	res = (res & 0x33) + ((res >> 2) & 0x33);
4133f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe	return (res + (res >> 4)) & 0x0F;
4143f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe}
4153f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
4160e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandranint verify_io_u_pattern(char *pattern, unsigned long pattern_size,
4175ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			char *buf, unsigned int len, unsigned int mod)
418a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis{
419a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	unsigned int i;
420a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis
421a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	for (i = 0; i < len; i++) {
4220e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran		if (buf[i] != pattern[mod]) {
4233f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe			unsigned int bits;
4243f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
4250e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran			bits = hweight8(buf[i] ^ pattern[mod]);
4263f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe			log_err("fio: got pattern %x, wanted %x. Bad bits %d\n",
4270e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran				buf[i], pattern[mod], bits);
4283f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe			log_err("fio: bad pattern block offset %u\n", i);
4299fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe			return EILSEQ;
4303f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe		}
431a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis		mod++;
432a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis		if (mod == pattern_size)
433a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis			mod = 0;
434a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	}
435a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis
436a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	return 0;
437a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis}
438a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis
439e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe/*
440e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe * Push IO verification to a separate thread
441e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe */
442e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_io_u_async(struct thread_data *td, struct io_u *io_u)
443e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
444e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	if (io_u->file)
445e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		put_file_log(td, io_u->file);
446e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
447e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	io_u->file = NULL;
448e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
449e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_lock(&td->io_u_lock);
4500c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran
4510c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran	if (io_u->flags & IO_U_F_IN_CUR_DEPTH) {
4520c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran		td->cur_depth--;
4530c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran		io_u->flags &= ~IO_U_F_IN_CUR_DEPTH;
4540c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran	}
455e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	flist_del(&io_u->list);
456e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	flist_add_tail(&io_u->list, &td->verify_list);
4572ecc1b57721e3cb72bbf558bc169c97037fe3d0aJens Axboe	io_u->flags |= IO_U_F_FREE_DEF;
458e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_unlock(&td->io_u_lock);
459e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
460e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_cond_signal(&td->verify_cond);
461e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	return 0;
462e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
463e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
46436690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboeint verify_io_u(struct thread_data *td, struct io_u *io_u)
465e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
4663f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis	struct verify_header *hdr;
467a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	unsigned int hdr_size, hdr_inc, hdr_num = 0;
46895646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe	void *p;
469e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	int ret;
470e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
4711dcc049824b840df1ee0ef5d019fffa4037e1bb0Shawn Lewis	if (td->o.verify == VERIFY_NULL || io_u->ddir != DDIR_READ)
47236690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe		return 0;
47336690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe
4743f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis	hdr_inc = io_u->buflen;
475a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe	if (td->o.verify_interval)
476a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe		hdr_inc = td->o.verify_interval;
477e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
478a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe	ret = 0;
4795ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	for (p = io_u->buf; p < io_u->buf + io_u->buflen;
4805ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	     p += hdr_inc, hdr_num++) {
481936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe		struct vcont vc;
482936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe
483a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe		if (ret && td->o.verify_fatal) {
484a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe			td->terminate = 1;
485a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe			break;
486a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe		}
487a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis		hdr_size = __hdr_size(td->o.verify);
488a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe		if (td->o.verify_offset)
489a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis			memswp(p, p + td->o.verify_offset, hdr_size);
49095646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe		hdr = p;
491e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
492936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe		vc.io_u = io_u;
493936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe		vc.hdr_num = hdr_num;
494936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe
4953f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe		if (hdr->fio_magic != FIO_HDR_MAGIC) {
496b7a3e6616829c16ba11ff2d5f7c17a598e40dfebRadha Ramachandran			log_err("Bad verify header %x at %llu\n",
497b7a3e6616829c16ba11ff2d5f7c17a598e40dfebRadha Ramachandran					hdr->fio_magic,
498b7a3e6616829c16ba11ff2d5f7c17a598e40dfebRadha Ramachandran					io_u->offset + hdr_num * hdr->len);
4999fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe			return EILSEQ;
5003f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe		}
5013f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
502e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis		if (td->o.verify_pattern_bytes) {
503bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "pattern verify io_u %p, len %u\n",
504bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe								io_u, hdr->len);
505e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis			ret = verify_io_u_pattern(td->o.verify_pattern,
5060e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran				  td->o.verify_pattern_bytes,
5070e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran				  p + hdr_size,
5080e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran				  hdr_inc - hdr_size,
5090e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran				  hdr_size % td->o.verify_pattern_bytes);
510e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran			/*
511e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran			 * Also verify the meta data, if applicable
512e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran			 */
513e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran			if (hdr->verify_type == VERIFY_META)
514936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe				ret |= verify_io_u_meta(hdr, td, &vc);
515e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran
516e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis			if (ret)
517e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis				log_err("fio: verify failed at %llu/%u\n",
518e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis					io_u->offset + hdr_num * hdr->len,
519e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis					hdr->len);
520e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis			continue;
521e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis		}
522e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis
5233f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		switch (hdr->verify_type) {
5243f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_MD5:
525936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_md5(hdr, &vc);
5263f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
5273f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC64:
528936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc64(hdr, &vc);
5293f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
530bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe		case VERIFY_CRC32C:
5313845591fadea480177223e28c9d1c03642d34f0eJens Axboe		case VERIFY_CRC32C_INTEL:
532936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc32c(hdr, &vc);
533bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe			break;
5343f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC32:
535936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc32(hdr, &vc);
5363f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
5373f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC16:
538936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc16(hdr, &vc);
5393f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
5403f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC7:
541936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc7(hdr, &vc);
5423f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
543cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA256:
544936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_sha256(hdr, &vc);
545cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
546cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA512:
547936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_sha512(hdr, &vc);
548cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
5497437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		case VERIFY_META:
550936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_meta(hdr, td, &vc);
5517437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis			break;
5527c353ceb3257b132f4c98326046b42201e070731Jens Axboe		case VERIFY_SHA1:
553936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_sha1(hdr, &vc);
5547c353ceb3257b132f4c98326046b42201e070731Jens Axboe			break;
5553f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		default:
5563f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			log_err("Bad verify type %u\n", hdr->verify_type);
557d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe			ret = EINVAL;
5583f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		}
5593f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis	}
560a7dfe862c2e3fe72b8db6a6e67302048d3731c6dJens Axboe
561a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe	return ret;
562e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
563e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
5647437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic void fill_meta(struct verify_header *hdr, struct thread_data *td,
5655ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		      struct io_u *io_u, unsigned int header_num)
5667437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{
5677437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	struct vhdr_meta *vh = hdr_priv(hdr);
5687437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
5697437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->thread = td->thread_number;
5707437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
5717437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->time_sec = io_u->start_time.tv_sec;
5727437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->time_usec = io_u->start_time.tv_usec;
5737437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
5747437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->numberio = td->io_issues[DDIR_WRITE];
5757437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
5767437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->offset = io_u->offset + header_num * td->o.verify_interval;
5777437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis}
5787437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
579cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha512(struct verify_header *hdr, void *p, unsigned int len)
580cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
581546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha512 *vh = hdr_priv(hdr);
582cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha512_ctx sha512_ctx = {
583546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.buf = vh->sha512,
584cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
585cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
586cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha512_init(&sha512_ctx);
587cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha512_update(&sha512_ctx, p, len);
588cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
589cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
590cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha256(struct verify_header *hdr, void *p, unsigned int len)
591cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
592546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha256 *vh = hdr_priv(hdr);
593cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha256_ctx sha256_ctx = {
594546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.buf = vh->sha256,
595cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
596cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
597cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha256_init(&sha256_ctx);
598cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha256_update(&sha256_ctx, p, len);
599cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
600cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
6017c353ceb3257b132f4c98326046b42201e070731Jens Axboestatic void fill_sha1(struct verify_header *hdr, void *p, unsigned int len)
6027c353ceb3257b132f4c98326046b42201e070731Jens Axboe{
6037c353ceb3257b132f4c98326046b42201e070731Jens Axboe	struct vhdr_sha1 *vh = hdr_priv(hdr);
6047c353ceb3257b132f4c98326046b42201e070731Jens Axboe	struct sha1_ctx sha1_ctx = {
6057c353ceb3257b132f4c98326046b42201e070731Jens Axboe		.H = vh->sha1,
6067c353ceb3257b132f4c98326046b42201e070731Jens Axboe	};
6077c353ceb3257b132f4c98326046b42201e070731Jens Axboe
6087c353ceb3257b132f4c98326046b42201e070731Jens Axboe	sha1_init(&sha1_ctx);
6097c353ceb3257b132f4c98326046b42201e070731Jens Axboe	sha1_update(&sha1_ctx, p, len);
6107c353ceb3257b132f4c98326046b42201e070731Jens Axboe}
6117c353ceb3257b132f4c98326046b42201e070731Jens Axboe
6121e154bdbf14a1d352117aea057035235b66f0381Jens Axboestatic void fill_crc7(struct verify_header *hdr, void *p, unsigned int len)
6131e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{
614546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc7 *vh = hdr_priv(hdr);
615546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
616546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc7 = crc7(p, len);
6171e154bdbf14a1d352117aea057035235b66f0381Jens Axboe}
6181e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
619969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboestatic void fill_crc16(struct verify_header *hdr, void *p, unsigned int len)
620969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{
621546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc16 *vh = hdr_priv(hdr);
622546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
623546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc16 = crc16(p, len);
624969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe}
625969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
626e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_crc32(struct verify_header *hdr, void *p, unsigned int len)
627e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
628546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
629546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
630546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc32 = crc32(p, len);
631e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
632e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
633bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboestatic void fill_crc32c(struct verify_header *hdr, void *p, unsigned int len)
634bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{
635bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
636bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
6373845591fadea480177223e28c9d1c03642d34f0eJens Axboe	if (hdr->verify_type == VERIFY_CRC32C_INTEL)
6383845591fadea480177223e28c9d1c03642d34f0eJens Axboe		vh->crc32 = crc32c_intel(p, len);
6393845591fadea480177223e28c9d1c03642d34f0eJens Axboe	else
6403845591fadea480177223e28c9d1c03642d34f0eJens Axboe		vh->crc32 = crc32c(p, len);
641bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe}
642bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
643d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboestatic void fill_crc64(struct verify_header *hdr, void *p, unsigned int len)
644d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{
645546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc64 *vh = hdr_priv(hdr);
646546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
647546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc64 = crc64(p, len);
648d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe}
649d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
650e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_md5(struct verify_header *hdr, void *p, unsigned int len)
651e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
652546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_md5 *vh = hdr_priv(hdr);
6538c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	struct md5_ctx md5_ctx = {
654546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.hash = (uint32_t *) vh->md5_digest,
6558c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	};
656e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
65761f821f16cf27d8742e09b3a137c933cd0085e9bJens Axboe	md5_init(&md5_ctx);
658e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	md5_update(&md5_ctx, p, len);
659e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
660e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
661e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe/*
662e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * fill body of io_u->buf with random data and add a header with the
663e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * crc32 or md5 sum of that data.
664e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe */
665e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboevoid populate_verify_io_u(struct thread_data *td, struct io_u *io_u)
666e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
667baefa9beacca430b8e3275c07d2f46ef14654468Jens Axboe	struct verify_header *hdr;
66895646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe	void *p = io_u->buf, *data;
6697437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	unsigned int hdr_inc, data_len, header_num = 0;
670e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
6719cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe	if (td->o.verify == VERIFY_NULL)
6729cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe		return;
6739cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe
67490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	fill_pattern(td, p, io_u->buflen);
675546a9142511875524850ac92776184fd9fb7196eShawn Lewis
676546a9142511875524850ac92776184fd9fb7196eShawn Lewis	hdr_inc = io_u->buflen;
677a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe	if (td->o.verify_interval)
678a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe		hdr_inc = td->o.verify_interval;
679baefa9beacca430b8e3275c07d2f46ef14654468Jens Axboe
6805ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	for (; p < io_u->buf + io_u->buflen; p += hdr_inc) {
68195646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe		hdr = p;
6823f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis
6833f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		hdr->fio_magic = FIO_HDR_MAGIC;
6843f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		hdr->verify_type = td->o.verify;
685546a9142511875524850ac92776184fd9fb7196eShawn Lewis		hdr->len = hdr_inc;
6868767783245faac99a7e1c330a1d6536e579c8402Jens Axboe		data_len = hdr_inc - hdr_size(hdr);
6873f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis
6888767783245faac99a7e1c330a1d6536e579c8402Jens Axboe		data = p + hdr_size(hdr);
6893f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		switch (td->o.verify) {
6903f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_MD5:
691bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "fill md5 io_u %p, len %u\n",
692bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe							io_u, hdr->len);
6933f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			fill_md5(hdr, data, data_len);
6943f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
6953f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC64:
696bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "fill crc64 io_u %p, len %u\n",
697bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe							io_u, hdr->len);
6983f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			fill_crc64(hdr, data, data_len);
6993f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
700bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe		case VERIFY_CRC32C:
7013845591fadea480177223e28c9d1c03642d34f0eJens Axboe		case VERIFY_CRC32C_INTEL:
702bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe			dprint(FD_VERIFY, "fill crc32c io_u %p, len %u\n",
703bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe							io_u, hdr->len);
704bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe			fill_crc32c(hdr, data, data_len);
705bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe			break;
7063f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC32:
707bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "fill crc32 io_u %p, len %u\n",
708bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe							io_u, hdr->len);
7093f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			fill_crc32(hdr, data, data_len);
7103f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
7113f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC16:
712bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "fill crc16 io_u %p, len %u\n",
713bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe							io_u, hdr->len);
7143f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			fill_crc16(hdr, data, data_len);
7153f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
7163f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC7:
717bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "fill crc7 io_u %p, len %u\n",
718bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe							io_u, hdr->len);
7193f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			fill_crc7(hdr, data, data_len);
7203f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
721cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA256:
722bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "fill sha256 io_u %p, len %u\n",
723bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe							io_u, hdr->len);
724cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			fill_sha256(hdr, data, data_len);
725cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
726cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA512:
727bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "fill sha512 io_u %p, len %u\n",
728bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe							io_u, hdr->len);
729cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			fill_sha512(hdr, data, data_len);
730cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
7317437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		case VERIFY_META:
732bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "fill meta io_u %p, len %u\n",
733bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe							io_u, hdr->len);
7347437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis			fill_meta(hdr, td, io_u, header_num);
7357437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis			break;
7367c353ceb3257b132f4c98326046b42201e070731Jens Axboe		case VERIFY_SHA1:
7377c353ceb3257b132f4c98326046b42201e070731Jens Axboe			dprint(FD_VERIFY, "fill sha1 io_u %p, len %u\n",
7387c353ceb3257b132f4c98326046b42201e070731Jens Axboe							io_u, hdr->len);
7397c353ceb3257b132f4c98326046b42201e070731Jens Axboe			fill_sha1(hdr, data, data_len);
7407c353ceb3257b132f4c98326046b42201e070731Jens Axboe			break;
7413f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		default:
7423f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			log_err("fio: bad verify type: %d\n", td->o.verify);
7433f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			assert(0);
7443f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		}
745a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe		if (td->o.verify_offset)
7468767783245faac99a7e1c330a1d6536e579c8402Jens Axboe			memswp(p, p + td->o.verify_offset, hdr_size(hdr));
7477437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		header_num++;
748e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	}
749e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
750e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
751e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboeint get_next_verify(struct thread_data *td, struct io_u *io_u)
752e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
7538de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	struct io_piece *ipo = NULL;
754e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
755d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	/*
756d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	 * this io_u is from a requeue, we already filled the offsets
757d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	 */
758d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	if (io_u->file)
759d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe		return 0;
760d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe
7618de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	if (!RB_EMPTY_ROOT(&td->io_hist_tree)) {
7628de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe		struct rb_node *n = rb_first(&td->io_hist_tree);
763e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
7648de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe		ipo = rb_entry(n, struct io_piece, rb_node);
7654b87898e8d76aaf05baec83077a11311c1447397Jens Axboe		rb_erase(n, &td->io_hist_tree);
7669e144189c6e000df8a797312e43a4913f3b83c9aJens Axboe		td->io_hist_len--;
76701743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe	} else if (!flist_empty(&td->io_hist_list)) {
76801743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe		ipo = flist_entry(td->io_hist_list.next, struct io_piece, list);
7699e144189c6e000df8a797312e43a4913f3b83c9aJens Axboe		td->io_hist_len--;
77001743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe		flist_del(&ipo->list);
7718de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	}
772e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
7738de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	if (ipo) {
774e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->offset = ipo->offset;
775e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->buflen = ipo->len;
77636167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->file = ipo->file;
77797af62cec418cd722fb43c6010d6430534e12353Jens Axboe
778d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe		if (!fio_file_open(io_u->file)) {
77997af62cec418cd722fb43c6010d6430534e12353Jens Axboe			int r = td_io_open_file(td, io_u->file);
78097af62cec418cd722fb43c6010d6430534e12353Jens Axboe
781bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			if (r) {
782bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe				dprint(FD_VERIFY, "failed file %s open\n",
783bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe						io_u->file->file_name);
78497af62cec418cd722fb43c6010d6430534e12353Jens Axboe				return 1;
785bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			}
78697af62cec418cd722fb43c6010d6430534e12353Jens Axboe		}
78797af62cec418cd722fb43c6010d6430534e12353Jens Axboe
78897af62cec418cd722fb43c6010d6430534e12353Jens Axboe		get_file(ipo->file);
789d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe		assert(fio_file_open(io_u->file));
790e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->ddir = DDIR_READ;
79136167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->xfer_buf = io_u->buf;
79236167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->xfer_buflen = io_u->buflen;
793e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		free(ipo);
794bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "get_next_verify: ret io_u %p\n", io_u);
795e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		return 0;
796e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	}
797e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
798bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "get_next_verify: empty\n");
799e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	return 1;
800e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
801e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
802e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboestatic void *verify_async_thread(void *data)
803e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
804e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	struct thread_data *td = data;
805e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	struct io_u *io_u;
806e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	int ret = 0;
807e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
808e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	if (td->o.verify_cpumask_set &&
809e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	    fio_setaffinity(td->pid, td->o.verify_cpumask)) {
810e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		log_err("fio: failed setting verify thread affinity\n");
811e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		goto done;
812e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	}
813e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
814e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	do {
815e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		FLIST_HEAD(list);
816e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe
817e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		read_barrier();
818e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		if (td->verify_thread_exit)
819e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			break;
820e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
821e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		pthread_mutex_lock(&td->io_u_lock);
822e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
823e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		while (flist_empty(&td->verify_list) &&
824e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		       !td->verify_thread_exit) {
825b36e298b5bdfc31ffc9a4c14e94a9c5c748888b0Jens Axboe			ret = pthread_cond_wait(&td->verify_cond,
826b36e298b5bdfc31ffc9a4c14e94a9c5c748888b0Jens Axboe							&td->io_u_lock);
827e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			if (ret) {
828e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe				pthread_mutex_unlock(&td->io_u_lock);
829e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe				break;
830e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			}
831e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		}
832e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
833e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		flist_splice_init(&td->verify_list, &list);
834e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		pthread_mutex_unlock(&td->io_u_lock);
835e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe
836e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		if (flist_empty(&list))
837e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			continue;
838e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
839e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		while (!flist_empty(&list)) {
840e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe			io_u = flist_entry(list.next, struct io_u, list);
841e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe			flist_del_init(&io_u->list);
842e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
843d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			ret = verify_io_u(td, io_u);
844e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe			put_io_u(td, io_u);
845d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			if (!ret)
846d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				continue;
847d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			if (td->o.continue_on_error &&
848d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			    td_non_fatal_error(ret)) {
849d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				update_error_count(td, ret);
850d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				td_clear_error(td);
851d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				ret = 0;
852d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			}
853e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		}
854e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	} while (!ret);
855e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
856d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe	if (ret) {
857d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe		td_verror(td, ret, "async_verify");
858d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe		td->terminate = 1;
859d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe	}
860d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe
861e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboedone:
862e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_lock(&td->io_u_lock);
863e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->nr_verify_threads--;
864e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_unlock(&td->io_u_lock);
865e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
866e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_cond_signal(&td->free_cond);
867e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	return NULL;
868e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
869e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
870e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_async_init(struct thread_data *td)
871e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
872e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	int i, ret;
873e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
874e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_thread_exit = 0;
875e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
876e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_threads = malloc(sizeof(pthread_t) * td->o.verify_async);
877e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	for (i = 0; i < td->o.verify_async; i++) {
878e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		ret = pthread_create(&td->verify_threads[i], NULL,
879e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe					verify_async_thread, td);
880e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		if (ret) {
881e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			log_err("fio: async verify creation failed: %s\n",
882e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe					strerror(ret));
883e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			break;
884e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		}
885e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		ret = pthread_detach(td->verify_threads[i]);
886e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		if (ret) {
887e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			log_err("fio: async verify thread detach failed: %s\n",
888e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe					strerror(ret));
889e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			break;
890e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		}
891e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		td->nr_verify_threads++;
892e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	}
893e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
894e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	if (i != td->o.verify_async) {
895e40823b10920f679d84f3f2222e319c168b1e7daJens Axboe		log_err("fio: only %d verify threads started, exiting\n", i);
896e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		td->verify_thread_exit = 1;
897e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		write_barrier();
898e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		pthread_cond_broadcast(&td->verify_cond);
899e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		return 1;
900e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	}
901e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
902e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	return 0;
903e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
904e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
905e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboevoid verify_async_exit(struct thread_data *td)
906e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
907e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_thread_exit = 1;
908e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	write_barrier();
909e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_cond_broadcast(&td->verify_cond);
910e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
911e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_lock(&td->io_u_lock);
912e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
913e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	while (td->nr_verify_threads)
914e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		pthread_cond_wait(&td->free_cond, &td->io_u_lock);
915e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
916e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_unlock(&td->io_u_lock);
917e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	free(td->verify_threads);
918e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_threads = NULL;
919e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
920