verify.c revision c50ca7bd6d5b84e24e9ddcdb1765fb4070804503
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;
2577d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
258c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	fill_pattern_headers(td, &dummy, hdr->rand_seed, 1);
2597d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
260c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	dump_buf(buf + hdr_offset, hdr->len, io_u->offset + hdr_offset,
261c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe			"expected", vc->io_u->file);
2627d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	free(buf);
2637d9fb455aadc0c0363489591775496f27f4a560aJens Axboe}
2647d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
265bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboestatic void log_verify_failure(struct verify_header *hdr, struct vcont *vc)
266bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe{
267bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	unsigned long long offset;
268bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe
269bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	offset = vc->io_u->offset;
270bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	offset += vc->hdr_num * hdr->len;
27132c17adf7f75da1f0957d4691633fea60259910fJens Axboe	log_err("%.8s: verify failed at file %s offset %llu, length %u\n",
27232c17adf7f75da1f0957d4691633fea60259910fJens Axboe			vc->name, vc->io_u->file->file_name, offset, hdr->len);
273bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe
274bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (vc->good_crc && vc->bad_crc) {
275bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		log_err("       Expected CRC: ");
276bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		hexdump(vc->good_crc, vc->crc_len);
277bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		log_err("       Received CRC: ");
278bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		hexdump(vc->bad_crc, vc->crc_len);
279bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	}
2807d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2817d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	dump_verify_buffers(hdr, vc);
282bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe}
283bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe
284936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe/*
285d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe * Return data area 'header_num'
286d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe */
287936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic inline void *io_u_verify_off(struct verify_header *hdr, struct vcont *vc)
288d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe{
289936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	return vc->io_u->buf + vc->hdr_num * hdr->len + hdr_size(hdr);
290d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe}
291d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe
2927437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic int verify_io_u_meta(struct verify_header *hdr, struct thread_data *td,
293936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			    struct vcont *vc)
2947437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{
2957437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	struct vhdr_meta *vh = hdr_priv(hdr);
296936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	struct io_u *io_u = vc->io_u;
2977437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
298bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "meta verify io_u %p, len %u\n", io_u, hdr->len);
299bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
300bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (vh->offset == io_u->offset + vc->hdr_num * td->o.verify_interval)
301bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
3027437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
303bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "meta";
304bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
305bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
3067437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis}
3077437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
308936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha512(struct verify_header *hdr, struct vcont *vc)
309cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
310936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
311546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha512 *vh = hdr_priv(hdr);
312cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	uint8_t sha512[128];
313cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha512_ctx sha512_ctx = {
314cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		.buf = sha512,
315cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
316cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
317936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "sha512 verify io_u %p, len %u\n", vc->io_u, hdr->len);
318bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
319cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha512_init(&sha512_ctx);
3208767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	sha512_update(&sha512_ctx, p, hdr->len - hdr_size(hdr));
321cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
322bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (!memcmp(vh->sha512, sha512_ctx.buf, sizeof(sha512)))
323bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
324cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
325bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "sha512";
326bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = vh->sha512;
327bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = sha512_ctx.buf;
328bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = sizeof(vh->sha512);
329bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
330bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
331cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
332cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
333936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha256(struct verify_header *hdr, struct vcont *vc)
334cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
335936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
336546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha256 *vh = hdr_priv(hdr);
337bc77f56f79f6ae155e9eb26263ed686ef28b47ecJens Axboe	uint8_t sha256[64];
338cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha256_ctx sha256_ctx = {
339cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		.buf = sha256,
340cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
341cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
342936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "sha256 verify io_u %p, len %u\n", vc->io_u, hdr->len);
343bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
344cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha256_init(&sha256_ctx);
3458767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	sha256_update(&sha256_ctx, p, hdr->len - hdr_size(hdr));
346cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
347bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (!memcmp(vh->sha256, sha256_ctx.buf, sizeof(sha256)))
348bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
349cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
350bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "sha256";
351bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = vh->sha256;
352bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = sha256_ctx.buf;
353bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = sizeof(vh->sha256);
354bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
355bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
356cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
357cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
358936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha1(struct verify_header *hdr, struct vcont *vc)
3597c353ceb3257b132f4c98326046b42201e070731Jens Axboe{
360936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
3617c353ceb3257b132f4c98326046b42201e070731Jens Axboe	struct vhdr_sha1 *vh = hdr_priv(hdr);
3627c353ceb3257b132f4c98326046b42201e070731Jens Axboe	uint32_t sha1[5];
3637c353ceb3257b132f4c98326046b42201e070731Jens Axboe	struct sha1_ctx sha1_ctx = {
3647c353ceb3257b132f4c98326046b42201e070731Jens Axboe		.H = sha1,
3657c353ceb3257b132f4c98326046b42201e070731Jens Axboe	};
3667c353ceb3257b132f4c98326046b42201e070731Jens Axboe
367936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "sha1 verify io_u %p, len %u\n", vc->io_u, hdr->len);
3687c353ceb3257b132f4c98326046b42201e070731Jens Axboe
3697c353ceb3257b132f4c98326046b42201e070731Jens Axboe	sha1_init(&sha1_ctx);
3707c353ceb3257b132f4c98326046b42201e070731Jens Axboe	sha1_update(&sha1_ctx, p, hdr->len - hdr_size(hdr));
3717c353ceb3257b132f4c98326046b42201e070731Jens Axboe
372bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (!memcmp(vh->sha1, sha1_ctx.H, sizeof(sha1)))
373bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
3747c353ceb3257b132f4c98326046b42201e070731Jens Axboe
375bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "sha1";
376bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = vh->sha1;
377bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = sha1_ctx.H;
378bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = sizeof(vh->sha1);
379bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
380bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
3817c353ceb3257b132f4c98326046b42201e070731Jens Axboe}
3827c353ceb3257b132f4c98326046b42201e070731Jens Axboe
383936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc7(struct verify_header *hdr, struct vcont *vc)
3841e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{
385936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
386546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc7 *vh = hdr_priv(hdr);
3871e154bdbf14a1d352117aea057035235b66f0381Jens Axboe	unsigned char c;
3881e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
389936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc7 verify io_u %p, len %u\n", vc->io_u, hdr->len);
390bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
3918767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc7(p, hdr->len - hdr_size(hdr));
3921e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
393bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc7)
394bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
3951e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
396bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc7";
397bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc7;
398bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
399bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 1;
400bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
401bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
4021e154bdbf14a1d352117aea057035235b66f0381Jens Axboe}
4031e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
404936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc16(struct verify_header *hdr, struct vcont *vc)
405969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{
406936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
407546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc16 *vh = hdr_priv(hdr);
408969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe	unsigned short c;
409969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
410936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc16 verify io_u %p, len %u\n", vc->io_u, hdr->len);
411bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
4128767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc16(p, hdr->len - hdr_size(hdr));
413969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
414bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc16)
415bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
416969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
417bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc16";
418bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc16;
419bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
420bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 2;
421bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
422bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
423969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe}
424969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
425936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc64(struct verify_header *hdr, struct vcont *vc)
426d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{
427936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
428546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc64 *vh = hdr_priv(hdr);
429d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe	unsigned long long c;
430d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
431936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc64 verify io_u %p, len %u\n", vc->io_u, hdr->len);
432bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
4338767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc64(p, hdr->len - hdr_size(hdr));
434d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
435bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc64)
436bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
437d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
438bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc64";
439bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc64;
440bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
441bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 8;
442bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
443bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
444d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe}
445d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
446936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc32(struct verify_header *hdr, struct vcont *vc)
447e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
448936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
449546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
450546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	uint32_t c;
451e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
452936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc32 verify io_u %p, len %u\n", vc->io_u, hdr->len);
453bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
4548767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc32(p, hdr->len - hdr_size(hdr));
455e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
456bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc32)
457bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
458e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
459bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc32";
460bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc32;
461bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
462bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 4;
463bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
464bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
465e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
466e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
467936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc32c(struct verify_header *hdr, struct vcont *vc)
468bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{
469936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
470bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
471bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	uint32_t c;
472bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
473936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc32c verify io_u %p, len %u\n", vc->io_u, hdr->len);
474bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
4753845591fadea480177223e28c9d1c03642d34f0eJens Axboe	if (hdr->verify_type == VERIFY_CRC32C_INTEL)
4763845591fadea480177223e28c9d1c03642d34f0eJens Axboe		c = crc32c_intel(p, hdr->len - hdr_size(hdr));
4773845591fadea480177223e28c9d1c03642d34f0eJens Axboe	else
4783845591fadea480177223e28c9d1c03642d34f0eJens Axboe		c = crc32c(p, hdr->len - hdr_size(hdr));
479bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
480bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc32)
481bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
482bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
483bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc32c";
484bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc32;
485bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
486bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 4;
487bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
488bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
489bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe}
490bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
491936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_md5(struct verify_header *hdr, struct vcont *vc)
492e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
493936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
494546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_md5 *vh = hdr_priv(hdr);
4958c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	uint32_t hash[MD5_HASH_WORDS];
4968c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	struct md5_ctx md5_ctx = {
4978c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe		.hash = hash,
4988c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	};
499e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
500936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "md5 verify io_u %p, len %u\n", vc->io_u, hdr->len);
501bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
50261f821f16cf27d8742e09b3a137c933cd0085e9bJens Axboe	md5_init(&md5_ctx);
5038767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	md5_update(&md5_ctx, p, hdr->len - hdr_size(hdr));
504e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
505bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (!memcmp(vh->md5_digest, md5_ctx.hash, sizeof(hash)))
506bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
507e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
508bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "md5";
509bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = vh->md5_digest;
510bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = md5_ctx.hash;
511bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = sizeof(hash);
512bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
513bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
514e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
515e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
5163f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboestatic unsigned int hweight8(unsigned int w)
5173f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe{
5183f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe	unsigned int res = w - ((w >> 1) & 0x55);
5193f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
5203f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe	res = (res & 0x33) + ((res >> 2) & 0x33);
5213f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe	return (res + (res >> 4)) & 0x0F;
5223f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe}
5233f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
5240e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandranint verify_io_u_pattern(char *pattern, unsigned long pattern_size,
5255ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			char *buf, unsigned int len, unsigned int mod)
526a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis{
527a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	unsigned int i;
528a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis
529a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	for (i = 0; i < len; i++) {
5300e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran		if (buf[i] != pattern[mod]) {
5313f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe			unsigned int bits;
5323f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
5330e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran			bits = hweight8(buf[i] ^ pattern[mod]);
5343f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe			log_err("fio: got pattern %x, wanted %x. Bad bits %d\n",
5350e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran				buf[i], pattern[mod], bits);
5363f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe			log_err("fio: bad pattern block offset %u\n", i);
5379fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe			return EILSEQ;
5383f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe		}
539a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis		mod++;
540a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis		if (mod == pattern_size)
541a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis			mod = 0;
542a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	}
543a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis
544a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	return 0;
545a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis}
546a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis
547e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe/*
548e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe * Push IO verification to a separate thread
549e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe */
550e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_io_u_async(struct thread_data *td, struct io_u *io_u)
551e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
552e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	if (io_u->file)
553e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		put_file_log(td, io_u->file);
554e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
555e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	io_u->file = NULL;
556e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
557e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_lock(&td->io_u_lock);
5580c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran
5590c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran	if (io_u->flags & IO_U_F_IN_CUR_DEPTH) {
5600c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran		td->cur_depth--;
5610c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran		io_u->flags &= ~IO_U_F_IN_CUR_DEPTH;
5620c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran	}
563e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	flist_del(&io_u->list);
564e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	flist_add_tail(&io_u->list, &td->verify_list);
5652ecc1b57721e3cb72bbf558bc169c97037fe3d0aJens Axboe	io_u->flags |= IO_U_F_FREE_DEF;
566e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_unlock(&td->io_u_lock);
567e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
568e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_cond_signal(&td->verify_cond);
569e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	return 0;
570e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
571e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
5720d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboestatic int verify_trimmed_io_u(struct thread_data *td, struct io_u *io_u)
5730d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe{
5740d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	static char zero_buf[1024];
5750d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	unsigned int this_len, len;
5760d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	int ret = 0;
5770d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	void *p;
5780d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
5790d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	if (!td->o.trim_zero)
5800d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		return 0;
5810d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
5820d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	len = io_u->buflen;
5830d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	p = io_u->buf;
5840d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	do {
5850d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		this_len = sizeof(zero_buf);
5860d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		if (this_len > len)
5870d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe			this_len = len;
5880d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		if (memcmp(p, zero_buf, this_len)) {
5890d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe			ret = EILSEQ;
5900d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe			break;
5910d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		}
5920d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		len -= this_len;
5930d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		p += this_len;
5940d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	} while (len);
5950d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
5960d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	if (!ret)
5970d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		return 0;
5980d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
599a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe	log_err("trim: verify failed at file %s offset %llu, length %lu"
600a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		", block offset %lu\n",
601a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe			io_u->file->file_name, io_u->offset, io_u->buflen,
6022f68124f26e54233db41b462a257dabc48e5c32bJens Axboe			(unsigned long) (p - io_u->buf));
6030d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	return ret;
6040d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe}
6050d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
60636690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboeint verify_io_u(struct thread_data *td, struct io_u *io_u)
607e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
6083f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis	struct verify_header *hdr;
609a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	unsigned int hdr_size, hdr_inc, hdr_num = 0;
61095646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe	void *p;
611e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	int ret;
612e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
6131dcc049824b840df1ee0ef5d019fffa4037e1bb0Shawn Lewis	if (td->o.verify == VERIFY_NULL || io_u->ddir != DDIR_READ)
61436690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe		return 0;
6150d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	if (io_u->flags & IO_U_F_TRIMMED) {
6160d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		ret = verify_trimmed_io_u(td, io_u);
6170d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		goto done;
6180d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	}
61936690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe
6203f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis	hdr_inc = io_u->buflen;
621a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe	if (td->o.verify_interval)
622a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe		hdr_inc = td->o.verify_interval;
623e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
624a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe	ret = 0;
6255ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	for (p = io_u->buf; p < io_u->buf + io_u->buflen;
6265ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	     p += hdr_inc, hdr_num++) {
627bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		struct vcont vc = {
628bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe			.io_u		= io_u,
629bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe			.hdr_num	= hdr_num,
6307d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			.td		= td,
631bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		};
632936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe
633f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe		if (ret && td->o.verify_fatal)
634a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe			break;
635f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe
636a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis		hdr_size = __hdr_size(td->o.verify);
637a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe		if (td->o.verify_offset)
638a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis			memswp(p, p + td->o.verify_offset, hdr_size);
63995646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe		hdr = p;
640e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
6413f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe		if (hdr->fio_magic != FIO_HDR_MAGIC) {
642c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe			log_err("verify: bad magic header %x, wanted %x at file %s offset %llu, length %u\n",
643c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe				hdr->fio_magic, FIO_HDR_MAGIC,
644c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe				io_u->file->file_name,
645c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe				io_u->offset + hdr_num * hdr->len, hdr->len);
6469fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe			return EILSEQ;
6473f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe		}
6483f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
649e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis		if (td->o.verify_pattern_bytes) {
650bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "pattern verify io_u %p, len %u\n",
651bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe								io_u, hdr->len);
652e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis			ret = verify_io_u_pattern(td->o.verify_pattern,
6530e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran				  td->o.verify_pattern_bytes,
6540e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran				  p + hdr_size,
6550e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran				  hdr_inc - hdr_size,
6560e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran				  hdr_size % td->o.verify_pattern_bytes);
657c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe
658c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe			if (ret) {
659c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe				log_err("pattern: verify failed at file %s offset %llu, length %u\n",
660c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe					io_u->file->file_name,
661c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe					io_u->offset + hdr_num * hdr->len,
662c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe					hdr->len);
663c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe			}
664c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe
665e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran			/*
666e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran			 * Also verify the meta data, if applicable
667e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran			 */
668e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran			if (hdr->verify_type == VERIFY_META)
669936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe				ret |= verify_io_u_meta(hdr, td, &vc);
670e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis			continue;
671e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis		}
672e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis
6733f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		switch (hdr->verify_type) {
6743f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_MD5:
675936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_md5(hdr, &vc);
6763f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
6773f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC64:
678936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc64(hdr, &vc);
6793f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
680bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe		case VERIFY_CRC32C:
6813845591fadea480177223e28c9d1c03642d34f0eJens Axboe		case VERIFY_CRC32C_INTEL:
682936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc32c(hdr, &vc);
683bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe			break;
6843f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC32:
685936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc32(hdr, &vc);
6863f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
6873f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC16:
688936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc16(hdr, &vc);
6893f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
6903f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC7:
691936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc7(hdr, &vc);
6923f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
693cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA256:
694936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_sha256(hdr, &vc);
695cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
696cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA512:
697936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_sha512(hdr, &vc);
698cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
6997437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		case VERIFY_META:
700936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_meta(hdr, td, &vc);
7017437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis			break;
7027c353ceb3257b132f4c98326046b42201e070731Jens Axboe		case VERIFY_SHA1:
703936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_sha1(hdr, &vc);
7047c353ceb3257b132f4c98326046b42201e070731Jens Axboe			break;
7053f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		default:
7063f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			log_err("Bad verify type %u\n", hdr->verify_type);
707d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe			ret = EINVAL;
7083f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		}
7093f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis	}
710a7dfe862c2e3fe72b8db6a6e67302048d3731c6dJens Axboe
7110d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboedone:
712f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe	if (ret && td->o.verify_fatal)
713f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe		td->terminate = 1;
714f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe
715a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe	return ret;
716e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
717e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
7187437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic void fill_meta(struct verify_header *hdr, struct thread_data *td,
7195ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		      struct io_u *io_u, unsigned int header_num)
7207437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{
7217437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	struct vhdr_meta *vh = hdr_priv(hdr);
7227437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
7237437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->thread = td->thread_number;
7247437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
7257437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->time_sec = io_u->start_time.tv_sec;
7267437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->time_usec = io_u->start_time.tv_usec;
7277437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
7287437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->numberio = td->io_issues[DDIR_WRITE];
7297437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
7307437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->offset = io_u->offset + header_num * td->o.verify_interval;
7317437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis}
7327437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
733cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha512(struct verify_header *hdr, void *p, unsigned int len)
734cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
735546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha512 *vh = hdr_priv(hdr);
736cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha512_ctx sha512_ctx = {
737546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.buf = vh->sha512,
738cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
739cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
740cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha512_init(&sha512_ctx);
741cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha512_update(&sha512_ctx, p, len);
742cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
743cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
744cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha256(struct verify_header *hdr, void *p, unsigned int len)
745cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
746546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha256 *vh = hdr_priv(hdr);
747cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha256_ctx sha256_ctx = {
748546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.buf = vh->sha256,
749cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
750cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
751cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha256_init(&sha256_ctx);
752cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha256_update(&sha256_ctx, p, len);
753cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
754cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
7557c353ceb3257b132f4c98326046b42201e070731Jens Axboestatic void fill_sha1(struct verify_header *hdr, void *p, unsigned int len)
7567c353ceb3257b132f4c98326046b42201e070731Jens Axboe{
7577c353ceb3257b132f4c98326046b42201e070731Jens Axboe	struct vhdr_sha1 *vh = hdr_priv(hdr);
7587c353ceb3257b132f4c98326046b42201e070731Jens Axboe	struct sha1_ctx sha1_ctx = {
7597c353ceb3257b132f4c98326046b42201e070731Jens Axboe		.H = vh->sha1,
7607c353ceb3257b132f4c98326046b42201e070731Jens Axboe	};
7617c353ceb3257b132f4c98326046b42201e070731Jens Axboe
7627c353ceb3257b132f4c98326046b42201e070731Jens Axboe	sha1_init(&sha1_ctx);
7637c353ceb3257b132f4c98326046b42201e070731Jens Axboe	sha1_update(&sha1_ctx, p, len);
7647c353ceb3257b132f4c98326046b42201e070731Jens Axboe}
7657c353ceb3257b132f4c98326046b42201e070731Jens Axboe
7661e154bdbf14a1d352117aea057035235b66f0381Jens Axboestatic void fill_crc7(struct verify_header *hdr, void *p, unsigned int len)
7671e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{
768546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc7 *vh = hdr_priv(hdr);
769546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
770546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc7 = crc7(p, len);
7711e154bdbf14a1d352117aea057035235b66f0381Jens Axboe}
7721e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
773969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboestatic void fill_crc16(struct verify_header *hdr, void *p, unsigned int len)
774969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{
775546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc16 *vh = hdr_priv(hdr);
776546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
777546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc16 = crc16(p, len);
778969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe}
779969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
780e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_crc32(struct verify_header *hdr, void *p, unsigned int len)
781e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
782546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
783546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
784546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc32 = crc32(p, len);
785e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
786e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
787bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboestatic void fill_crc32c(struct verify_header *hdr, void *p, unsigned int len)
788bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{
789bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
790bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
7913845591fadea480177223e28c9d1c03642d34f0eJens Axboe	if (hdr->verify_type == VERIFY_CRC32C_INTEL)
7923845591fadea480177223e28c9d1c03642d34f0eJens Axboe		vh->crc32 = crc32c_intel(p, len);
7933845591fadea480177223e28c9d1c03642d34f0eJens Axboe	else
7943845591fadea480177223e28c9d1c03642d34f0eJens Axboe		vh->crc32 = crc32c(p, len);
795bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe}
796bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
797d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboestatic void fill_crc64(struct verify_header *hdr, void *p, unsigned int len)
798d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{
799546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc64 *vh = hdr_priv(hdr);
800546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
801546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc64 = crc64(p, len);
802d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe}
803d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
804e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_md5(struct verify_header *hdr, void *p, unsigned int len)
805e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
806546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_md5 *vh = hdr_priv(hdr);
8078c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	struct md5_ctx md5_ctx = {
808546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.hash = (uint32_t *) vh->md5_digest,
8098c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	};
810e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
81161f821f16cf27d8742e09b3a137c933cd0085e9bJens Axboe	md5_init(&md5_ctx);
812e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	md5_update(&md5_ctx, p, len);
813e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
814e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
8157d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void populate_hdr(struct thread_data *td, struct io_u *io_u,
8167d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			 struct verify_header *hdr, unsigned int header_num,
8177d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			 unsigned int header_len)
8187d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{
8197d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	unsigned int data_len;
8207d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	void *data, *p;
8217d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
8227d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	p = (void *) hdr;
8237d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
8247d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	hdr->fio_magic = FIO_HDR_MAGIC;
8257d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	hdr->len = header_len;
8267d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	hdr->verify_type = td->o.verify;
8277d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	hdr->rand_seed = io_u->rand_seed;
8287d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	data_len = header_len - hdr_size(hdr);
8297d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
8307d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	data = p + hdr_size(hdr);
8317d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	switch (td->o.verify) {
8327d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_MD5:
8337d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill md5 io_u %p, len %u\n",
8347d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8357d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_md5(hdr, data, data_len);
8367d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8377d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC64:
8387d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc64 io_u %p, len %u\n",
8397d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8407d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc64(hdr, data, data_len);
8417d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8427d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC32C:
8437d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC32C_INTEL:
8447d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc32c io_u %p, len %u\n",
8457d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8467d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc32c(hdr, data, data_len);
8477d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8487d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC32:
8497d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc32 io_u %p, len %u\n",
8507d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8517d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc32(hdr, data, data_len);
8527d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8537d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC16:
8547d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc16 io_u %p, len %u\n",
8557d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8567d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc16(hdr, data, data_len);
8577d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8587d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC7:
8597d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc7 io_u %p, len %u\n",
8607d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8617d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc7(hdr, data, data_len);
8627d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8637d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_SHA256:
8647d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill sha256 io_u %p, len %u\n",
8657d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8667d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_sha256(hdr, data, data_len);
8677d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8687d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_SHA512:
8697d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill sha512 io_u %p, len %u\n",
8707d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8717d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_sha512(hdr, data, data_len);
8727d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8737d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_META:
8747d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill meta io_u %p, len %u\n",
8757d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8767d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_meta(hdr, td, io_u, header_num);
8777d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8787d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_SHA1:
8797d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill sha1 io_u %p, len %u\n",
8807d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8817d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_sha1(hdr, data, data_len);
8827d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8837d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	default:
8847d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		log_err("fio: bad verify type: %d\n", td->o.verify);
8857d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		assert(0);
8867d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	}
8877d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	if (td->o.verify_offset)
8887d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		memswp(p, p + td->o.verify_offset, hdr_size(hdr));
8897d9fb455aadc0c0363489591775496f27f4a560aJens Axboe}
8907d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
891e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe/*
892e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * fill body of io_u->buf with random data and add a header with the
893c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * checksum of choice
894e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe */
895e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboevoid populate_verify_io_u(struct thread_data *td, struct io_u *io_u)
896e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
8979cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe	if (td->o.verify == VERIFY_NULL)
8989cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe		return;
8999cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe
900c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	fill_pattern_headers(td, io_u, 0, 0);
901e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
902e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
903e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboeint get_next_verify(struct thread_data *td, struct io_u *io_u)
904e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
9058de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	struct io_piece *ipo = NULL;
906e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
907d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	/*
908d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	 * this io_u is from a requeue, we already filled the offsets
909d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	 */
910d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	if (io_u->file)
911d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe		return 0;
912d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe
9138de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	if (!RB_EMPTY_ROOT(&td->io_hist_tree)) {
9148de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe		struct rb_node *n = rb_first(&td->io_hist_tree);
915e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
9168de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe		ipo = rb_entry(n, struct io_piece, rb_node);
9174b87898e8d76aaf05baec83077a11311c1447397Jens Axboe		rb_erase(n, &td->io_hist_tree);
918a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		assert(ipo->flags & IP_F_ONRB);
919a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		ipo->flags &= ~IP_F_ONRB;
92001743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe	} else if (!flist_empty(&td->io_hist_list)) {
92101743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe		ipo = flist_entry(td->io_hist_list.next, struct io_piece, list);
92201743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe		flist_del(&ipo->list);
923a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		assert(ipo->flags & IP_F_ONLIST);
924a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		ipo->flags &= ~IP_F_ONLIST;
9258de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	}
926e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
9278de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	if (ipo) {
9280d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		td->io_hist_len--;
9290d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
930e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->offset = ipo->offset;
931e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->buflen = ipo->len;
93236167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->file = ipo->file;
93397af62cec418cd722fb43c6010d6430534e12353Jens Axboe
9340d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		if (ipo->flags & IP_F_TRIMMED)
9350d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe			io_u->flags |= IO_U_F_TRIMMED;
9360d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
937d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe		if (!fio_file_open(io_u->file)) {
93897af62cec418cd722fb43c6010d6430534e12353Jens Axboe			int r = td_io_open_file(td, io_u->file);
93997af62cec418cd722fb43c6010d6430534e12353Jens Axboe
940bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			if (r) {
941bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe				dprint(FD_VERIFY, "failed file %s open\n",
942bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe						io_u->file->file_name);
94397af62cec418cd722fb43c6010d6430534e12353Jens Axboe				return 1;
944bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			}
94597af62cec418cd722fb43c6010d6430534e12353Jens Axboe		}
94697af62cec418cd722fb43c6010d6430534e12353Jens Axboe
94797af62cec418cd722fb43c6010d6430534e12353Jens Axboe		get_file(ipo->file);
948d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe		assert(fio_file_open(io_u->file));
949e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->ddir = DDIR_READ;
95036167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->xfer_buf = io_u->buf;
95136167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->xfer_buflen = io_u->buflen;
9520d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
9530d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		remove_trim_entry(td, ipo);
954e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		free(ipo);
955bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "get_next_verify: ret io_u %p\n", io_u);
956e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		return 0;
957e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	}
958e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
959bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "get_next_verify: empty\n");
960e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	return 1;
961e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
962e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
963e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboestatic void *verify_async_thread(void *data)
964e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
965e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	struct thread_data *td = data;
966e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	struct io_u *io_u;
967e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	int ret = 0;
968e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
969e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	if (td->o.verify_cpumask_set &&
970e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	    fio_setaffinity(td->pid, td->o.verify_cpumask)) {
971e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		log_err("fio: failed setting verify thread affinity\n");
972e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		goto done;
973e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	}
974e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
975e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	do {
976e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		FLIST_HEAD(list);
977e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe
978e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		read_barrier();
979e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		if (td->verify_thread_exit)
980e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			break;
981e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
982e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		pthread_mutex_lock(&td->io_u_lock);
983e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
984e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		while (flist_empty(&td->verify_list) &&
985e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		       !td->verify_thread_exit) {
986b36e298b5bdfc31ffc9a4c14e94a9c5c748888b0Jens Axboe			ret = pthread_cond_wait(&td->verify_cond,
987b36e298b5bdfc31ffc9a4c14e94a9c5c748888b0Jens Axboe							&td->io_u_lock);
988e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			if (ret) {
989e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe				pthread_mutex_unlock(&td->io_u_lock);
990e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe				break;
991e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			}
992e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		}
993e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
994e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		flist_splice_init(&td->verify_list, &list);
995e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		pthread_mutex_unlock(&td->io_u_lock);
996e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe
997e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		if (flist_empty(&list))
998e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			continue;
999e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1000e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		while (!flist_empty(&list)) {
1001e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe			io_u = flist_entry(list.next, struct io_u, list);
1002e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe			flist_del_init(&io_u->list);
1003e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1004d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			ret = verify_io_u(td, io_u);
1005e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe			put_io_u(td, io_u);
1006d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			if (!ret)
1007d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				continue;
1008d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			if (td->o.continue_on_error &&
1009d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			    td_non_fatal_error(ret)) {
1010d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				update_error_count(td, ret);
1011d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				td_clear_error(td);
1012d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				ret = 0;
1013d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			}
1014e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		}
1015e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	} while (!ret);
1016e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1017d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe	if (ret) {
1018d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe		td_verror(td, ret, "async_verify");
1019f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe		if (td->o.verify_fatal)
1020f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe			td->terminate = 1;
1021d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe	}
1022d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe
1023e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboedone:
1024e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_lock(&td->io_u_lock);
1025e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->nr_verify_threads--;
1026e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_unlock(&td->io_u_lock);
1027e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1028e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_cond_signal(&td->free_cond);
1029e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	return NULL;
1030e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
1031e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1032e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_async_init(struct thread_data *td)
1033e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
1034e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	int i, ret;
1035304a47c7d94f407cc72a87025679a67f02288447bart Van Assche	pthread_attr_t attr;
1036304a47c7d94f407cc72a87025679a67f02288447bart Van Assche
1037304a47c7d94f407cc72a87025679a67f02288447bart Van Assche	pthread_attr_init(&attr);
1038304a47c7d94f407cc72a87025679a67f02288447bart Van Assche	pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN);
1039e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1040e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_thread_exit = 0;
1041e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1042e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_threads = malloc(sizeof(pthread_t) * td->o.verify_async);
1043e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	for (i = 0; i < td->o.verify_async; i++) {
1044304a47c7d94f407cc72a87025679a67f02288447bart Van Assche		ret = pthread_create(&td->verify_threads[i], &attr,
1045e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe					verify_async_thread, td);
1046e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		if (ret) {
1047e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			log_err("fio: async verify creation failed: %s\n",
1048e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe					strerror(ret));
1049e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			break;
1050e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		}
1051e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		ret = pthread_detach(td->verify_threads[i]);
1052e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		if (ret) {
1053e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			log_err("fio: async verify thread detach failed: %s\n",
1054e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe					strerror(ret));
1055e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			break;
1056e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		}
1057e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		td->nr_verify_threads++;
1058e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	}
1059e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1060304a47c7d94f407cc72a87025679a67f02288447bart Van Assche	pthread_attr_destroy(&attr);
1061304a47c7d94f407cc72a87025679a67f02288447bart Van Assche
1062e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	if (i != td->o.verify_async) {
1063e40823b10920f679d84f3f2222e319c168b1e7daJens Axboe		log_err("fio: only %d verify threads started, exiting\n", i);
1064e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		td->verify_thread_exit = 1;
1065e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		write_barrier();
1066e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		pthread_cond_broadcast(&td->verify_cond);
1067e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		return 1;
1068e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	}
1069e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1070e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	return 0;
1071e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
1072e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1073e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboevoid verify_async_exit(struct thread_data *td)
1074e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
1075e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_thread_exit = 1;
1076e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	write_barrier();
1077e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_cond_broadcast(&td->verify_cond);
1078e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1079e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_lock(&td->io_u_lock);
1080e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1081e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	while (td->nr_verify_threads)
1082e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		pthread_cond_wait(&td->free_cond, &td->io_u_lock);
1083e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1084e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_unlock(&td->io_u_lock);
1085e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	free(td->verify_threads);
1086e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_threads = NULL;
1087e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
1088