verify.c revision dc5bfbb227f1af83adf0b686d147b7ae2107c144
1e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe/*
2e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * IO verification helpers
3e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe */
4e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe#include <unistd.h>
5e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe#include <fcntl.h>
6e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe#include <string.h>
797af62cec418cd722fb43c6010d6430534e12353Jens Axboe#include <assert.h>
8e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe#include <pthread.h>
979402a12eecf371238f2326c9e8850eedd269b7fJens Axboe#include <libgen.h>
10e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
11e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe#include "fio.h"
124f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe#include "verify.h"
130d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe#include "trim.h"
14637ef8d9f7645135cf4829894d1e3983cd7a042eJens Axboe#include "lib/rand.h"
1551aa2da8cf422a06ddfa1ce673f3bfc03f96b86eJens Axboe#include "lib/hweight.h"
16e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
17eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/md5.h"
18eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc64.h"
19eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc32.h"
20bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe#include "crc/crc32c.h"
21eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc16.h"
22eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc7.h"
23eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/sha256.h"
24eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/sha512.h"
257c353ceb3257b132f4c98326046b42201e070731Jens Axboe#include "crc/sha1.h"
26cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
277d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void populate_hdr(struct thread_data *td, struct io_u *io_u,
287d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			 struct verify_header *hdr, unsigned int header_num,
297d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			 unsigned int header_len);
307d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
317d9fb455aadc0c0363489591775496f27f4a560aJens Axboevoid fill_pattern(struct thread_data *td, void *p, unsigned int len, struct io_u *io_u, unsigned long seed, int use_seed)
3290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe{
3390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	switch (td->o.verify_pattern_bytes) {
3490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	case 0:
35bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "fill random bytes len=%u\n", len);
367d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		if (use_seed)
377d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			__fill_random_buf(p, len, seed);
387d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		else
393545a109a2cfe5ab22969ef453dc049db47f0b68Jens Axboe			io_u->rand_seed = fill_random_buf(&td->buf_state, p, len);
4090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		break;
4190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	case 1:
4210e8a7b30ce2917df9f839d42596c7e3af9a904fRadha Ramachandran		if (io_u->buf_filled_len >= len) {
43cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran			dprint(FD_VERIFY, "using already filled verify pattern b=0 len=%u\n", len);
44cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran			return;
45cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran		}
46bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "fill verify pattern b=0 len=%u\n", len);
470e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran		memset(p, td->o.verify_pattern[0], len);
48cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran		io_u->buf_filled_len = len;
4990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		break;
500e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran	default: {
510e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran		unsigned int i = 0, size = 0;
5290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		unsigned char *b = p;
5390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe
5410e8a7b30ce2917df9f839d42596c7e3af9a904fRadha Ramachandran		if (io_u->buf_filled_len >= len) {
55cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran			dprint(FD_VERIFY, "using already filled verify pattern b=%d len=%u\n",
56cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran					td->o.verify_pattern_bytes, len);
57cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran			return;
58cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran		}
5981f0366c7adcd5d70de5c1b144eafd366933f78eJens Axboe
60bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "fill verify pattern b=%d len=%u\n",
61bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe					td->o.verify_pattern_bytes, len);
62bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
6390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		while (i < len) {
640e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran			size = td->o.verify_pattern_bytes;
650e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran			if (size > (len - i))
660e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran				size = len - i;
670e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran			memcpy(b+i, td->o.verify_pattern, size);
680e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran			i += size;
6990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		}
70cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran		io_u->buf_filled_len = len;
7190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		break;
7290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		}
7390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	}
7490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe}
7590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe
76cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboestatic unsigned int get_hdr_inc(struct thread_data *td, struct io_u *io_u)
77cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe{
78cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe	unsigned int hdr_inc;
79cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe
80cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe	hdr_inc = io_u->buflen;
818a99fdf63e1350fc2c35794e1c1f779885905b29Jens Axboe	if (td->o.verify_interval && td->o.verify_interval <= io_u->buflen)
82cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe		hdr_inc = td->o.verify_interval;
83cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe
84cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe	return hdr_inc;
85cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe}
86cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe
87c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboestatic void fill_pattern_headers(struct thread_data *td, struct io_u *io_u,
88c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe				 unsigned long seed, int use_seed)
89c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe{
90c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	unsigned int hdr_inc, header_num;
91c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	struct verify_header *hdr;
92c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	void *p = io_u->buf;
93c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe
94c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	fill_pattern(td, p, io_u->buflen, io_u, seed, use_seed);
95c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe
96cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe	hdr_inc = get_hdr_inc(td, io_u);
97c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	header_num = 0;
98c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	for (; p < io_u->buf + io_u->buflen; p += hdr_inc) {
99c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe		hdr = p;
100c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe		populate_hdr(td, io_u, hdr, header_num, hdr_inc);
101c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe		header_num++;
102c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	}
103c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe}
104c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe
1054764aec9fe5988281bdc114c13ac771fb16713ccJens Axboestatic void memswp(void *buf1, void *buf2, unsigned int len)
106546a9142511875524850ac92776184fd9fb7196eShawn Lewis{
107dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis	char swap[200];
108dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis
109dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis	assert(len <= sizeof(swap));
11090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe
111546a9142511875524850ac92776184fd9fb7196eShawn Lewis	memcpy(&swap, buf1, len);
112546a9142511875524850ac92776184fd9fb7196eShawn Lewis	memcpy(buf1, buf2, len);
113546a9142511875524850ac92776184fd9fb7196eShawn Lewis	memcpy(buf2, &swap, len);
114546a9142511875524850ac92776184fd9fb7196eShawn Lewis}
115546a9142511875524850ac92776184fd9fb7196eShawn Lewis
116e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void hexdump(void *buffer, int len)
117e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
118e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	unsigned char *p = buffer;
119e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	int i;
120e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
121e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	for (i = 0; i < len; i++)
122bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		log_err("%02x", p[i]);
123bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_err("\n");
124e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
125e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
126d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe/*
1278767783245faac99a7e1c330a1d6536e579c8402Jens Axboe * Prepare for seperation of verify_header and checksum header
1288767783245faac99a7e1c330a1d6536e579c8402Jens Axboe */
129546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic inline unsigned int __hdr_size(int verify_type)
1308767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{
13103e20d687566753b90383571e5e152c5142bdffdBruce Cran	unsigned int len = 0;
1328767783245faac99a7e1c330a1d6536e579c8402Jens Axboe
133546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	switch (verify_type) {
134546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_NONE:
135546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_NULL:
136546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = 0;
137546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
138546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_MD5:
139546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_md5);
140546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
141546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC64:
142546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc64);
143546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
144bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	case VERIFY_CRC32C:
145546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC32:
1463845591fadea480177223e28c9d1c03642d34f0eJens Axboe	case VERIFY_CRC32C_INTEL:
147546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc32);
148546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
149546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC16:
150546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc16);
151546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
152546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC7:
153546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc7);
154546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
155546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_SHA256:
156546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_sha256);
157546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
158546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_SHA512:
159546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_sha512);
160546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
1617437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	case VERIFY_META:
1627437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		len = sizeof(struct vhdr_meta);
1637437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		break;
1647c353ceb3257b132f4c98326046b42201e070731Jens Axboe	case VERIFY_SHA1:
1657c353ceb3257b132f4c98326046b42201e070731Jens Axboe		len = sizeof(struct vhdr_sha1);
1667c353ceb3257b132f4c98326046b42201e070731Jens Axboe		break;
16792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	case VERIFY_PATTERN:
16892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		len = 0;
16992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		break;
170546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	default:
171546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		log_err("fio: unknown verify header!\n");
172546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		assert(0);
173546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	}
174546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
175546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	return len + sizeof(struct verify_header);
1768767783245faac99a7e1c330a1d6536e579c8402Jens Axboe}
1778767783245faac99a7e1c330a1d6536e579c8402Jens Axboe
1788767783245faac99a7e1c330a1d6536e579c8402Jens Axboestatic inline unsigned int hdr_size(struct verify_header *hdr)
1798767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{
180546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	return __hdr_size(hdr->verify_type);
181546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe}
182546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
183546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic void *hdr_priv(struct verify_header *hdr)
184546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe{
185546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	void *priv = hdr;
186546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
187546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	return priv + sizeof(struct verify_header);
1888767783245faac99a7e1c330a1d6536e579c8402Jens Axboe}
1898767783245faac99a7e1c330a1d6536e579c8402Jens Axboe
1908767783245faac99a7e1c330a1d6536e579c8402Jens Axboe/*
191936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * Verify container, pass info to verify handlers and allow them to
192936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * pass info back in case of error
193936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe */
194936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestruct vcont {
195936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	/*
196936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	 * Input
197936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	 */
198936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	struct io_u *io_u;
199936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	unsigned int hdr_num;
2007d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	struct thread_data *td;
201936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe
202936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	/*
203936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	 * Output, only valid in case of error
204936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	 */
205bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	const char *name;
206bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	void *good_crc;
207bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	void *bad_crc;
208936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	unsigned int crc_len;
209936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe};
210936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe
211c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboestatic void dump_buf(char *buf, unsigned int len, unsigned long long offset,
212c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe		     const char *type, struct fio_file *f)
2137d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{
2146f260b317f4cec3027f79b8b329dd3f98c3906acJens Axboe	char *ptr, fname[256];
2157d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	int ret, fd;
2167d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2176f260b317f4cec3027f79b8b329dd3f98c3906acJens Axboe	ptr = strdup(f->file_name);
2186f260b317f4cec3027f79b8b329dd3f98c3906acJens Axboe	strcpy(fname, basename(ptr));
219c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe
220c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	sprintf(fname + strlen(fname), ".%llu.%s", offset, type);
2217d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2227d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	fd = open(fname, O_CREAT | O_TRUNC | O_WRONLY, 0644);
2237d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	if (fd < 0) {
2247d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		perror("open verify buf file");
2257d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		return;
2267d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	}
2277d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2287d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	while (len) {
2297d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		ret = write(fd, buf, len);
2307d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		if (!ret)
2317d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			break;
2327d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		else if (ret < 0) {
2337d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			perror("write verify buf file");
2347d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			break;
2357d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		}
2367d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		len -= ret;
2377d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		buf += ret;
2387d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	}
2397d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2407d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	close(fd);
241c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	log_err("       %s data dumped as %s\n", type, fname);
2426f260b317f4cec3027f79b8b329dd3f98c3906acJens Axboe	free(ptr);
2437d9fb455aadc0c0363489591775496f27f4a560aJens Axboe}
2447d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
245c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe/*
246c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * Dump the contents of the read block and re-generate the correct data
247c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * and dump that too.
248c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe */
2497d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void dump_verify_buffers(struct verify_header *hdr, struct vcont *vc)
2507d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{
2517d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	struct thread_data *td = vc->td;
2527d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	struct io_u *io_u = vc->io_u;
2537d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	unsigned long hdr_offset;
2547d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	struct io_u dummy;
255c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	void *buf;
2567d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2570dce9bc9b21a8d91aa55a29258dfaeffc57bd466Steven Lang	if (!td->o.verify_dump)
2580dce9bc9b21a8d91aa55a29258dfaeffc57bd466Steven Lang		return;
2590dce9bc9b21a8d91aa55a29258dfaeffc57bd466Steven Lang
260c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	/*
261c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	 * Dump the contents we just read off disk
262c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	 */
2637d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	hdr_offset = vc->hdr_num * hdr->len;
2647d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
265c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	dump_buf(io_u->buf + hdr_offset, hdr->len, io_u->offset + hdr_offset,
266c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe			"received", vc->io_u->file);
2677d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
268c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	/*
269c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	 * Allocate a new buf and re-generate the original data
270c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	 */
271c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	buf = malloc(io_u->buflen);
2727d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	dummy = *io_u;
273c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	dummy.buf = buf;
2744aae38a645f3315ca2f8cc57a7ec4110ba7d8319Jens Axboe	dummy.rand_seed = hdr->rand_seed;
275cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe	dummy.buf_filled_len = 0;
2767d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
277c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	fill_pattern_headers(td, &dummy, hdr->rand_seed, 1);
2787d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
279c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	dump_buf(buf + hdr_offset, hdr->len, io_u->offset + hdr_offset,
280c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe			"expected", vc->io_u->file);
2817d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	free(buf);
2827d9fb455aadc0c0363489591775496f27f4a560aJens Axboe}
2837d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
284bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboestatic void log_verify_failure(struct verify_header *hdr, struct vcont *vc)
285bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe{
286bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	unsigned long long offset;
287bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe
288bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	offset = vc->io_u->offset;
289bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	offset += vc->hdr_num * hdr->len;
29032c17adf7f75da1f0957d4691633fea60259910fJens Axboe	log_err("%.8s: verify failed at file %s offset %llu, length %u\n",
29132c17adf7f75da1f0957d4691633fea60259910fJens Axboe			vc->name, vc->io_u->file->file_name, offset, hdr->len);
292bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe
293bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (vc->good_crc && vc->bad_crc) {
294bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		log_err("       Expected CRC: ");
295bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		hexdump(vc->good_crc, vc->crc_len);
296bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		log_err("       Received CRC: ");
297bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		hexdump(vc->bad_crc, vc->crc_len);
298bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	}
2997d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
3007d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	dump_verify_buffers(hdr, vc);
301bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe}
302bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe
303936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe/*
304d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe * Return data area 'header_num'
305d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe */
306936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic inline void *io_u_verify_off(struct verify_header *hdr, struct vcont *vc)
307d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe{
308936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	return vc->io_u->buf + vc->hdr_num * hdr->len + hdr_size(hdr);
309d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe}
310d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe
31192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboestatic int verify_io_u_pattern(struct verify_header *hdr, struct vcont *vc)
31292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe{
31392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	struct thread_data *td = vc->td;
31492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	struct io_u *io_u = vc->io_u;
31592bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	char *buf, *pattern;
3162b13e716c0921356c0930522718e00b8df34293aJens Axboe	unsigned int header_size = __hdr_size(td->o.verify);
3179a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang	unsigned int len, mod, i, size, pattern_size;
31892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe
31992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	pattern = td->o.verify_pattern;
3209a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang	pattern_size = td->o.verify_pattern_bytes;
3219a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang	if (pattern_size <= 1)
3229a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang		pattern_size = MAX_PATTERN_SIZE;
3232b13e716c0921356c0930522718e00b8df34293aJens Axboe	buf = (void *) hdr + header_size;
3242b13e716c0921356c0930522718e00b8df34293aJens Axboe	len = get_hdr_inc(td, io_u) - header_size;
3259a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang	mod = header_size % pattern_size;
3269a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang
3279a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang	for (i = 0; i < len; i += size) {
3289a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang		size = pattern_size - mod;
3299a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang		if (size > (len - i))
3309a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang			size = len - i;
3319a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang		if (memcmp(buf + i, pattern + mod, size))
332e4ad68b1364aebfe949e2d6a649c7b1001ebca07Jens Axboe			/* Let the slow compare find the first mismatch byte. */
3339a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang			break;
3349a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang		mod = 0;
3359a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang	}
33692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe
3379a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang	for (; i < len; i++) {
33892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		if (buf[i] != pattern[mod]) {
33992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			unsigned int bits;
34092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe
34192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			bits = hweight8(buf[i] ^ pattern[mod]);
34292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			log_err("fio: got pattern %x, wanted %x. Bad bits %d\n",
34392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe				buf[i], pattern[mod], bits);
34492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			log_err("fio: bad pattern block offset %u\n", i);
34592bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			dump_verify_buffers(hdr, vc);
34692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			return EILSEQ;
34792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		}
34892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		mod++;
34992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		if (mod == td->o.verify_pattern_bytes)
35092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			mod = 0;
35192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	}
35292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe
35392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	return 0;
35492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe}
35592bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe
35692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboestatic int verify_io_u_meta(struct verify_header *hdr, struct vcont *vc)
3577437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{
35892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	struct thread_data *td = vc->td;
3597437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	struct vhdr_meta *vh = hdr_priv(hdr);
360936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	struct io_u *io_u = vc->io_u;
36192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	int ret = EILSEQ;
3627437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
363bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "meta verify io_u %p, len %u\n", io_u, hdr->len);
364bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
365bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (vh->offset == io_u->offset + vc->hdr_num * td->o.verify_interval)
36692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		ret = 0;
36792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe
36892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	if (td->o.verify_pattern_bytes)
36992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		ret |= verify_io_u_pattern(hdr, vc);
37092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe
37192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	if (!ret)
372bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
3737437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
374bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "meta";
375bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
37692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	return ret;
3777437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis}
3787437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
379936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha512(struct verify_header *hdr, struct vcont *vc)
380cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
381936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
382546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha512 *vh = hdr_priv(hdr);
383cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	uint8_t sha512[128];
38425dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	struct fio_sha512_ctx sha512_ctx = {
385cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		.buf = sha512,
386cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
387cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
388936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "sha512 verify io_u %p, len %u\n", vc->io_u, hdr->len);
389bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
39025dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha512_init(&sha512_ctx);
39125dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha512_update(&sha512_ctx, p, hdr->len - hdr_size(hdr));
392cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
393bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (!memcmp(vh->sha512, sha512_ctx.buf, sizeof(sha512)))
394bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
395cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
396bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "sha512";
397bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = vh->sha512;
398bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = sha512_ctx.buf;
399bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = sizeof(vh->sha512);
400bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
401bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
402cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
403cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
404936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha256(struct verify_header *hdr, struct vcont *vc)
405cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
406936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
407546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha256 *vh = hdr_priv(hdr);
408bc77f56f79f6ae155e9eb26263ed686ef28b47ecJens Axboe	uint8_t sha256[64];
40925dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	struct fio_sha256_ctx sha256_ctx = {
410cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		.buf = sha256,
411cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
412cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
413936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "sha256 verify io_u %p, len %u\n", vc->io_u, hdr->len);
414bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
41525dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha256_init(&sha256_ctx);
41625dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha256_update(&sha256_ctx, p, hdr->len - hdr_size(hdr));
417cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
418bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (!memcmp(vh->sha256, sha256_ctx.buf, sizeof(sha256)))
419bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
420cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
421bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "sha256";
422bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = vh->sha256;
423bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = sha256_ctx.buf;
424bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = sizeof(vh->sha256);
425bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
426bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
427cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
428cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
429936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha1(struct verify_header *hdr, struct vcont *vc)
4307c353ceb3257b132f4c98326046b42201e070731Jens Axboe{
431936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
4327c353ceb3257b132f4c98326046b42201e070731Jens Axboe	struct vhdr_sha1 *vh = hdr_priv(hdr);
4337c353ceb3257b132f4c98326046b42201e070731Jens Axboe	uint32_t sha1[5];
43425dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	struct fio_sha1_ctx sha1_ctx = {
4357c353ceb3257b132f4c98326046b42201e070731Jens Axboe		.H = sha1,
4367c353ceb3257b132f4c98326046b42201e070731Jens Axboe	};
4377c353ceb3257b132f4c98326046b42201e070731Jens Axboe
438936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "sha1 verify io_u %p, len %u\n", vc->io_u, hdr->len);
4397c353ceb3257b132f4c98326046b42201e070731Jens Axboe
44025dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha1_init(&sha1_ctx);
44125dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha1_update(&sha1_ctx, p, hdr->len - hdr_size(hdr));
4427c353ceb3257b132f4c98326046b42201e070731Jens Axboe
443bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (!memcmp(vh->sha1, sha1_ctx.H, sizeof(sha1)))
444bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
4457c353ceb3257b132f4c98326046b42201e070731Jens Axboe
446bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "sha1";
447bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = vh->sha1;
448bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = sha1_ctx.H;
449bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = sizeof(vh->sha1);
450bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
451bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
4527c353ceb3257b132f4c98326046b42201e070731Jens Axboe}
4537c353ceb3257b132f4c98326046b42201e070731Jens Axboe
454936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc7(struct verify_header *hdr, struct vcont *vc)
4551e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{
456936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
457546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc7 *vh = hdr_priv(hdr);
4581e154bdbf14a1d352117aea057035235b66f0381Jens Axboe	unsigned char c;
4591e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
460936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc7 verify io_u %p, len %u\n", vc->io_u, hdr->len);
461bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
46225dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	c = fio_crc7(p, hdr->len - hdr_size(hdr));
4631e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
464bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc7)
465bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
4661e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
467bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc7";
468bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc7;
469bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
470bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 1;
471bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
472bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
4731e154bdbf14a1d352117aea057035235b66f0381Jens Axboe}
4741e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
475936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc16(struct verify_header *hdr, struct vcont *vc)
476969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{
477936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
478546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc16 *vh = hdr_priv(hdr);
479969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe	unsigned short c;
480969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
481936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc16 verify io_u %p, len %u\n", vc->io_u, hdr->len);
482bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
48325dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	c = fio_crc16(p, hdr->len - hdr_size(hdr));
484969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
485bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc16)
486bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
487969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
488bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc16";
489bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc16;
490bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
491bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 2;
492bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
493bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
494969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe}
495969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
496936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc64(struct verify_header *hdr, struct vcont *vc)
497d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{
498936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
499546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc64 *vh = hdr_priv(hdr);
500d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe	unsigned long long c;
501d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
502936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc64 verify io_u %p, len %u\n", vc->io_u, hdr->len);
503bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
50425dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	c = fio_crc64(p, hdr->len - hdr_size(hdr));
505d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
506bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc64)
507bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
508d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
509bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc64";
510bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc64;
511bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
512bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 8;
513bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
514bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
515d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe}
516d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
517936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc32(struct verify_header *hdr, struct vcont *vc)
518e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
519936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
520546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
521546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	uint32_t c;
522e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
523936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc32 verify io_u %p, len %u\n", vc->io_u, hdr->len);
524bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
52525dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	c = fio_crc32(p, hdr->len - hdr_size(hdr));
526e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
527bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc32)
528bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
529e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
530bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc32";
531bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc32;
532bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
533bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 4;
534bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
535bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
536e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
537e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
538936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc32c(struct verify_header *hdr, struct vcont *vc)
539bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{
540936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
541bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
542bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	uint32_t c;
543bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
544936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc32c verify io_u %p, len %u\n", vc->io_u, hdr->len);
545bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
54625dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	c = fio_crc32c(p, hdr->len - hdr_size(hdr));
547bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
548bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc32)
549bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
550bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
551bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc32c";
552bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc32;
553bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
554bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 4;
555bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
556bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
557bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe}
558bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
559936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_md5(struct verify_header *hdr, struct vcont *vc)
560e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
561936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
562546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_md5 *vh = hdr_priv(hdr);
5638c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	uint32_t hash[MD5_HASH_WORDS];
56425dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	struct fio_md5_ctx md5_ctx = {
5658c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe		.hash = hash,
5668c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	};
567e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
568936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "md5 verify io_u %p, len %u\n", vc->io_u, hdr->len);
569bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
57025dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_md5_init(&md5_ctx);
57125dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_md5_update(&md5_ctx, p, hdr->len - hdr_size(hdr));
572e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
573bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (!memcmp(vh->md5_digest, md5_ctx.hash, sizeof(hash)))
574bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
575e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
576bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "md5";
577bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = vh->md5_digest;
578bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = md5_ctx.hash;
579bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = sizeof(hash);
580bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
581bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
582e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
583e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
584e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe/*
585e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe * Push IO verification to a separate thread
586e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe */
587e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_io_u_async(struct thread_data *td, struct io_u *io_u)
588e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
589e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	if (io_u->file)
590e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		put_file_log(td, io_u->file);
591e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
592e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_lock(&td->io_u_lock);
593d7ee2a7d431c2cabdf56d04ca14805cad72cf985Steven Lang
5940c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran	if (io_u->flags & IO_U_F_IN_CUR_DEPTH) {
5950c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran		td->cur_depth--;
5960c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran		io_u->flags &= ~IO_U_F_IN_CUR_DEPTH;
5970c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran	}
598e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	flist_del(&io_u->list);
599e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	flist_add_tail(&io_u->list, &td->verify_list);
6002ecc1b57721e3cb72bbf558bc169c97037fe3d0aJens Axboe	io_u->flags |= IO_U_F_FREE_DEF;
601e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_unlock(&td->io_u_lock);
602e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
603e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_cond_signal(&td->verify_cond);
604e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	return 0;
605e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
606e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
6070d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboestatic int verify_trimmed_io_u(struct thread_data *td, struct io_u *io_u)
6080d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe{
6090d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	static char zero_buf[1024];
6100d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	unsigned int this_len, len;
6110d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	int ret = 0;
6120d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	void *p;
6130d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
6140d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	if (!td->o.trim_zero)
6150d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		return 0;
6160d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
6170d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	len = io_u->buflen;
6180d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	p = io_u->buf;
6190d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	do {
6200d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		this_len = sizeof(zero_buf);
6210d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		if (this_len > len)
6220d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe			this_len = len;
6230d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		if (memcmp(p, zero_buf, this_len)) {
6240d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe			ret = EILSEQ;
6250d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe			break;
6260d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		}
6270d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		len -= this_len;
6280d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		p += this_len;
6290d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	} while (len);
6300d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
6310d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	if (!ret)
6320d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		return 0;
6330d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
634a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe	log_err("trim: verify failed at file %s offset %llu, length %lu"
635a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		", block offset %lu\n",
636a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe			io_u->file->file_name, io_u->offset, io_u->buflen,
6372f68124f26e54233db41b462a257dabc48e5c32bJens Axboe			(unsigned long) (p - io_u->buf));
6380d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	return ret;
6390d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe}
6400d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
6410ae2c6e1d4727515e35e682eae6776fe55fa0275Jens Axboestatic int verify_header(struct io_u *io_u, struct verify_header *hdr)
642f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe{
643f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe	void *p = hdr;
644f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe	uint32_t crc;
645f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe
646ae38c0dcd570265aef09aa132ce27278d8909a1dJens Axboe	if (hdr->magic != FIO_HDR_MAGIC)
647ae38c0dcd570265aef09aa132ce27278d8909a1dJens Axboe		return 0;
6480ae2c6e1d4727515e35e682eae6776fe55fa0275Jens Axboe	if (hdr->len > io_u->buflen) {
6490ae2c6e1d4727515e35e682eae6776fe55fa0275Jens Axboe		log_err("fio: verify header exceeds buffer length (%u > %lu)\n", hdr->len, io_u->buflen);
6500ae2c6e1d4727515e35e682eae6776fe55fa0275Jens Axboe		return 0;
6510ae2c6e1d4727515e35e682eae6776fe55fa0275Jens Axboe	}
652ae38c0dcd570265aef09aa132ce27278d8909a1dJens Axboe
65325dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	crc = fio_crc32c(p, offsetof(struct verify_header, crc32));
654f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe	if (crc == hdr->crc32)
655f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe		return 1;
656f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe
657f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe	log_err("fio: verify header crc %x, calculated %x\n", hdr->crc32, crc);
658f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe	return 0;
659f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe}
660f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe
66136690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboeint verify_io_u(struct thread_data *td, struct io_u *io_u)
662e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
6633f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis	struct verify_header *hdr;
6642b13e716c0921356c0930522718e00b8df34293aJens Axboe	unsigned int header_size, hdr_inc, hdr_num = 0;
66595646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe	void *p;
666e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	int ret;
667e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
6681dcc049824b840df1ee0ef5d019fffa4037e1bb0Shawn Lewis	if (td->o.verify == VERIFY_NULL || io_u->ddir != DDIR_READ)
66936690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe		return 0;
6700d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	if (io_u->flags & IO_U_F_TRIMMED) {
6710d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		ret = verify_trimmed_io_u(td, io_u);
6720d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		goto done;
6730d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	}
67436690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe
675cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe	hdr_inc = get_hdr_inc(td, io_u);
676e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
677a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe	ret = 0;
6785ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	for (p = io_u->buf; p < io_u->buf + io_u->buflen;
6795ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	     p += hdr_inc, hdr_num++) {
680bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		struct vcont vc = {
681bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe			.io_u		= io_u,
682bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe			.hdr_num	= hdr_num,
6837d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			.td		= td,
684bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		};
685f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe		unsigned int verify_type;
686936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe
687f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe		if (ret && td->o.verify_fatal)
688a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe			break;
689f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe
6902b13e716c0921356c0930522718e00b8df34293aJens Axboe		header_size = __hdr_size(td->o.verify);
691a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe		if (td->o.verify_offset)
6922b13e716c0921356c0930522718e00b8df34293aJens Axboe			memswp(p, p + td->o.verify_offset, header_size);
69395646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe		hdr = p;
694e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
6950ae2c6e1d4727515e35e682eae6776fe55fa0275Jens Axboe		if (!verify_header(io_u, hdr)) {
696ae38c0dcd570265aef09aa132ce27278d8909a1dJens Axboe			log_err("verify: bad magic header %x, wanted %x at "
697ae38c0dcd570265aef09aa132ce27278d8909a1dJens Axboe				"file %s offset %llu, length %u\n",
698d3a173a927084660c365d6aa162016ebb0746946Jens Axboe				hdr->magic, FIO_HDR_MAGIC,
699c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe				io_u->file->file_name,
700c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe				io_u->offset + hdr_num * hdr->len, hdr->len);
7019fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe			return EILSEQ;
7023f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe		}
7033f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
704f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe		if (td->o.verify != VERIFY_NONE)
705f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe			verify_type = td->o.verify;
706f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe		else
707f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe			verify_type = hdr->verify_type;
708f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe
709f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe		switch (verify_type) {
7103f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_MD5:
711936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_md5(hdr, &vc);
7123f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
7133f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC64:
714936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc64(hdr, &vc);
7153f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
716bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe		case VERIFY_CRC32C:
7173845591fadea480177223e28c9d1c03642d34f0eJens Axboe		case VERIFY_CRC32C_INTEL:
718936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc32c(hdr, &vc);
719bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe			break;
7203f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC32:
721936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc32(hdr, &vc);
7223f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
7233f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC16:
724936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc16(hdr, &vc);
7253f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
7263f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC7:
727936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc7(hdr, &vc);
7283f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
729cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA256:
730936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_sha256(hdr, &vc);
731cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
732cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA512:
733936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_sha512(hdr, &vc);
734cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
7357437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		case VERIFY_META:
73692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			ret = verify_io_u_meta(hdr, &vc);
7377437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis			break;
7387c353ceb3257b132f4c98326046b42201e070731Jens Axboe		case VERIFY_SHA1:
739936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_sha1(hdr, &vc);
7407c353ceb3257b132f4c98326046b42201e070731Jens Axboe			break;
74192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		case VERIFY_PATTERN:
74292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			ret = verify_io_u_pattern(hdr, &vc);
74392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe			break;
7443f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		default:
7453f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			log_err("Bad verify type %u\n", hdr->verify_type);
746d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe			ret = EINVAL;
7473f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		}
748f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe
749f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe		if (ret && verify_type != hdr->verify_type)
750f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe			log_err("fio: verify type mismatch (%u media, %u given)\n",
751f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe					hdr->verify_type, verify_type);
7523f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis	}
753a7dfe862c2e3fe72b8db6a6e67302048d3731c6dJens Axboe
7540d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboedone:
755f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe	if (ret && td->o.verify_fatal)
756f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe		td->terminate = 1;
757f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe
758a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe	return ret;
759e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
760e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
7617437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic void fill_meta(struct verify_header *hdr, struct thread_data *td,
7625ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		      struct io_u *io_u, unsigned int header_num)
7637437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{
7647437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	struct vhdr_meta *vh = hdr_priv(hdr);
7657437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
7667437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->thread = td->thread_number;
7677437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
7687437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->time_sec = io_u->start_time.tv_sec;
7697437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->time_usec = io_u->start_time.tv_usec;
7707437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
7717437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->numberio = td->io_issues[DDIR_WRITE];
7727437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
7737437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->offset = io_u->offset + header_num * td->o.verify_interval;
7747437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis}
7757437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
776cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha512(struct verify_header *hdr, void *p, unsigned int len)
777cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
778546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha512 *vh = hdr_priv(hdr);
77925dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	struct fio_sha512_ctx sha512_ctx = {
780546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.buf = vh->sha512,
781cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
782cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
78325dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha512_init(&sha512_ctx);
78425dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha512_update(&sha512_ctx, p, len);
785cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
786cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
787cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha256(struct verify_header *hdr, void *p, unsigned int len)
788cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
789546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha256 *vh = hdr_priv(hdr);
79025dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	struct fio_sha256_ctx sha256_ctx = {
791546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.buf = vh->sha256,
792cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
793cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
79425dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha256_init(&sha256_ctx);
79525dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha256_update(&sha256_ctx, p, len);
796cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
797cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
7987c353ceb3257b132f4c98326046b42201e070731Jens Axboestatic void fill_sha1(struct verify_header *hdr, void *p, unsigned int len)
7997c353ceb3257b132f4c98326046b42201e070731Jens Axboe{
8007c353ceb3257b132f4c98326046b42201e070731Jens Axboe	struct vhdr_sha1 *vh = hdr_priv(hdr);
80125dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	struct fio_sha1_ctx sha1_ctx = {
8027c353ceb3257b132f4c98326046b42201e070731Jens Axboe		.H = vh->sha1,
8037c353ceb3257b132f4c98326046b42201e070731Jens Axboe	};
8047c353ceb3257b132f4c98326046b42201e070731Jens Axboe
80525dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha1_init(&sha1_ctx);
80625dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_sha1_update(&sha1_ctx, p, len);
8077c353ceb3257b132f4c98326046b42201e070731Jens Axboe}
8087c353ceb3257b132f4c98326046b42201e070731Jens Axboe
8091e154bdbf14a1d352117aea057035235b66f0381Jens Axboestatic void fill_crc7(struct verify_header *hdr, void *p, unsigned int len)
8101e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{
811546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc7 *vh = hdr_priv(hdr);
812546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
81325dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	vh->crc7 = fio_crc7(p, len);
8141e154bdbf14a1d352117aea057035235b66f0381Jens Axboe}
8151e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
816969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboestatic void fill_crc16(struct verify_header *hdr, void *p, unsigned int len)
817969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{
818546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc16 *vh = hdr_priv(hdr);
819546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
82025dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	vh->crc16 = fio_crc16(p, len);
821969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe}
822969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
823e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_crc32(struct verify_header *hdr, void *p, unsigned int len)
824e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
825546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
826546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
82725dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	vh->crc32 = fio_crc32(p, len);
828e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
829e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
830bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboestatic void fill_crc32c(struct verify_header *hdr, void *p, unsigned int len)
831bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{
832bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
833bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
83425dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	vh->crc32 = fio_crc32c(p, len);
835bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe}
836bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
837d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboestatic void fill_crc64(struct verify_header *hdr, void *p, unsigned int len)
838d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{
839546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc64 *vh = hdr_priv(hdr);
840546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
84125dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	vh->crc64 = fio_crc64(p, len);
842d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe}
843d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
844e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_md5(struct verify_header *hdr, void *p, unsigned int len)
845e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
846546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_md5 *vh = hdr_priv(hdr);
84725dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	struct fio_md5_ctx md5_ctx = {
848546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.hash = (uint32_t *) vh->md5_digest,
8498c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	};
850e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
85125dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_md5_init(&md5_ctx);
85225dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	fio_md5_update(&md5_ctx, p, len);
853e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
854e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
8557d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void populate_hdr(struct thread_data *td, struct io_u *io_u,
8567d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			 struct verify_header *hdr, unsigned int header_num,
8577d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			 unsigned int header_len)
8587d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{
8597d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	unsigned int data_len;
8607d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	void *data, *p;
8617d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
8627d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	p = (void *) hdr;
8637d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
864d3a173a927084660c365d6aa162016ebb0746946Jens Axboe	hdr->magic = FIO_HDR_MAGIC;
8657d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	hdr->verify_type = td->o.verify;
866d3a173a927084660c365d6aa162016ebb0746946Jens Axboe	hdr->len = header_len;
8677d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	hdr->rand_seed = io_u->rand_seed;
86825dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe	hdr->crc32 = fio_crc32c(p, offsetof(struct verify_header, crc32));
869f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe
8707d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	data_len = header_len - hdr_size(hdr);
8717d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
8727d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	data = p + hdr_size(hdr);
8737d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	switch (td->o.verify) {
8747d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_MD5:
8757d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill md5 io_u %p, len %u\n",
8767d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8777d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_md5(hdr, data, data_len);
8787d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8797d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC64:
8807d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc64 io_u %p, len %u\n",
8817d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8827d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc64(hdr, data, data_len);
8837d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8847d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC32C:
8857d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC32C_INTEL:
8867d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc32c io_u %p, len %u\n",
8877d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8887d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc32c(hdr, data, data_len);
8897d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8907d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC32:
8917d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc32 io_u %p, len %u\n",
8927d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8937d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc32(hdr, data, data_len);
8947d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8957d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC16:
8967d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc16 io_u %p, len %u\n",
8977d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8987d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc16(hdr, data, data_len);
8997d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
9007d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC7:
9017d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc7 io_u %p, len %u\n",
9027d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
9037d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc7(hdr, data, data_len);
9047d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
9057d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_SHA256:
9067d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill sha256 io_u %p, len %u\n",
9077d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
9087d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_sha256(hdr, data, data_len);
9097d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
9107d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_SHA512:
9117d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill sha512 io_u %p, len %u\n",
9127d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
9137d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_sha512(hdr, data, data_len);
9147d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
9157d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_META:
9167d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill meta io_u %p, len %u\n",
9177d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
9187d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_meta(hdr, td, io_u, header_num);
9197d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
9207d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_SHA1:
9217d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill sha1 io_u %p, len %u\n",
9227d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
9237d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_sha1(hdr, data, data_len);
9247d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
92592bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe	case VERIFY_PATTERN:
92692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		/* nothing to do here */
92792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe		break;
9287d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	default:
9297d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		log_err("fio: bad verify type: %d\n", td->o.verify);
9307d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		assert(0);
9317d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	}
9327d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	if (td->o.verify_offset)
9337d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		memswp(p, p + td->o.verify_offset, hdr_size(hdr));
9347d9fb455aadc0c0363489591775496f27f4a560aJens Axboe}
9357d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
936e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe/*
937e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * fill body of io_u->buf with random data and add a header with the
938c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * checksum of choice
939e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe */
940e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboevoid populate_verify_io_u(struct thread_data *td, struct io_u *io_u)
941e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
9429cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe	if (td->o.verify == VERIFY_NULL)
9439cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe		return;
9449cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe
945c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe	fill_pattern_headers(td, io_u, 0, 0);
946e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
947e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
948e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboeint get_next_verify(struct thread_data *td, struct io_u *io_u)
949e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
9508de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	struct io_piece *ipo = NULL;
951e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
952d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	/*
953d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	 * this io_u is from a requeue, we already filled the offsets
954d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	 */
955d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	if (io_u->file)
956d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe		return 0;
957d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe
9588de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	if (!RB_EMPTY_ROOT(&td->io_hist_tree)) {
9598de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe		struct rb_node *n = rb_first(&td->io_hist_tree);
960e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
9618de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe		ipo = rb_entry(n, struct io_piece, rb_node);
9624b87898e8d76aaf05baec83077a11311c1447397Jens Axboe		rb_erase(n, &td->io_hist_tree);
963a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		assert(ipo->flags & IP_F_ONRB);
964a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		ipo->flags &= ~IP_F_ONRB;
96501743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe	} else if (!flist_empty(&td->io_hist_list)) {
96601743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe		ipo = flist_entry(td->io_hist_list.next, struct io_piece, list);
96701743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe		flist_del(&ipo->list);
968a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		assert(ipo->flags & IP_F_ONLIST);
969a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		ipo->flags &= ~IP_F_ONLIST;
9708de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	}
971e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
9728de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	if (ipo) {
9730d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		td->io_hist_len--;
9740d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
975e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->offset = ipo->offset;
976e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->buflen = ipo->len;
97736167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->file = ipo->file;
97882af2a7ca1a543b41c003de69d5e3c36860f47d5Jens Axboe		io_u->flags |= IO_U_F_VER_LIST;
97997af62cec418cd722fb43c6010d6430534e12353Jens Axboe
9800d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		if (ipo->flags & IP_F_TRIMMED)
9810d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe			io_u->flags |= IO_U_F_TRIMMED;
9820d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
983d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe		if (!fio_file_open(io_u->file)) {
98497af62cec418cd722fb43c6010d6430534e12353Jens Axboe			int r = td_io_open_file(td, io_u->file);
98597af62cec418cd722fb43c6010d6430534e12353Jens Axboe
986bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			if (r) {
987bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe				dprint(FD_VERIFY, "failed file %s open\n",
988bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe						io_u->file->file_name);
98997af62cec418cd722fb43c6010d6430534e12353Jens Axboe				return 1;
990bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			}
99197af62cec418cd722fb43c6010d6430534e12353Jens Axboe		}
99297af62cec418cd722fb43c6010d6430534e12353Jens Axboe
99397af62cec418cd722fb43c6010d6430534e12353Jens Axboe		get_file(ipo->file);
994d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe		assert(fio_file_open(io_u->file));
995e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->ddir = DDIR_READ;
99636167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->xfer_buf = io_u->buf;
99736167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->xfer_buflen = io_u->buflen;
9980d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
9990d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		remove_trim_entry(td, ipo);
1000e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		free(ipo);
1001bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "get_next_verify: ret io_u %p\n", io_u);
1002e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		return 0;
1003e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	}
1004e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
1005bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "get_next_verify: empty\n");
1006e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	return 1;
1007e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
1008e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1009dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboevoid fio_verify_init(struct thread_data *td)
1010dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe{
1011dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe	if (td->o.verify == VERIFY_CRC32C_INTEL ||
1012dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe	    td->o.verify == VERIFY_CRC32C) {
1013dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe		crc32c_intel_probe();
1014dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe	}
1015dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe}
1016dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe
1017e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboestatic void *verify_async_thread(void *data)
1018e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
1019e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	struct thread_data *td = data;
1020e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	struct io_u *io_u;
1021e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	int ret = 0;
1022e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1023e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	if (td->o.verify_cpumask_set &&
1024e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	    fio_setaffinity(td->pid, td->o.verify_cpumask)) {
1025e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		log_err("fio: failed setting verify thread affinity\n");
1026e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		goto done;
1027e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	}
1028e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1029e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	do {
1030e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		FLIST_HEAD(list);
1031e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe
1032e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		read_barrier();
1033e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		if (td->verify_thread_exit)
1034e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			break;
1035e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1036e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		pthread_mutex_lock(&td->io_u_lock);
1037e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1038e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		while (flist_empty(&td->verify_list) &&
1039e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		       !td->verify_thread_exit) {
1040b36e298b5bdfc31ffc9a4c14e94a9c5c748888b0Jens Axboe			ret = pthread_cond_wait(&td->verify_cond,
1041b36e298b5bdfc31ffc9a4c14e94a9c5c748888b0Jens Axboe							&td->io_u_lock);
1042e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			if (ret) {
1043e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe				pthread_mutex_unlock(&td->io_u_lock);
1044e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe				break;
1045e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			}
1046e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		}
1047e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1048e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		flist_splice_init(&td->verify_list, &list);
1049e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		pthread_mutex_unlock(&td->io_u_lock);
1050e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe
1051e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		if (flist_empty(&list))
1052e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			continue;
1053e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1054e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		while (!flist_empty(&list)) {
1055e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe			io_u = flist_entry(list.next, struct io_u, list);
1056e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe			flist_del_init(&io_u->list);
1057e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1058d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			ret = verify_io_u(td, io_u);
1059e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe			put_io_u(td, io_u);
1060d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			if (!ret)
1061d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				continue;
10628b28bd41375930664a0ff9ff9b101a88ac416ac5Dmitry Monakhov			if (td_non_fatal_error(td, ERROR_TYPE_VERIFY_BIT, ret)) {
1063d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				update_error_count(td, ret);
1064d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				td_clear_error(td);
1065d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				ret = 0;
1066d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			}
1067e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		}
1068e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	} while (!ret);
1069e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1070d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe	if (ret) {
1071d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe		td_verror(td, ret, "async_verify");
1072f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe		if (td->o.verify_fatal)
1073f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe			td->terminate = 1;
1074d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe	}
1075d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe
1076e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboedone:
1077e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_lock(&td->io_u_lock);
1078e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->nr_verify_threads--;
1079e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_unlock(&td->io_u_lock);
1080e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1081e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_cond_signal(&td->free_cond);
1082e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	return NULL;
1083e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
1084e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1085e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_async_init(struct thread_data *td)
1086e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
1087e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	int i, ret;
1088304a47c7d94f407cc72a87025679a67f02288447bart Van Assche	pthread_attr_t attr;
1089304a47c7d94f407cc72a87025679a67f02288447bart Van Assche
1090304a47c7d94f407cc72a87025679a67f02288447bart Van Assche	pthread_attr_init(&attr);
1091304a47c7d94f407cc72a87025679a67f02288447bart Van Assche	pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN);
1092e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1093e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_thread_exit = 0;
1094e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1095e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_threads = malloc(sizeof(pthread_t) * td->o.verify_async);
1096e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	for (i = 0; i < td->o.verify_async; i++) {
1097304a47c7d94f407cc72a87025679a67f02288447bart Van Assche		ret = pthread_create(&td->verify_threads[i], &attr,
1098e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe					verify_async_thread, td);
1099e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		if (ret) {
1100e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			log_err("fio: async verify creation failed: %s\n",
1101e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe					strerror(ret));
1102e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			break;
1103e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		}
1104e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		ret = pthread_detach(td->verify_threads[i]);
1105e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		if (ret) {
1106e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			log_err("fio: async verify thread detach failed: %s\n",
1107e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe					strerror(ret));
1108e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			break;
1109e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		}
1110e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		td->nr_verify_threads++;
1111e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	}
1112e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1113304a47c7d94f407cc72a87025679a67f02288447bart Van Assche	pthread_attr_destroy(&attr);
1114304a47c7d94f407cc72a87025679a67f02288447bart Van Assche
1115e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	if (i != td->o.verify_async) {
1116e40823b10920f679d84f3f2222e319c168b1e7daJens Axboe		log_err("fio: only %d verify threads started, exiting\n", i);
1117e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		td->verify_thread_exit = 1;
1118e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		write_barrier();
1119e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		pthread_cond_broadcast(&td->verify_cond);
1120e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		return 1;
1121e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	}
1122e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1123e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	return 0;
1124e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
1125e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1126e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboevoid verify_async_exit(struct thread_data *td)
1127e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
1128e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_thread_exit = 1;
1129e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	write_barrier();
1130e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_cond_broadcast(&td->verify_cond);
1131e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1132e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_lock(&td->io_u_lock);
1133e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1134e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	while (td->nr_verify_threads)
1135e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		pthread_cond_wait(&td->free_cond, &td->io_u_lock);
1136e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1137e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_unlock(&td->io_u_lock);
1138e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	free(td->verify_threads);
1139e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_threads = NULL;
1140e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
1141