verify.c revision d16d4e09352f618c266d1efe27cbb25a95df6e86
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>
8e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
9e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe#include "fio.h"
10e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
11eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/md5.h"
12eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc64.h"
13eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc32.h"
14eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc16.h"
15eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc7.h"
16eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/sha256.h"
17eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/sha512.h"
18cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
1990059d65bde4804e4da07401ad6902c1d956b592Jens Axboestatic void fill_random_bytes(struct thread_data *td, void *p, unsigned int len)
20e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
21e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	unsigned int todo;
224c5946c6606abc87ba7e2bfc57a5030d19b6d4d5Jens Axboe	int r;
23e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
24e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	while (len) {
254c5946c6606abc87ba7e2bfc57a5030d19b6d4d5Jens Axboe		r = os_random_long(&td->verify_state);
26e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
27e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		/*
28e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		 * lrand48_r seems to be broken and only fill the bottom
29e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		 * 32-bits, even on 64-bit archs with 64-bit longs
30e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		 */
31e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		todo = sizeof(r);
32e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		if (todo > len)
33e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe			todo = len;
34e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
35e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		memcpy(p, &r, todo);
36e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
37e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		len -= todo;
38e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		p += todo;
39e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	}
40e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
41e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
4290059d65bde4804e4da07401ad6902c1d956b592Jens Axboestatic void fill_pattern(struct thread_data *td, void *p, unsigned int len)
4390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe{
4490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	switch (td->o.verify_pattern_bytes) {
4590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	case 0:
4690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		fill_random_bytes(td, p, len);
4790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		break;
4890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	case 1:
4990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		memset(p, td->o.verify_pattern, len);
5090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		break;
5190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	case 2:
5290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	case 3:
5390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	case 4: {
5490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		unsigned int pattern = td->o.verify_pattern;
5590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		unsigned int i = 0;
5690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		unsigned char c1, c2, c3, c4;
5790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		unsigned char *b = p;
5890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe
5990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		c1 = pattern & 0xff;
6090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		pattern >>= 8;
6190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		c2 = pattern & 0xff;
6290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		pattern >>= 8;
6390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		c3 = pattern & 0xff;
6490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		pattern >>= 8;
6590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		c4 = pattern & 0xff;
6690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe
6790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		while (i < len) {
6890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe			b[i++] = c1;
6990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe			if (i == len)
7090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe				break;
7190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe			b[i++] = c2;
7290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe			if (td->o.verify_pattern_bytes == 2 || i == len)
7390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe				continue;
7490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe			b[i++] = c3;
7590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe			if (td->o.verify_pattern_bytes == 3 || i == len)
7690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe				continue;
7790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe			b[i++] = c4;
7890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		}
7990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		break;
8090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		}
8190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	}
8290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe}
8390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe
844764aec9fe5988281bdc114c13ac771fb16713ccJens Axboestatic void memswp(void *buf1, void *buf2, unsigned int len)
85546a9142511875524850ac92776184fd9fb7196eShawn Lewis{
86dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis	char swap[200];
87dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis
88dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis	assert(len <= sizeof(swap));
8990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe
90546a9142511875524850ac92776184fd9fb7196eShawn Lewis	memcpy(&swap, buf1, len);
91546a9142511875524850ac92776184fd9fb7196eShawn Lewis	memcpy(buf1, buf2, len);
92546a9142511875524850ac92776184fd9fb7196eShawn Lewis	memcpy(buf2, &swap, len);
93546a9142511875524850ac92776184fd9fb7196eShawn Lewis}
94546a9142511875524850ac92776184fd9fb7196eShawn Lewis
95e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void hexdump(void *buffer, int len)
96e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
97e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	unsigned char *p = buffer;
98e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	int i;
99e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
100e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	for (i = 0; i < len; i++)
1016d86144dd10b05e8b82e9b895c35dd778e5e71abJens Axboe		log_info("%02x", p[i]);
1026d86144dd10b05e8b82e9b895c35dd778e5e71abJens Axboe	log_info("\n");
103e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
104e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
105d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe/*
1068767783245faac99a7e1c330a1d6536e579c8402Jens Axboe * Prepare for seperation of verify_header and checksum header
1078767783245faac99a7e1c330a1d6536e579c8402Jens Axboe */
108546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic inline unsigned int __hdr_size(int verify_type)
1098767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{
110546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	unsigned int len;
1118767783245faac99a7e1c330a1d6536e579c8402Jens Axboe
112546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	switch (verify_type) {
113546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_NONE:
114546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_NULL:
115bfb41d98f63cb9fb72cb7c82618be10bc6d52c33Jens Axboe	case VERIFY_PATTERN:
116546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = 0;
117546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
118546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_MD5:
119546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_md5);
120546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
121546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC64:
122546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc64);
123546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
124546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC32:
125546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc32);
126546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
127546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC16:
128546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc16);
129546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
130546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC7:
131546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc7);
132546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
133546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_SHA256:
134546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_sha256);
135546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
136546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_SHA512:
137546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_sha512);
138546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
1397437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	case VERIFY_META:
1407437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		len = sizeof(struct vhdr_meta);
1417437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		break;
142546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	default:
143546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		log_err("fio: unknown verify header!\n");
144546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		assert(0);
145546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	}
146546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
147546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	return len + sizeof(struct verify_header);
1488767783245faac99a7e1c330a1d6536e579c8402Jens Axboe}
1498767783245faac99a7e1c330a1d6536e579c8402Jens Axboe
1508767783245faac99a7e1c330a1d6536e579c8402Jens Axboestatic inline unsigned int hdr_size(struct verify_header *hdr)
1518767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{
152546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	return __hdr_size(hdr->verify_type);
153546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe}
154546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
155546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic void *hdr_priv(struct verify_header *hdr)
156546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe{
157546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	void *priv = hdr;
158546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
159546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	return priv + sizeof(struct verify_header);
1608767783245faac99a7e1c330a1d6536e579c8402Jens Axboe}
1618767783245faac99a7e1c330a1d6536e579c8402Jens Axboe
1628767783245faac99a7e1c330a1d6536e579c8402Jens Axboe/*
163d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe * Return data area 'header_num'
164d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe */
165d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboestatic inline void *io_u_verify_off(struct verify_header *hdr,
166d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe				    struct io_u *io_u,
167d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe				    unsigned char header_num)
168d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe{
1698767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	return io_u->buf + header_num * hdr->len + hdr_size(hdr);
170d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe}
171d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe
1727437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic int verify_io_u_meta(struct verify_header *hdr, struct thread_data *td,
1737437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis                            struct io_u *io_u, unsigned int header_num)
1747437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{
1757437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	struct vhdr_meta *vh = hdr_priv(hdr);
1767437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
1777437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	if (vh->offset != io_u->offset + header_num * td->o.verify_interval) {
1787437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		log_err("meta: verify failed at %llu/%u\n",
1797437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		              io_u->offset + header_num * hdr->len,
1807437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		              hdr->len);
181d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe		return EIO;
1827437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	}
1837437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
1847437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	return 0;
1857437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis}
1867437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
187cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic int verify_io_u_sha512(struct verify_header *hdr, struct io_u *io_u,
188cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			      unsigned int header_num)
189cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
190cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	void *p = io_u_verify_off(hdr, io_u, header_num);
191546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha512 *vh = hdr_priv(hdr);
192cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	uint8_t sha512[128];
193cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha512_ctx sha512_ctx = {
194cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		.buf = sha512,
195cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
196cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
197cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha512_init(&sha512_ctx);
1988767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	sha512_update(&sha512_ctx, p, hdr->len - hdr_size(hdr));
199cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
200546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (memcmp(vh->sha512, sha512_ctx.buf, sizeof(sha512))) {
201cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		log_err("sha512: verify failed at %llu/%u\n",
202cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		              io_u->offset + header_num * hdr->len,
203cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		              hdr->len);
204546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		hexdump(vh->sha512, sizeof(vh->sha512));
205cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		hexdump(sha512_ctx.buf, sizeof(sha512));
206d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe		return EIO;
207cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	}
208cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
209cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	return 0;
210cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
211cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
212cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic int verify_io_u_sha256(struct verify_header *hdr, struct io_u *io_u,
213cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			      unsigned int header_num)
214cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
215cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	void *p = io_u_verify_off(hdr, io_u, header_num);
216546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha256 *vh = hdr_priv(hdr);
217cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	uint8_t sha256[128];
218cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha256_ctx sha256_ctx = {
219cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		.buf = sha256,
220cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
221cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
222cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha256_init(&sha256_ctx);
2238767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	sha256_update(&sha256_ctx, p, hdr->len - hdr_size(hdr));
224cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
225546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (memcmp(vh->sha256, sha256_ctx.buf, sizeof(sha256))) {
226cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		log_err("sha256: verify failed at %llu/%u\n",
227cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		              io_u->offset + header_num * hdr->len,
228cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		              hdr->len);
229546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		hexdump(vh->sha256, sizeof(vh->sha256));
230cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		hexdump(sha256_ctx.buf, sizeof(sha256));
231d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe		return EIO;
232cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	}
233cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
234cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	return 0;
235cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
236cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
2373f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_crc7(struct verify_header *hdr, struct io_u *io_u,
2383f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis                            unsigned char header_num)
2391e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{
240d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe	void *p = io_u_verify_off(hdr, io_u, header_num);
241546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc7 *vh = hdr_priv(hdr);
2421e154bdbf14a1d352117aea057035235b66f0381Jens Axboe	unsigned char c;
2431e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
2448767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc7(p, hdr->len - hdr_size(hdr));
2451e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
246546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (c != vh->crc7) {
2473f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		log_err("crc7: verify failed at %llu/%u\n",
2483f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		                io_u->offset + header_num * hdr->len,
2493f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis				hdr->len);
250546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		log_err("crc7: wanted %x, got %x\n", vh->crc7, c);
251d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe		return EIO;
2521e154bdbf14a1d352117aea057035235b66f0381Jens Axboe	}
2531e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
2541e154bdbf14a1d352117aea057035235b66f0381Jens Axboe	return 0;
2551e154bdbf14a1d352117aea057035235b66f0381Jens Axboe}
2561e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
2573f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_crc16(struct verify_header *hdr, struct io_u *io_u,
2583f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis                             unsigned int header_num)
259969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{
260d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe	void *p = io_u_verify_off(hdr, io_u, header_num);
261546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc16 *vh = hdr_priv(hdr);
262969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe	unsigned short c;
263969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
2648767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc16(p, hdr->len - hdr_size(hdr));
265969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
266546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (c != vh->crc16) {
2673f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		log_err("crc16: verify failed at %llu/%u\n",
2683f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		                io_u->offset + header_num * hdr->len,
2693f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis				hdr->len);
270546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		log_err("crc16: wanted %x, got %x\n", vh->crc16, c);
271d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe		return EIO;
272969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe	}
273969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
274969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe	return 0;
275969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe}
276969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
2773f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_crc64(struct verify_header *hdr, struct io_u *io_u,
2783f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis                             unsigned int header_num)
279d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{
280d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe	void *p = io_u_verify_off(hdr, io_u, header_num);
281546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc64 *vh = hdr_priv(hdr);
282d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe	unsigned long long c;
283d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
2848767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc64(p, hdr->len - hdr_size(hdr));
285d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
286546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (c != vh->crc64) {
2873f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		log_err("crc64: verify failed at %llu/%u\n",
2883f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis				io_u->offset + header_num * hdr->len,
2893f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis				hdr->len);
290546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		log_err("crc64: wanted %llx, got %llx\n", (unsigned long long) vh->crc64, c);
291d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe		return EIO;
292d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe	}
293d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
294d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe	return 0;
295d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe}
296d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
2973f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_crc32(struct verify_header *hdr, struct io_u *io_u,
2983f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		             unsigned int header_num)
299e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
300d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe	void *p = io_u_verify_off(hdr, io_u, header_num);
301546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
302546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	uint32_t c;
303e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
3048767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc32(p, hdr->len - hdr_size(hdr));
305e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
306546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (c != vh->crc32) {
3073f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		log_err("crc32: verify failed at %llu/%u\n",
3083f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		                io_u->offset + header_num * hdr->len,
3093f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis				hdr->len);
310546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		log_err("crc32: wanted %x, got %x\n", vh->crc32, c);
311d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe		return EIO;
312e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	}
313e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
314e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	return 0;
315e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
316e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
3173f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_md5(struct verify_header *hdr, struct io_u *io_u,
3183f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		           unsigned int header_num)
319e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
320d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe	void *p = io_u_verify_off(hdr, io_u, header_num);
321546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_md5 *vh = hdr_priv(hdr);
3228c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	uint32_t hash[MD5_HASH_WORDS];
3238c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	struct md5_ctx md5_ctx = {
3248c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe		.hash = hash,
3258c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	};
326e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
32761f821f16cf27d8742e09b3a137c933cd0085e9bJens Axboe	md5_init(&md5_ctx);
3288767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	md5_update(&md5_ctx, p, hdr->len - hdr_size(hdr));
329e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
330546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	if (memcmp(vh->md5_digest, md5_ctx.hash, sizeof(hash))) {
3313f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		log_err("md5: verify failed at %llu/%u\n",
3323f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		              io_u->offset + header_num * hdr->len,
3333f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		              hdr->len);
334546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		hexdump(vh->md5_digest, sizeof(vh->md5_digest));
3358c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe		hexdump(md5_ctx.hash, sizeof(hash));
336d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe		return EIO;
337e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	}
338e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
339e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	return 0;
340e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
341e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
3423f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboestatic unsigned int hweight8(unsigned int w)
3433f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe{
3443f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe	unsigned int res = w - ((w >> 1) & 0x55);
3453f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
3463f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe	res = (res & 0x33) + ((res >> 2) & 0x33);
3473f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe	return (res + (res >> 4)) & 0x0F;
3483f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe}
3493f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
350a944e335fac62c75966b417a25ec107c40957cdbShawn Lewisint verify_io_u_pattern(unsigned long pattern, unsigned long pattern_size,
3514764aec9fe5988281bdc114c13ac771fb16713ccJens Axboe                        char *buf, unsigned int len, unsigned int mod)
352a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis{
353a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	unsigned int i;
354a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	char split_pattern[4];
355a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis
356a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	for (i = 0; i < 4; i++) {
357a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis		split_pattern[i] = pattern & 0xff;
358a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis		pattern >>= 8;
359a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	}
360a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis
361a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	for (i = 0; i < len; i++) {
3623f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe		if (buf[i] != split_pattern[mod]) {
3633f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe			unsigned int bits;
3643f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
3653f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe			bits = hweight8(buf[i] ^ split_pattern[mod]);
3663f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe			log_err("fio: got pattern %x, wanted %x. Bad bits %d\n",
3673f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe				buf[i], split_pattern[mod], bits);
3683f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe			log_err("fio: bad pattern block offset %u\n", i);
369d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe			return EIO;
3703f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe		}
371a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis		mod++;
372a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis		if (mod == pattern_size)
373a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis			mod = 0;
374a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	}
375a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis
376a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	return 0;
377a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis}
378a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis
37936690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboeint verify_io_u(struct thread_data *td, struct io_u *io_u)
380e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
3813f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis	struct verify_header *hdr;
382a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	unsigned int hdr_size, hdr_inc, hdr_num = 0;
38395646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe	void *p;
384e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	int ret;
385e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
3861dcc049824b840df1ee0ef5d019fffa4037e1bb0Shawn Lewis	if (td->o.verify == VERIFY_NULL || io_u->ddir != DDIR_READ)
38736690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe		return 0;
38836690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe
3893f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis	hdr_inc = io_u->buflen;
390a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe	if (td->o.verify_interval)
391a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe		hdr_inc = td->o.verify_interval;
392e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
393a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe	ret = 0;
3943f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe	for (p = io_u->buf; p < io_u->buf + io_u->buflen; p += hdr_inc, hdr_num++) {
395a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe		if (ret && td->o.verify_fatal) {
396a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe			td->terminate = 1;
397a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe			break;
398a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe		}
399a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis		hdr_size = __hdr_size(td->o.verify);
400a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe		if (td->o.verify_offset)
401a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis			memswp(p, p + td->o.verify_offset, hdr_size);
40295646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe		hdr = p;
403e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
4043f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe		if (hdr->fio_magic != FIO_HDR_MAGIC) {
4053f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe			log_err("Bad verify header %x\n", hdr->fio_magic);
4063f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe			return EIO;
4073f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe		}
4083f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
4093f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		switch (hdr->verify_type) {
4103f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_MD5:
4113f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			ret = verify_io_u_md5(hdr, io_u, hdr_num);
4123f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
4133f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC64:
4143f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			ret = verify_io_u_crc64(hdr, io_u, hdr_num);
4153f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
4163f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC32:
4173f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			ret = verify_io_u_crc32(hdr, io_u, hdr_num);
4183f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
4193f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC16:
4203f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			ret = verify_io_u_crc16(hdr, io_u, hdr_num);
4213f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
4223f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC7:
4233f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			ret = verify_io_u_crc7(hdr, io_u, hdr_num);
4243f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
425cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA256:
426cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			ret = verify_io_u_sha256(hdr, io_u, hdr_num);
427cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
428cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA512:
429cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			ret = verify_io_u_sha512(hdr, io_u, hdr_num);
430cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
4317437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		case VERIFY_META:
4327437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis			ret = verify_io_u_meta(hdr, td, io_u, hdr_num);
4337437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis			break;
434bfb41d98f63cb9fb72cb7c82618be10bc6d52c33Jens Axboe		case VERIFY_PATTERN:
435bfb41d98f63cb9fb72cb7c82618be10bc6d52c33Jens Axboe			ret = verify_io_u_pattern(td->o.verify_pattern,
436bfb41d98f63cb9fb72cb7c82618be10bc6d52c33Jens Axboe			                          td->o.verify_pattern_bytes,
437bfb41d98f63cb9fb72cb7c82618be10bc6d52c33Jens Axboe			                          p + hdr_size,
438bfb41d98f63cb9fb72cb7c82618be10bc6d52c33Jens Axboe			                          hdr_inc - hdr_size,
439bfb41d98f63cb9fb72cb7c82618be10bc6d52c33Jens Axboe			                          hdr_size % 4);
440bfb41d98f63cb9fb72cb7c82618be10bc6d52c33Jens Axboe			if (ret)
441bfb41d98f63cb9fb72cb7c82618be10bc6d52c33Jens Axboe				log_err("fio: verify failed at %llu/%u\n",
442bfb41d98f63cb9fb72cb7c82618be10bc6d52c33Jens Axboe					io_u->offset + hdr_num * hdr->len,
443bfb41d98f63cb9fb72cb7c82618be10bc6d52c33Jens Axboe					hdr->len);
444bfb41d98f63cb9fb72cb7c82618be10bc6d52c33Jens Axboe			break;
4453f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		default:
4463f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			log_err("Bad verify type %u\n", hdr->verify_type);
447d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe			ret = EINVAL;
4483f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		}
4493f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis	}
450a7dfe862c2e3fe72b8db6a6e67302048d3731c6dJens Axboe
451a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe	return ret;
452e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
453e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
4547437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic void fill_meta(struct verify_header *hdr, struct thread_data *td,
4557437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis                      struct io_u *io_u, unsigned int header_num)
4567437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{
4577437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	struct vhdr_meta *vh = hdr_priv(hdr);
4587437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
4597437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->thread = td->thread_number;
4607437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
4617437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->time_sec = io_u->start_time.tv_sec;
4627437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->time_usec = io_u->start_time.tv_usec;
4637437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
4647437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->numberio = td->io_issues[DDIR_WRITE];
4657437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
4667437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->offset = io_u->offset + header_num * td->o.verify_interval;
4677437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis}
4687437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
469cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha512(struct verify_header *hdr, void *p, unsigned int len)
470cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
471546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha512 *vh = hdr_priv(hdr);
472cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha512_ctx sha512_ctx = {
473546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.buf = vh->sha512,
474cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
475cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
476cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha512_init(&sha512_ctx);
477cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha512_update(&sha512_ctx, p, len);
478cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
479cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
480cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha256(struct verify_header *hdr, void *p, unsigned int len)
481cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
482546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha256 *vh = hdr_priv(hdr);
483cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha256_ctx sha256_ctx = {
484546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.buf = vh->sha256,
485cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
486cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
487cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha256_init(&sha256_ctx);
488cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha256_update(&sha256_ctx, p, len);
489cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
490cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
4911e154bdbf14a1d352117aea057035235b66f0381Jens Axboestatic void fill_crc7(struct verify_header *hdr, void *p, unsigned int len)
4921e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{
493546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc7 *vh = hdr_priv(hdr);
494546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
495546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc7 = crc7(p, len);
4961e154bdbf14a1d352117aea057035235b66f0381Jens Axboe}
4971e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
498969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboestatic void fill_crc16(struct verify_header *hdr, void *p, unsigned int len)
499969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{
500546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc16 *vh = hdr_priv(hdr);
501546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
502546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc16 = crc16(p, len);
503969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe}
504969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
505e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_crc32(struct verify_header *hdr, void *p, unsigned int len)
506e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
507546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
508546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
509546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc32 = crc32(p, len);
510e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
511e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
512d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboestatic void fill_crc64(struct verify_header *hdr, void *p, unsigned int len)
513d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{
514546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc64 *vh = hdr_priv(hdr);
515546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
516546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc64 = crc64(p, len);
517d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe}
518d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
519e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_md5(struct verify_header *hdr, void *p, unsigned int len)
520e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
521546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_md5 *vh = hdr_priv(hdr);
5228c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	struct md5_ctx md5_ctx = {
523546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.hash = (uint32_t *) vh->md5_digest,
5248c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	};
525e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
52661f821f16cf27d8742e09b3a137c933cd0085e9bJens Axboe	md5_init(&md5_ctx);
527e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	md5_update(&md5_ctx, p, len);
528e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
529e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
530e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe/*
531e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * fill body of io_u->buf with random data and add a header with the
532e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * crc32 or md5 sum of that data.
533e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe */
534e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboevoid populate_verify_io_u(struct thread_data *td, struct io_u *io_u)
535e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
536baefa9beacca430b8e3275c07d2f46ef14654468Jens Axboe	struct verify_header *hdr;
53795646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe	void *p = io_u->buf, *data;
5387437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	unsigned int hdr_inc, data_len, header_num = 0;
539e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
5409cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe	if (td->o.verify == VERIFY_NULL)
5419cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe		return;
5429cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe
54390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	fill_pattern(td, p, io_u->buflen);
544546a9142511875524850ac92776184fd9fb7196eShawn Lewis
545546a9142511875524850ac92776184fd9fb7196eShawn Lewis	hdr_inc = io_u->buflen;
546a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe	if (td->o.verify_interval)
547a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe		hdr_inc = td->o.verify_interval;
548baefa9beacca430b8e3275c07d2f46ef14654468Jens Axboe
54995646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe	for (;p < io_u->buf + io_u->buflen; p += hdr_inc) {
55095646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe		hdr = p;
5513f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis
5523f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		hdr->fio_magic = FIO_HDR_MAGIC;
5533f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		hdr->verify_type = td->o.verify;
554546a9142511875524850ac92776184fd9fb7196eShawn Lewis		hdr->len = hdr_inc;
5558767783245faac99a7e1c330a1d6536e579c8402Jens Axboe		data_len = hdr_inc - hdr_size(hdr);
5563f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis
5578767783245faac99a7e1c330a1d6536e579c8402Jens Axboe		data = p + hdr_size(hdr);
5583f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		switch (td->o.verify) {
5593f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_MD5:
5603f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			fill_md5(hdr, data, data_len);
5613f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
5623f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC64:
5633f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			fill_crc64(hdr, data, data_len);
5643f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
5653f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC32:
5663f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			fill_crc32(hdr, data, data_len);
5673f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
5683f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC16:
5693f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			fill_crc16(hdr, data, data_len);
5703f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
5713f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC7:
5723f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			fill_crc7(hdr, data, data_len);
5733f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
574cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA256:
575cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			fill_sha256(hdr, data, data_len);
576cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
577cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA512:
578cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			fill_sha512(hdr, data, data_len);
579cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
5807437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		case VERIFY_META:
5817437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis			fill_meta(hdr, td, io_u, header_num);
5827437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis			break;
583bfb41d98f63cb9fb72cb7c82618be10bc6d52c33Jens Axboe		case VERIFY_PATTERN:
584bfb41d98f63cb9fb72cb7c82618be10bc6d52c33Jens Axboe			break;
5853f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		default:
5863f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			log_err("fio: bad verify type: %d\n", td->o.verify);
5873f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			assert(0);
5883f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		}
589a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe		if (td->o.verify_offset)
5908767783245faac99a7e1c330a1d6536e579c8402Jens Axboe			memswp(p, p + td->o.verify_offset, hdr_size(hdr));
5917437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		header_num++;
592e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	}
593e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
594e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
595e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboeint get_next_verify(struct thread_data *td, struct io_u *io_u)
596e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
5978de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	struct io_piece *ipo = NULL;
598e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
599d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	/*
600d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	 * this io_u is from a requeue, we already filled the offsets
601d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	 */
602d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	if (io_u->file)
603d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe		return 0;
604d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe
6058de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	if (!RB_EMPTY_ROOT(&td->io_hist_tree)) {
6068de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe		struct rb_node *n = rb_first(&td->io_hist_tree);
607e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
6088de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe		ipo = rb_entry(n, struct io_piece, rb_node);
6094b87898e8d76aaf05baec83077a11311c1447397Jens Axboe		rb_erase(n, &td->io_hist_tree);
6108de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	} else if (!list_empty(&td->io_hist_list)) {
6118de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe		ipo = list_entry(td->io_hist_list.next, struct io_piece, list);
6128de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe		list_del(&ipo->list);
6138de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	}
614e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
6158de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	if (ipo) {
616e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->offset = ipo->offset;
617e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->buflen = ipo->len;
61836167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->file = ipo->file;
61997af62cec418cd722fb43c6010d6430534e12353Jens Axboe
62097af62cec418cd722fb43c6010d6430534e12353Jens Axboe		if ((io_u->file->flags & FIO_FILE_OPEN) == 0) {
62197af62cec418cd722fb43c6010d6430534e12353Jens Axboe			int r = td_io_open_file(td, io_u->file);
62297af62cec418cd722fb43c6010d6430534e12353Jens Axboe
62397af62cec418cd722fb43c6010d6430534e12353Jens Axboe			if (r)
62497af62cec418cd722fb43c6010d6430534e12353Jens Axboe				return 1;
62597af62cec418cd722fb43c6010d6430534e12353Jens Axboe		}
62697af62cec418cd722fb43c6010d6430534e12353Jens Axboe
62797af62cec418cd722fb43c6010d6430534e12353Jens Axboe		get_file(ipo->file);
62897af62cec418cd722fb43c6010d6430534e12353Jens Axboe		assert(io_u->file->flags & FIO_FILE_OPEN);
629e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->ddir = DDIR_READ;
63036167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->xfer_buf = io_u->buf;
63136167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->xfer_buflen = io_u->buflen;
632e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		free(ipo);
633e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		return 0;
634e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	}
635e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
636e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	return 1;
637e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
638