verify.c revision 4aae38a645f3315ca2f8cc57a7ec4110ba7d8319
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"
130d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe#include "trim.h"
14637ef8d9f7645135cf4829894d1e3983cd7a042eJens Axboe#include "lib/rand.h"
15e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
16eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/md5.h"
17eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc64.h"
18eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc32.h"
19bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe#include "crc/crc32c.h"
20eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc16.h"
21eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc7.h"
22eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/sha256.h"
23eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/sha512.h"
247c353ceb3257b132f4c98326046b42201e070731Jens Axboe#include "crc/sha1.h"
25cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
267d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void populate_hdr(struct thread_data *td, struct io_u *io_u,
277d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			 struct verify_header *hdr, unsigned int header_num,
287d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			 unsigned int header_len);
297d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
307d9fb455aadc0c0363489591775496f27f4a560aJens Axboevoid fill_pattern(struct thread_data *td, void *p, unsigned int len, struct io_u *io_u, unsigned long seed, int use_seed)
3190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe{
3290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	switch (td->o.verify_pattern_bytes) {
3390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	case 0:
34bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "fill random bytes len=%u\n", len);
357d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		if (use_seed)
367d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			__fill_random_buf(p, len, seed);
377d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		else
387d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			io_u->rand_seed = fill_random_buf(p, len);
3990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		break;
4090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	case 1:
4110e8a7b30ce2917df9f839d42596c7e3af9a904fRadha Ramachandran		if (io_u->buf_filled_len >= len) {
42cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran			dprint(FD_VERIFY, "using already filled verify pattern b=0 len=%u\n", len);
43cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran			return;
44cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran		}
45bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "fill verify pattern b=0 len=%u\n", len);
460e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran		memset(p, td->o.verify_pattern[0], len);
47cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran		io_u->buf_filled_len = len;
4890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		break;
490e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran	default: {
500e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran		unsigned int i = 0, size = 0;
5190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		unsigned char *b = p;
5290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe
5310e8a7b30ce2917df9f839d42596c7e3af9a904fRadha Ramachandran		if (io_u->buf_filled_len >= len) {
54cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran			dprint(FD_VERIFY, "using already filled verify pattern b=%d len=%u\n",
55cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran					td->o.verify_pattern_bytes, len);
56cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran			return;
57cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran		}
58bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "fill verify pattern b=%d len=%u\n",
59bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe					td->o.verify_pattern_bytes, len);
60bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
6190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		while (i < len) {
620e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran			size = td->o.verify_pattern_bytes;
630e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran			if (size > (len - i))
640e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran				size = len - i;
650e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran			memcpy(b+i, td->o.verify_pattern, size);
660e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran			i += size;
6790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		}
68cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran		io_u->buf_filled_len = len;
6990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		break;
7090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		}
7190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	}
7290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe}
7390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe
74c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboestatic void fill_pattern_headers(struct thread_data *td, struct io_u *io_u,
75c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe				 unsigned long seed, int use_seed)
76c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe{
77c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	unsigned int hdr_inc, header_num;
78c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	struct verify_header *hdr;
79c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	void *p = io_u->buf;
80c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe
81c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	fill_pattern(td, p, io_u->buflen, io_u, seed, use_seed);
82c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe
83c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	hdr_inc = io_u->buflen;
84c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	if (td->o.verify_interval)
85c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe		hdr_inc = td->o.verify_interval;
86c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe
87c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	header_num = 0;
88c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	for (; p < io_u->buf + io_u->buflen; p += hdr_inc) {
89c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe		hdr = p;
90c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe		populate_hdr(td, io_u, hdr, header_num, hdr_inc);
91c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe		header_num++;
92c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	}
93c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe}
94c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe
954764aec9fe5988281bdc114c13ac771fb16713ccJens Axboestatic void memswp(void *buf1, void *buf2, unsigned int len)
96546a9142511875524850ac92776184fd9fb7196eShawn Lewis{
97dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis	char swap[200];
98dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis
99dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis	assert(len <= sizeof(swap));
10090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe
101546a9142511875524850ac92776184fd9fb7196eShawn Lewis	memcpy(&swap, buf1, len);
102546a9142511875524850ac92776184fd9fb7196eShawn Lewis	memcpy(buf1, buf2, len);
103546a9142511875524850ac92776184fd9fb7196eShawn Lewis	memcpy(buf2, &swap, len);
104546a9142511875524850ac92776184fd9fb7196eShawn Lewis}
105546a9142511875524850ac92776184fd9fb7196eShawn Lewis
106e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void hexdump(void *buffer, int len)
107e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
108e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	unsigned char *p = buffer;
109e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	int i;
110e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
111e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	for (i = 0; i < len; i++)
112bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		log_err("%02x", p[i]);
113bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_err("\n");
114e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
115e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
116d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe/*
1178767783245faac99a7e1c330a1d6536e579c8402Jens Axboe * Prepare for seperation of verify_header and checksum header
1188767783245faac99a7e1c330a1d6536e579c8402Jens Axboe */
119546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic inline unsigned int __hdr_size(int verify_type)
1208767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{
12103e20d687566753b90383571e5e152c5142bdffdBruce Cran	unsigned int len = 0;
1228767783245faac99a7e1c330a1d6536e579c8402Jens Axboe
123546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	switch (verify_type) {
124546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_NONE:
125546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_NULL:
126546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = 0;
127546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
128546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_MD5:
129546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_md5);
130546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
131546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC64:
132546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc64);
133546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
134bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	case VERIFY_CRC32C:
135546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC32:
1363845591fadea480177223e28c9d1c03642d34f0eJens Axboe	case VERIFY_CRC32C_INTEL:
137546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc32);
138546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
139546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC16:
140546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc16);
141546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
142546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC7:
143546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc7);
144546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
145546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_SHA256:
146546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_sha256);
147546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
148546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_SHA512:
149546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_sha512);
150546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
1517437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	case VERIFY_META:
1527437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		len = sizeof(struct vhdr_meta);
1537437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		break;
1547c353ceb3257b132f4c98326046b42201e070731Jens Axboe	case VERIFY_SHA1:
1557c353ceb3257b132f4c98326046b42201e070731Jens Axboe		len = sizeof(struct vhdr_sha1);
1567c353ceb3257b132f4c98326046b42201e070731Jens Axboe		break;
157546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	default:
158546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		log_err("fio: unknown verify header!\n");
159546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		assert(0);
160546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	}
161546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
162546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	return len + sizeof(struct verify_header);
1638767783245faac99a7e1c330a1d6536e579c8402Jens Axboe}
1648767783245faac99a7e1c330a1d6536e579c8402Jens Axboe
1658767783245faac99a7e1c330a1d6536e579c8402Jens Axboestatic inline unsigned int hdr_size(struct verify_header *hdr)
1668767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{
167546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	return __hdr_size(hdr->verify_type);
168546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe}
169546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
170546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic void *hdr_priv(struct verify_header *hdr)
171546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe{
172546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	void *priv = hdr;
173546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
174546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	return priv + sizeof(struct verify_header);
1758767783245faac99a7e1c330a1d6536e579c8402Jens Axboe}
1768767783245faac99a7e1c330a1d6536e579c8402Jens Axboe
1778767783245faac99a7e1c330a1d6536e579c8402Jens Axboe/*
178936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * Verify container, pass info to verify handlers and allow them to
179936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * pass info back in case of error
180936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe */
181936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestruct vcont {
182936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	/*
183936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	 * Input
184936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	 */
185936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	struct io_u *io_u;
186936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	unsigned int hdr_num;
1877d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	struct thread_data *td;
188936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe
189936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	/*
190936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	 * Output, only valid in case of error
191936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	 */
192bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	const char *name;
193bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	void *good_crc;
194bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	void *bad_crc;
195936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	unsigned int crc_len;
196936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe};
197936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe
198c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboestatic void dump_buf(char *buf, unsigned int len, unsigned long long offset,
199c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe		     const char *type, struct fio_file *f)
2007d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{
201c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	char fname[256];
2027d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	int ret, fd;
2037d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
204c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	strcpy(fname, f->file_name);
205c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	basename(fname);
206c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe
207c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	sprintf(fname + strlen(fname), ".%llu.%s", offset, type);
2087d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2097d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	fd = open(fname, O_CREAT | O_TRUNC | O_WRONLY, 0644);
2107d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	if (fd < 0) {
2117d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		perror("open verify buf file");
2127d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		return;
2137d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	}
2147d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2157d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	while (len) {
2167d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		ret = write(fd, buf, len);
2177d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		if (!ret)
2187d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			break;
2197d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		else if (ret < 0) {
2207d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			perror("write verify buf file");
2217d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			break;
2227d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		}
2237d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		len -= ret;
2247d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		buf += ret;
2257d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	}
2267d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2277d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	close(fd);
228c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	log_err("       %s data dumped as %s\n", type, fname);
2297d9fb455aadc0c0363489591775496f27f4a560aJens Axboe}
2307d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
231c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe/*
232c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * Dump the contents of the read block and re-generate the correct data
233c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * and dump that too.
234c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe */
2357d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void dump_verify_buffers(struct verify_header *hdr, struct vcont *vc)
2367d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{
2377d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	struct thread_data *td = vc->td;
2387d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	struct io_u *io_u = vc->io_u;
2397d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	unsigned long hdr_offset;
2407d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	struct io_u dummy;
241c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	void *buf;
2427d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
243c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	/*
244c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	 * Dump the contents we just read off disk
245c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	 */
2467d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	hdr_offset = vc->hdr_num * hdr->len;
2477d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
248c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	dump_buf(io_u->buf + hdr_offset, hdr->len, io_u->offset + hdr_offset,
249c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe			"received", vc->io_u->file);
2507d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
251c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	/*
252c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	 * Allocate a new buf and re-generate the original data
253c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	 */
254c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	buf = malloc(io_u->buflen);
2557d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	dummy = *io_u;
256c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	dummy.buf = buf;
2574aae38a645f3315ca2f8cc57a7ec4110ba7d8319Jens Axboe	dummy.rand_seed = hdr->rand_seed;
2587d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
259c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	fill_pattern_headers(td, &dummy, hdr->rand_seed, 1);
2607d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
261c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	dump_buf(buf + hdr_offset, hdr->len, io_u->offset + hdr_offset,
262c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe			"expected", vc->io_u->file);
2637d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	free(buf);
2647d9fb455aadc0c0363489591775496f27f4a560aJens Axboe}
2657d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
266bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboestatic void log_verify_failure(struct verify_header *hdr, struct vcont *vc)
267bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe{
268bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	unsigned long long offset;
269bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe
270bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	offset = vc->io_u->offset;
271bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	offset += vc->hdr_num * hdr->len;
27232c17adf7f75da1f0957d4691633fea60259910fJens Axboe	log_err("%.8s: verify failed at file %s offset %llu, length %u\n",
27332c17adf7f75da1f0957d4691633fea60259910fJens Axboe			vc->name, vc->io_u->file->file_name, offset, hdr->len);
274bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe
275bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (vc->good_crc && vc->bad_crc) {
276bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		log_err("       Expected CRC: ");
277bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		hexdump(vc->good_crc, vc->crc_len);
278bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		log_err("       Received CRC: ");
279bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		hexdump(vc->bad_crc, vc->crc_len);
280bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	}
2817d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2827d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	dump_verify_buffers(hdr, vc);
283bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe}
284bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe
285936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe/*
286d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe * Return data area 'header_num'
287d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe */
288936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic inline void *io_u_verify_off(struct verify_header *hdr, struct vcont *vc)
289d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe{
290936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	return vc->io_u->buf + vc->hdr_num * hdr->len + hdr_size(hdr);
291d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe}
292d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe
2937437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic int verify_io_u_meta(struct verify_header *hdr, struct thread_data *td,
294936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			    struct vcont *vc)
2957437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{
2967437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	struct vhdr_meta *vh = hdr_priv(hdr);
297936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	struct io_u *io_u = vc->io_u;
2987437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
299bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "meta verify io_u %p, len %u\n", io_u, hdr->len);
300bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
301bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (vh->offset == io_u->offset + vc->hdr_num * td->o.verify_interval)
302bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
3037437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
304bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "meta";
305bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
306bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
3077437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis}
3087437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
309936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha512(struct verify_header *hdr, struct vcont *vc)
310cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
311936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
312546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha512 *vh = hdr_priv(hdr);
313cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	uint8_t sha512[128];
314cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha512_ctx sha512_ctx = {
315cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		.buf = sha512,
316cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
317cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
318936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "sha512 verify io_u %p, len %u\n", vc->io_u, hdr->len);
319bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
320cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha512_init(&sha512_ctx);
3218767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	sha512_update(&sha512_ctx, p, hdr->len - hdr_size(hdr));
322cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
323bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (!memcmp(vh->sha512, sha512_ctx.buf, sizeof(sha512)))
324bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
325cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
326bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "sha512";
327bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = vh->sha512;
328bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = sha512_ctx.buf;
329bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = sizeof(vh->sha512);
330bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
331bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
332cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
333cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
334936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha256(struct verify_header *hdr, struct vcont *vc)
335cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
336936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
337546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha256 *vh = hdr_priv(hdr);
338bc77f56f79f6ae155e9eb26263ed686ef28b47ecJens Axboe	uint8_t sha256[64];
339cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha256_ctx sha256_ctx = {
340cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		.buf = sha256,
341cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
342cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
343936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "sha256 verify io_u %p, len %u\n", vc->io_u, hdr->len);
344bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
345cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha256_init(&sha256_ctx);
3468767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	sha256_update(&sha256_ctx, p, hdr->len - hdr_size(hdr));
347cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
348bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (!memcmp(vh->sha256, sha256_ctx.buf, sizeof(sha256)))
349bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
350cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
351bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "sha256";
352bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = vh->sha256;
353bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = sha256_ctx.buf;
354bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = sizeof(vh->sha256);
355bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
356bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
357cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
358cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
359936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha1(struct verify_header *hdr, struct vcont *vc)
3607c353ceb3257b132f4c98326046b42201e070731Jens Axboe{
361936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
3627c353ceb3257b132f4c98326046b42201e070731Jens Axboe	struct vhdr_sha1 *vh = hdr_priv(hdr);
3637c353ceb3257b132f4c98326046b42201e070731Jens Axboe	uint32_t sha1[5];
3647c353ceb3257b132f4c98326046b42201e070731Jens Axboe	struct sha1_ctx sha1_ctx = {
3657c353ceb3257b132f4c98326046b42201e070731Jens Axboe		.H = sha1,
3667c353ceb3257b132f4c98326046b42201e070731Jens Axboe	};
3677c353ceb3257b132f4c98326046b42201e070731Jens Axboe
368936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "sha1 verify io_u %p, len %u\n", vc->io_u, hdr->len);
3697c353ceb3257b132f4c98326046b42201e070731Jens Axboe
3707c353ceb3257b132f4c98326046b42201e070731Jens Axboe	sha1_init(&sha1_ctx);
3717c353ceb3257b132f4c98326046b42201e070731Jens Axboe	sha1_update(&sha1_ctx, p, hdr->len - hdr_size(hdr));
3727c353ceb3257b132f4c98326046b42201e070731Jens Axboe
373bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (!memcmp(vh->sha1, sha1_ctx.H, sizeof(sha1)))
374bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
3757c353ceb3257b132f4c98326046b42201e070731Jens Axboe
376bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "sha1";
377bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = vh->sha1;
378bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = sha1_ctx.H;
379bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = sizeof(vh->sha1);
380bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
381bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
3827c353ceb3257b132f4c98326046b42201e070731Jens Axboe}
3837c353ceb3257b132f4c98326046b42201e070731Jens Axboe
384936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc7(struct verify_header *hdr, struct vcont *vc)
3851e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{
386936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
387546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc7 *vh = hdr_priv(hdr);
3881e154bdbf14a1d352117aea057035235b66f0381Jens Axboe	unsigned char c;
3891e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
390936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc7 verify io_u %p, len %u\n", vc->io_u, hdr->len);
391bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
3928767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc7(p, hdr->len - hdr_size(hdr));
3931e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
394bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc7)
395bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
3961e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
397bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc7";
398bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc7;
399bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
400bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 1;
401bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
402bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
4031e154bdbf14a1d352117aea057035235b66f0381Jens Axboe}
4041e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
405936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc16(struct verify_header *hdr, struct vcont *vc)
406969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{
407936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
408546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc16 *vh = hdr_priv(hdr);
409969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe	unsigned short c;
410969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
411936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc16 verify io_u %p, len %u\n", vc->io_u, hdr->len);
412bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
4138767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc16(p, hdr->len - hdr_size(hdr));
414969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
415bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc16)
416bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
417969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
418bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc16";
419bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc16;
420bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
421bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 2;
422bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
423bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
424969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe}
425969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
426936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc64(struct verify_header *hdr, struct vcont *vc)
427d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{
428936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
429546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc64 *vh = hdr_priv(hdr);
430d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe	unsigned long long c;
431d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
432936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc64 verify io_u %p, len %u\n", vc->io_u, hdr->len);
433bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
4348767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc64(p, hdr->len - hdr_size(hdr));
435d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
436bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc64)
437bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
438d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
439bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc64";
440bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc64;
441bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
442bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 8;
443bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
444bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
445d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe}
446d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
447936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc32(struct verify_header *hdr, struct vcont *vc)
448e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
449936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
450546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
451546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	uint32_t c;
452e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
453936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc32 verify io_u %p, len %u\n", vc->io_u, hdr->len);
454bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
4558767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc32(p, hdr->len - hdr_size(hdr));
456e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
457bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc32)
458bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
459e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
460bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc32";
461bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc32;
462bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
463bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 4;
464bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
465bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
466e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
467e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
468936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc32c(struct verify_header *hdr, struct vcont *vc)
469bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{
470936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
471bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
472bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	uint32_t c;
473bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
474936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc32c verify io_u %p, len %u\n", vc->io_u, hdr->len);
475bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
4763845591fadea480177223e28c9d1c03642d34f0eJens Axboe	if (hdr->verify_type == VERIFY_CRC32C_INTEL)
4773845591fadea480177223e28c9d1c03642d34f0eJens Axboe		c = crc32c_intel(p, hdr->len - hdr_size(hdr));
4783845591fadea480177223e28c9d1c03642d34f0eJens Axboe	else
4793845591fadea480177223e28c9d1c03642d34f0eJens Axboe		c = crc32c(p, hdr->len - hdr_size(hdr));
480bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
481bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc32)
482bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
483bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
484bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc32c";
485bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc32;
486bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
487bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 4;
488bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
489bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
490bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe}
491bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
492936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_md5(struct verify_header *hdr, struct vcont *vc)
493e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
494936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
495546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_md5 *vh = hdr_priv(hdr);
4968c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	uint32_t hash[MD5_HASH_WORDS];
4978c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	struct md5_ctx md5_ctx = {
4988c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe		.hash = hash,
4998c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	};
500e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
501936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "md5 verify io_u %p, len %u\n", vc->io_u, hdr->len);
502bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
50361f821f16cf27d8742e09b3a137c933cd0085e9bJens Axboe	md5_init(&md5_ctx);
5048767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	md5_update(&md5_ctx, p, hdr->len - hdr_size(hdr));
505e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
506bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (!memcmp(vh->md5_digest, md5_ctx.hash, sizeof(hash)))
507bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
508e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
509bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "md5";
510bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = vh->md5_digest;
511bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = md5_ctx.hash;
512bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = sizeof(hash);
513bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
514bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
515e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
516e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
5173f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboestatic unsigned int hweight8(unsigned int w)
5183f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe{
5193f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe	unsigned int res = w - ((w >> 1) & 0x55);
5203f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
5213f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe	res = (res & 0x33) + ((res >> 2) & 0x33);
5223f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe	return (res + (res >> 4)) & 0x0F;
5233f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe}
5243f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
5250e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandranint verify_io_u_pattern(char *pattern, unsigned long pattern_size,
5265ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			char *buf, unsigned int len, unsigned int mod)
527a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis{
528a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	unsigned int i;
529a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis
530a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	for (i = 0; i < len; i++) {
5310e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran		if (buf[i] != pattern[mod]) {
5323f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe			unsigned int bits;
5333f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
5340e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran			bits = hweight8(buf[i] ^ pattern[mod]);
5353f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe			log_err("fio: got pattern %x, wanted %x. Bad bits %d\n",
5360e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran				buf[i], pattern[mod], bits);
5373f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe			log_err("fio: bad pattern block offset %u\n", i);
5389fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe			return EILSEQ;
5393f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe		}
540a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis		mod++;
541a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis		if (mod == pattern_size)
542a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis			mod = 0;
543a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	}
544a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis
545a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	return 0;
546a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis}
547a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis
548e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe/*
549e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe * Push IO verification to a separate thread
550e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe */
551e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_io_u_async(struct thread_data *td, struct io_u *io_u)
552e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
553e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	if (io_u->file)
554e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		put_file_log(td, io_u->file);
555e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
556e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	io_u->file = NULL;
557e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
558e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_lock(&td->io_u_lock);
5590c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran
5600c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran	if (io_u->flags & IO_U_F_IN_CUR_DEPTH) {
5610c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran		td->cur_depth--;
5620c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran		io_u->flags &= ~IO_U_F_IN_CUR_DEPTH;
5630c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran	}
564e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	flist_del(&io_u->list);
565e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	flist_add_tail(&io_u->list, &td->verify_list);
5662ecc1b57721e3cb72bbf558bc169c97037fe3d0aJens Axboe	io_u->flags |= IO_U_F_FREE_DEF;
567e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_unlock(&td->io_u_lock);
568e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
569e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_cond_signal(&td->verify_cond);
570e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	return 0;
571e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
572e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
5730d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboestatic int verify_trimmed_io_u(struct thread_data *td, struct io_u *io_u)
5740d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe{
5750d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	static char zero_buf[1024];
5760d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	unsigned int this_len, len;
5770d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	int ret = 0;
5780d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	void *p;
5790d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
5800d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	if (!td->o.trim_zero)
5810d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		return 0;
5820d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
5830d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	len = io_u->buflen;
5840d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	p = io_u->buf;
5850d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	do {
5860d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		this_len = sizeof(zero_buf);
5870d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		if (this_len > len)
5880d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe			this_len = len;
5890d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		if (memcmp(p, zero_buf, this_len)) {
5900d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe			ret = EILSEQ;
5910d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe			break;
5920d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		}
5930d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		len -= this_len;
5940d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		p += this_len;
5950d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	} while (len);
5960d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
5970d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	if (!ret)
5980d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		return 0;
5990d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
600a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe	log_err("trim: verify failed at file %s offset %llu, length %lu"
601a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		", block offset %lu\n",
602a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe			io_u->file->file_name, io_u->offset, io_u->buflen,
6032f68124f26e54233db41b462a257dabc48e5c32bJens Axboe			(unsigned long) (p - io_u->buf));
6040d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	return ret;
6050d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe}
6060d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
60736690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboeint verify_io_u(struct thread_data *td, struct io_u *io_u)
608e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
6093f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis	struct verify_header *hdr;
610a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	unsigned int hdr_size, hdr_inc, hdr_num = 0;
61195646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe	void *p;
612e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	int ret;
613e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
6141dcc049824b840df1ee0ef5d019fffa4037e1bb0Shawn Lewis	if (td->o.verify == VERIFY_NULL || io_u->ddir != DDIR_READ)
61536690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe		return 0;
6160d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	if (io_u->flags & IO_U_F_TRIMMED) {
6170d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		ret = verify_trimmed_io_u(td, io_u);
6180d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		goto done;
6190d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	}
62036690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe
6213f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis	hdr_inc = io_u->buflen;
622a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe	if (td->o.verify_interval)
623a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe		hdr_inc = td->o.verify_interval;
624e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
625a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe	ret = 0;
6265ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	for (p = io_u->buf; p < io_u->buf + io_u->buflen;
6275ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	     p += hdr_inc, hdr_num++) {
628bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		struct vcont vc = {
629bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe			.io_u		= io_u,
630bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe			.hdr_num	= hdr_num,
6317d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			.td		= td,
632bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		};
633936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe
634f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe		if (ret && td->o.verify_fatal)
635a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe			break;
636f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe
637a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis		hdr_size = __hdr_size(td->o.verify);
638a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe		if (td->o.verify_offset)
639a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis			memswp(p, p + td->o.verify_offset, hdr_size);
64095646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe		hdr = p;
641e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
6423f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe		if (hdr->fio_magic != FIO_HDR_MAGIC) {
643c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe			log_err("verify: bad magic header %x, wanted %x at file %s offset %llu, length %u\n",
644c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe				hdr->fio_magic, FIO_HDR_MAGIC,
645c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe				io_u->file->file_name,
646c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe				io_u->offset + hdr_num * hdr->len, hdr->len);
6479fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe			return EILSEQ;
6483f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe		}
6493f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
650e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis		if (td->o.verify_pattern_bytes) {
651bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "pattern verify io_u %p, len %u\n",
652bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe								io_u, hdr->len);
653e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis			ret = verify_io_u_pattern(td->o.verify_pattern,
6540e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran				  td->o.verify_pattern_bytes,
6550e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran				  p + hdr_size,
6560e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran				  hdr_inc - hdr_size,
6570e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran				  hdr_size % td->o.verify_pattern_bytes);
658c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe
659c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe			if (ret) {
660c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe				log_err("pattern: verify failed at file %s offset %llu, length %u\n",
661c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe					io_u->file->file_name,
662c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe					io_u->offset + hdr_num * hdr->len,
663c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe					hdr->len);
664c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe			}
665c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe
666e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran			/*
667e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran			 * Also verify the meta data, if applicable
668e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran			 */
669e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran			if (hdr->verify_type == VERIFY_META)
670936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe				ret |= verify_io_u_meta(hdr, td, &vc);
671e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis			continue;
672e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis		}
673e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis
6743f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		switch (hdr->verify_type) {
6753f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_MD5:
676936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_md5(hdr, &vc);
6773f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
6783f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC64:
679936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc64(hdr, &vc);
6803f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
681bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe		case VERIFY_CRC32C:
6823845591fadea480177223e28c9d1c03642d34f0eJens Axboe		case VERIFY_CRC32C_INTEL:
683936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc32c(hdr, &vc);
684bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe			break;
6853f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC32:
686936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc32(hdr, &vc);
6873f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
6883f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC16:
689936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc16(hdr, &vc);
6903f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
6913f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC7:
692936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc7(hdr, &vc);
6933f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
694cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA256:
695936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_sha256(hdr, &vc);
696cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
697cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA512:
698936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_sha512(hdr, &vc);
699cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
7007437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		case VERIFY_META:
701936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_meta(hdr, td, &vc);
7027437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis			break;
7037c353ceb3257b132f4c98326046b42201e070731Jens Axboe		case VERIFY_SHA1:
704936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_sha1(hdr, &vc);
7057c353ceb3257b132f4c98326046b42201e070731Jens Axboe			break;
7063f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		default:
7073f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			log_err("Bad verify type %u\n", hdr->verify_type);
708d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe			ret = EINVAL;
7093f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		}
7103f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis	}
711a7dfe862c2e3fe72b8db6a6e67302048d3731c6dJens Axboe
7120d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboedone:
713f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe	if (ret && td->o.verify_fatal)
714f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe		td->terminate = 1;
715f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe
716a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe	return ret;
717e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
718e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
7197437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic void fill_meta(struct verify_header *hdr, struct thread_data *td,
7205ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		      struct io_u *io_u, unsigned int header_num)
7217437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{
7227437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	struct vhdr_meta *vh = hdr_priv(hdr);
7237437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
7247437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->thread = td->thread_number;
7257437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
7267437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->time_sec = io_u->start_time.tv_sec;
7277437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->time_usec = io_u->start_time.tv_usec;
7287437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
7297437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->numberio = td->io_issues[DDIR_WRITE];
7307437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
7317437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->offset = io_u->offset + header_num * td->o.verify_interval;
7327437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis}
7337437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
734cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha512(struct verify_header *hdr, void *p, unsigned int len)
735cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
736546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha512 *vh = hdr_priv(hdr);
737cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha512_ctx sha512_ctx = {
738546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.buf = vh->sha512,
739cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
740cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
741cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha512_init(&sha512_ctx);
742cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha512_update(&sha512_ctx, p, len);
743cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
744cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
745cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha256(struct verify_header *hdr, void *p, unsigned int len)
746cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
747546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha256 *vh = hdr_priv(hdr);
748cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha256_ctx sha256_ctx = {
749546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.buf = vh->sha256,
750cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
751cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
752cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha256_init(&sha256_ctx);
753cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha256_update(&sha256_ctx, p, len);
754cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
755cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
7567c353ceb3257b132f4c98326046b42201e070731Jens Axboestatic void fill_sha1(struct verify_header *hdr, void *p, unsigned int len)
7577c353ceb3257b132f4c98326046b42201e070731Jens Axboe{
7587c353ceb3257b132f4c98326046b42201e070731Jens Axboe	struct vhdr_sha1 *vh = hdr_priv(hdr);
7597c353ceb3257b132f4c98326046b42201e070731Jens Axboe	struct sha1_ctx sha1_ctx = {
7607c353ceb3257b132f4c98326046b42201e070731Jens Axboe		.H = vh->sha1,
7617c353ceb3257b132f4c98326046b42201e070731Jens Axboe	};
7627c353ceb3257b132f4c98326046b42201e070731Jens Axboe
7637c353ceb3257b132f4c98326046b42201e070731Jens Axboe	sha1_init(&sha1_ctx);
7647c353ceb3257b132f4c98326046b42201e070731Jens Axboe	sha1_update(&sha1_ctx, p, len);
7657c353ceb3257b132f4c98326046b42201e070731Jens Axboe}
7667c353ceb3257b132f4c98326046b42201e070731Jens Axboe
7671e154bdbf14a1d352117aea057035235b66f0381Jens Axboestatic void fill_crc7(struct verify_header *hdr, void *p, unsigned int len)
7681e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{
769546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc7 *vh = hdr_priv(hdr);
770546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
771546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc7 = crc7(p, len);
7721e154bdbf14a1d352117aea057035235b66f0381Jens Axboe}
7731e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
774969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboestatic void fill_crc16(struct verify_header *hdr, void *p, unsigned int len)
775969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{
776546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc16 *vh = hdr_priv(hdr);
777546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
778546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc16 = crc16(p, len);
779969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe}
780969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
781e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_crc32(struct verify_header *hdr, void *p, unsigned int len)
782e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
783546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
784546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
785546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc32 = crc32(p, len);
786e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
787e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
788bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboestatic void fill_crc32c(struct verify_header *hdr, void *p, unsigned int len)
789bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{
790bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
791bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
7923845591fadea480177223e28c9d1c03642d34f0eJens Axboe	if (hdr->verify_type == VERIFY_CRC32C_INTEL)
7933845591fadea480177223e28c9d1c03642d34f0eJens Axboe		vh->crc32 = crc32c_intel(p, len);
7943845591fadea480177223e28c9d1c03642d34f0eJens Axboe	else
7953845591fadea480177223e28c9d1c03642d34f0eJens Axboe		vh->crc32 = crc32c(p, len);
796bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe}
797bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
798d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboestatic void fill_crc64(struct verify_header *hdr, void *p, unsigned int len)
799d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{
800546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc64 *vh = hdr_priv(hdr);
801546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
802546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc64 = crc64(p, len);
803d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe}
804d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
805e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_md5(struct verify_header *hdr, void *p, unsigned int len)
806e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
807546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_md5 *vh = hdr_priv(hdr);
8088c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	struct md5_ctx md5_ctx = {
809546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.hash = (uint32_t *) vh->md5_digest,
8108c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	};
811e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
81261f821f16cf27d8742e09b3a137c933cd0085e9bJens Axboe	md5_init(&md5_ctx);
813e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	md5_update(&md5_ctx, p, len);
814e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
815e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
8167d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void populate_hdr(struct thread_data *td, struct io_u *io_u,
8177d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			 struct verify_header *hdr, unsigned int header_num,
8187d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			 unsigned int header_len)
8197d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{
8207d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	unsigned int data_len;
8217d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	void *data, *p;
8227d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
8237d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	p = (void *) hdr;
8247d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
8257d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	hdr->fio_magic = FIO_HDR_MAGIC;
8267d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	hdr->len = header_len;
8277d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	hdr->verify_type = td->o.verify;
8287d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	hdr->rand_seed = io_u->rand_seed;
8297d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	data_len = header_len - hdr_size(hdr);
8307d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
8317d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	data = p + hdr_size(hdr);
8327d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	switch (td->o.verify) {
8337d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_MD5:
8347d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill md5 io_u %p, len %u\n",
8357d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8367d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_md5(hdr, data, data_len);
8377d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8387d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC64:
8397d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc64 io_u %p, len %u\n",
8407d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8417d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc64(hdr, data, data_len);
8427d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8437d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC32C:
8447d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC32C_INTEL:
8457d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc32c io_u %p, len %u\n",
8467d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8477d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc32c(hdr, data, data_len);
8487d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8497d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC32:
8507d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc32 io_u %p, len %u\n",
8517d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8527d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc32(hdr, data, data_len);
8537d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8547d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC16:
8557d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc16 io_u %p, len %u\n",
8567d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8577d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc16(hdr, data, data_len);
8587d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8597d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC7:
8607d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc7 io_u %p, len %u\n",
8617d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8627d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc7(hdr, data, data_len);
8637d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8647d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_SHA256:
8657d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill sha256 io_u %p, len %u\n",
8667d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8677d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_sha256(hdr, data, data_len);
8687d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8697d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_SHA512:
8707d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill sha512 io_u %p, len %u\n",
8717d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8727d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_sha512(hdr, data, data_len);
8737d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8747d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_META:
8757d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill meta io_u %p, len %u\n",
8767d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8777d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_meta(hdr, td, io_u, header_num);
8787d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8797d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_SHA1:
8807d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill sha1 io_u %p, len %u\n",
8817d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8827d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_sha1(hdr, data, data_len);
8837d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8847d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	default:
8857d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		log_err("fio: bad verify type: %d\n", td->o.verify);
8867d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		assert(0);
8877d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	}
8887d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	if (td->o.verify_offset)
8897d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		memswp(p, p + td->o.verify_offset, hdr_size(hdr));
8907d9fb455aadc0c0363489591775496f27f4a560aJens Axboe}
8917d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
892e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe/*
893e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * fill body of io_u->buf with random data and add a header with the
894c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * checksum of choice
895e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe */
896e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboevoid populate_verify_io_u(struct thread_data *td, struct io_u *io_u)
897e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
8989cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe	if (td->o.verify == VERIFY_NULL)
8999cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe		return;
9009cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe
901c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	fill_pattern_headers(td, io_u, 0, 0);
902e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
903e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
904e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboeint get_next_verify(struct thread_data *td, struct io_u *io_u)
905e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
9068de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	struct io_piece *ipo = NULL;
907e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
908d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	/*
909d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	 * this io_u is from a requeue, we already filled the offsets
910d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	 */
911d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	if (io_u->file)
912d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe		return 0;
913d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe
9148de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	if (!RB_EMPTY_ROOT(&td->io_hist_tree)) {
9158de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe		struct rb_node *n = rb_first(&td->io_hist_tree);
916e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
9178de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe		ipo = rb_entry(n, struct io_piece, rb_node);
9184b87898e8d76aaf05baec83077a11311c1447397Jens Axboe		rb_erase(n, &td->io_hist_tree);
919a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		assert(ipo->flags & IP_F_ONRB);
920a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		ipo->flags &= ~IP_F_ONRB;
92101743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe	} else if (!flist_empty(&td->io_hist_list)) {
92201743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe		ipo = flist_entry(td->io_hist_list.next, struct io_piece, list);
92301743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe		flist_del(&ipo->list);
924a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		assert(ipo->flags & IP_F_ONLIST);
925a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		ipo->flags &= ~IP_F_ONLIST;
9268de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	}
927e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
9288de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	if (ipo) {
9290d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		td->io_hist_len--;
9300d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
931e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->offset = ipo->offset;
932e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->buflen = ipo->len;
93336167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->file = ipo->file;
93497af62cec418cd722fb43c6010d6430534e12353Jens Axboe
9350d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		if (ipo->flags & IP_F_TRIMMED)
9360d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe			io_u->flags |= IO_U_F_TRIMMED;
9370d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
938d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe		if (!fio_file_open(io_u->file)) {
93997af62cec418cd722fb43c6010d6430534e12353Jens Axboe			int r = td_io_open_file(td, io_u->file);
94097af62cec418cd722fb43c6010d6430534e12353Jens Axboe
941bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			if (r) {
942bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe				dprint(FD_VERIFY, "failed file %s open\n",
943bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe						io_u->file->file_name);
94497af62cec418cd722fb43c6010d6430534e12353Jens Axboe				return 1;
945bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			}
94697af62cec418cd722fb43c6010d6430534e12353Jens Axboe		}
94797af62cec418cd722fb43c6010d6430534e12353Jens Axboe
94897af62cec418cd722fb43c6010d6430534e12353Jens Axboe		get_file(ipo->file);
949d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe		assert(fio_file_open(io_u->file));
950e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->ddir = DDIR_READ;
95136167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->xfer_buf = io_u->buf;
95236167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->xfer_buflen = io_u->buflen;
9530d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
9540d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		remove_trim_entry(td, ipo);
955e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		free(ipo);
956bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "get_next_verify: ret io_u %p\n", io_u);
957e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		return 0;
958e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	}
959e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
960bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "get_next_verify: empty\n");
961e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	return 1;
962e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
963e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
964e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboestatic void *verify_async_thread(void *data)
965e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
966e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	struct thread_data *td = data;
967e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	struct io_u *io_u;
968e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	int ret = 0;
969e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
970e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	if (td->o.verify_cpumask_set &&
971e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	    fio_setaffinity(td->pid, td->o.verify_cpumask)) {
972e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		log_err("fio: failed setting verify thread affinity\n");
973e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		goto done;
974e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	}
975e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
976e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	do {
977e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		FLIST_HEAD(list);
978e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe
979e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		read_barrier();
980e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		if (td->verify_thread_exit)
981e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			break;
982e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
983e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		pthread_mutex_lock(&td->io_u_lock);
984e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
985e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		while (flist_empty(&td->verify_list) &&
986e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		       !td->verify_thread_exit) {
987b36e298b5bdfc31ffc9a4c14e94a9c5c748888b0Jens Axboe			ret = pthread_cond_wait(&td->verify_cond,
988b36e298b5bdfc31ffc9a4c14e94a9c5c748888b0Jens Axboe							&td->io_u_lock);
989e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			if (ret) {
990e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe				pthread_mutex_unlock(&td->io_u_lock);
991e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe				break;
992e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			}
993e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		}
994e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
995e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		flist_splice_init(&td->verify_list, &list);
996e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		pthread_mutex_unlock(&td->io_u_lock);
997e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe
998e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		if (flist_empty(&list))
999e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			continue;
1000e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1001e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		while (!flist_empty(&list)) {
1002e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe			io_u = flist_entry(list.next, struct io_u, list);
1003e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe			flist_del_init(&io_u->list);
1004e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1005d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			ret = verify_io_u(td, io_u);
1006e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe			put_io_u(td, io_u);
1007d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			if (!ret)
1008d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				continue;
1009d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			if (td->o.continue_on_error &&
1010d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			    td_non_fatal_error(ret)) {
1011d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				update_error_count(td, ret);
1012d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				td_clear_error(td);
1013d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				ret = 0;
1014d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			}
1015e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		}
1016e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	} while (!ret);
1017e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1018d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe	if (ret) {
1019d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe		td_verror(td, ret, "async_verify");
1020f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe		if (td->o.verify_fatal)
1021f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe			td->terminate = 1;
1022d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe	}
1023d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe
1024e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboedone:
1025e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_lock(&td->io_u_lock);
1026e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->nr_verify_threads--;
1027e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_unlock(&td->io_u_lock);
1028e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1029e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_cond_signal(&td->free_cond);
1030e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	return NULL;
1031e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
1032e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1033e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_async_init(struct thread_data *td)
1034e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
1035e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	int i, ret;
1036304a47c7d94f407cc72a87025679a67f02288447bart Van Assche	pthread_attr_t attr;
1037304a47c7d94f407cc72a87025679a67f02288447bart Van Assche
1038304a47c7d94f407cc72a87025679a67f02288447bart Van Assche	pthread_attr_init(&attr);
1039304a47c7d94f407cc72a87025679a67f02288447bart Van Assche	pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN);
1040e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1041e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_thread_exit = 0;
1042e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1043e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_threads = malloc(sizeof(pthread_t) * td->o.verify_async);
1044e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	for (i = 0; i < td->o.verify_async; i++) {
1045304a47c7d94f407cc72a87025679a67f02288447bart Van Assche		ret = pthread_create(&td->verify_threads[i], &attr,
1046e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe					verify_async_thread, td);
1047e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		if (ret) {
1048e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			log_err("fio: async verify creation failed: %s\n",
1049e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe					strerror(ret));
1050e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			break;
1051e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		}
1052e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		ret = pthread_detach(td->verify_threads[i]);
1053e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		if (ret) {
1054e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			log_err("fio: async verify thread detach failed: %s\n",
1055e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe					strerror(ret));
1056e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			break;
1057e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		}
1058e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		td->nr_verify_threads++;
1059e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	}
1060e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1061304a47c7d94f407cc72a87025679a67f02288447bart Van Assche	pthread_attr_destroy(&attr);
1062304a47c7d94f407cc72a87025679a67f02288447bart Van Assche
1063e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	if (i != td->o.verify_async) {
1064e40823b10920f679d84f3f2222e319c168b1e7daJens Axboe		log_err("fio: only %d verify threads started, exiting\n", i);
1065e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		td->verify_thread_exit = 1;
1066e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		write_barrier();
1067e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		pthread_cond_broadcast(&td->verify_cond);
1068e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		return 1;
1069e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	}
1070e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1071e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	return 0;
1072e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
1073e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1074e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboevoid verify_async_exit(struct thread_data *td)
1075e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
1076e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_thread_exit = 1;
1077e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	write_barrier();
1078e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_cond_broadcast(&td->verify_cond);
1079e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1080e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_lock(&td->io_u_lock);
1081e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1082e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	while (td->nr_verify_threads)
1083e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		pthread_cond_wait(&td->free_cond, &td->io_u_lock);
1084e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1085e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_unlock(&td->io_u_lock);
1086e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	free(td->verify_threads);
1087e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_threads = NULL;
1088e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
1089