verify.c revision 7d9fb455aadc0c0363489591775496f27f4a560a
1e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe/*
2e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * IO verification helpers
3e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe */
4e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe#include <unistd.h>
5e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe#include <fcntl.h>
6e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe#include <string.h>
797af62cec418cd722fb43c6010d6430534e12353Jens Axboe#include <assert.h>
8e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe#include <pthread.h>
9e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
10e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe#include "fio.h"
114f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe#include "verify.h"
12e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe#include "smalloc.h"
130d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe#include "trim.h"
14637ef8d9f7645135cf4829894d1e3983cd7a042eJens Axboe#include "lib/rand.h"
15e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
16eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/md5.h"
17eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc64.h"
18eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc32.h"
19bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe#include "crc/crc32c.h"
20eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc16.h"
21eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc7.h"
22eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/sha256.h"
23eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/sha512.h"
247c353ceb3257b132f4c98326046b42201e070731Jens Axboe#include "crc/sha1.h"
25cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
267d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void populate_hdr(struct thread_data *td, struct io_u *io_u,
277d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			 struct verify_header *hdr, unsigned int header_num,
287d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			 unsigned int header_len);
297d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
307d9fb455aadc0c0363489591775496f27f4a560aJens Axboevoid fill_pattern(struct thread_data *td, void *p, unsigned int len, struct io_u *io_u, unsigned long seed, int use_seed)
3190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe{
3290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	switch (td->o.verify_pattern_bytes) {
3390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	case 0:
34bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "fill random bytes len=%u\n", len);
357d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		if (use_seed)
367d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			__fill_random_buf(p, len, seed);
377d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		else
387d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			io_u->rand_seed = fill_random_buf(p, len);
3990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		break;
4090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	case 1:
4110e8a7b30ce2917df9f839d42596c7e3af9a904fRadha Ramachandran		if (io_u->buf_filled_len >= len) {
42cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran			dprint(FD_VERIFY, "using already filled verify pattern b=0 len=%u\n", len);
43cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran			return;
44cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran		}
45bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "fill verify pattern b=0 len=%u\n", len);
460e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran		memset(p, td->o.verify_pattern[0], len);
47cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran		io_u->buf_filled_len = len;
4890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		break;
490e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran	default: {
500e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran		unsigned int i = 0, size = 0;
5190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		unsigned char *b = p;
5290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe
5310e8a7b30ce2917df9f839d42596c7e3af9a904fRadha Ramachandran		if (io_u->buf_filled_len >= len) {
54cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran			dprint(FD_VERIFY, "using already filled verify pattern b=%d len=%u\n",
55cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran					td->o.verify_pattern_bytes, len);
56cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran			return;
57cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran		}
58bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "fill verify pattern b=%d len=%u\n",
59bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe					td->o.verify_pattern_bytes, len);
60bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
6190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		while (i < len) {
620e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran			size = td->o.verify_pattern_bytes;
630e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran			if (size > (len - i))
640e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran				size = len - i;
650e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran			memcpy(b+i, td->o.verify_pattern, size);
660e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran			i += size;
6790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		}
68cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran		io_u->buf_filled_len = len;
6990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		break;
7090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe		}
7190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe	}
7290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe}
7390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe
744764aec9fe5988281bdc114c13ac771fb16713ccJens Axboestatic void memswp(void *buf1, void *buf2, unsigned int len)
75546a9142511875524850ac92776184fd9fb7196eShawn Lewis{
76dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis	char swap[200];
77dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis
78dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis	assert(len <= sizeof(swap));
7990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe
80546a9142511875524850ac92776184fd9fb7196eShawn Lewis	memcpy(&swap, buf1, len);
81546a9142511875524850ac92776184fd9fb7196eShawn Lewis	memcpy(buf1, buf2, len);
82546a9142511875524850ac92776184fd9fb7196eShawn Lewis	memcpy(buf2, &swap, len);
83546a9142511875524850ac92776184fd9fb7196eShawn Lewis}
84546a9142511875524850ac92776184fd9fb7196eShawn Lewis
85e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void hexdump(void *buffer, int len)
86e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
87e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	unsigned char *p = buffer;
88e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	int i;
89e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
90e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	for (i = 0; i < len; i++)
91bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		log_err("%02x", p[i]);
92bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_err("\n");
93e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
94e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
95d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe/*
968767783245faac99a7e1c330a1d6536e579c8402Jens Axboe * Prepare for seperation of verify_header and checksum header
978767783245faac99a7e1c330a1d6536e579c8402Jens Axboe */
98546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic inline unsigned int __hdr_size(int verify_type)
998767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{
10003e20d687566753b90383571e5e152c5142bdffdBruce Cran	unsigned int len = 0;
1018767783245faac99a7e1c330a1d6536e579c8402Jens Axboe
102546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	switch (verify_type) {
103546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_NONE:
104546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_NULL:
105546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = 0;
106546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
107546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_MD5:
108546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_md5);
109546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
110546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC64:
111546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc64);
112546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
113bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	case VERIFY_CRC32C:
114546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC32:
1153845591fadea480177223e28c9d1c03642d34f0eJens Axboe	case VERIFY_CRC32C_INTEL:
116546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc32);
117546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
118546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC16:
119546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc16);
120546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
121546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_CRC7:
122546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_crc7);
123546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
124546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_SHA256:
125546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_sha256);
126546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
127546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	case VERIFY_SHA512:
128546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		len = sizeof(struct vhdr_sha512);
129546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		break;
1307437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	case VERIFY_META:
1317437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		len = sizeof(struct vhdr_meta);
1327437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		break;
1337c353ceb3257b132f4c98326046b42201e070731Jens Axboe	case VERIFY_SHA1:
1347c353ceb3257b132f4c98326046b42201e070731Jens Axboe		len = sizeof(struct vhdr_sha1);
1357c353ceb3257b132f4c98326046b42201e070731Jens Axboe		break;
136546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	default:
137546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		log_err("fio: unknown verify header!\n");
138546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		assert(0);
139546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	}
140546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
141546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	return len + sizeof(struct verify_header);
1428767783245faac99a7e1c330a1d6536e579c8402Jens Axboe}
1438767783245faac99a7e1c330a1d6536e579c8402Jens Axboe
1448767783245faac99a7e1c330a1d6536e579c8402Jens Axboestatic inline unsigned int hdr_size(struct verify_header *hdr)
1458767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{
146546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	return __hdr_size(hdr->verify_type);
147546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe}
148546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
149546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic void *hdr_priv(struct verify_header *hdr)
150546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe{
151546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	void *priv = hdr;
152546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
153546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	return priv + sizeof(struct verify_header);
1548767783245faac99a7e1c330a1d6536e579c8402Jens Axboe}
1558767783245faac99a7e1c330a1d6536e579c8402Jens Axboe
1568767783245faac99a7e1c330a1d6536e579c8402Jens Axboe/*
157936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * Verify container, pass info to verify handlers and allow them to
158936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * pass info back in case of error
159936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe */
160936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestruct vcont {
161936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	/*
162936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	 * Input
163936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	 */
164936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	struct io_u *io_u;
165936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	unsigned int hdr_num;
1667d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	struct thread_data *td;
167936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe
168936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	/*
169936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	 * Output, only valid in case of error
170936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	 */
171bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	const char *name;
172bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	void *good_crc;
173bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	void *bad_crc;
174936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	unsigned int crc_len;
175936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe};
176936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe
1777d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void dump_buf(char *buf, unsigned int len, const char *name,
1787d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		     unsigned long long offset)
1797d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{
1807d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	char fname[80];
1817d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	int ret, fd;
1827d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
1837d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	sprintf(fname, "%llu.%s", offset, name);
1847d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
1857d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	fd = open(fname, O_CREAT | O_TRUNC | O_WRONLY, 0644);
1867d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	if (fd < 0) {
1877d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		perror("open verify buf file");
1887d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		return;
1897d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	}
1907d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
1917d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	while (len) {
1927d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		ret = write(fd, buf, len);
1937d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		if (!ret)
1947d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			break;
1957d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		else if (ret < 0) {
1967d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			perror("write verify buf file");
1977d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			break;
1987d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		}
1997d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		len -= ret;
2007d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		buf += ret;
2017d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	}
2027d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2037d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	close(fd);
2047d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	log_err("       %s data dumped as %s\n", name, fname);
2057d9fb455aadc0c0363489591775496f27f4a560aJens Axboe}
2067d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2077d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void dump_verify_buffers(struct verify_header *hdr, struct vcont *vc)
2087d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{
2097d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	struct thread_data *td = vc->td;
2107d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	struct io_u *io_u = vc->io_u;
2117d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	unsigned long hdr_offset;
2127d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	unsigned int hdr_inc, header_num;
2137d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	struct io_u dummy;
2147d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	void *buf, *p;
2157d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2167d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	hdr_offset = vc->hdr_num * hdr->len;
2177d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2187d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	dump_buf(io_u->buf + hdr_offset, hdr->len, "received",
2197d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			io_u->offset + hdr_offset);
2207d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2217d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	buf = p = malloc(io_u->buflen);
2227d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	dummy = *io_u;
2237d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	fill_pattern(td, p, io_u->buflen, &dummy, hdr->rand_seed, 1);
2247d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2257d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	hdr_inc = io_u->buflen;
2267d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	if (td->o.verify_interval)
2277d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		hdr_inc = td->o.verify_interval;
2287d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2297d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	header_num = 0;
2307d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	for (; p < buf + io_u->buflen; p += hdr_inc) {
2317d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		hdr = p;
2327d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		populate_hdr(td, io_u, hdr, header_num, hdr_inc);
2337d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		header_num++;
2347d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	}
2357d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2367d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	dump_buf(buf + hdr_offset, hdr->len, "expected",
2377d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			io_u->offset + hdr_offset);
2387d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	free(buf);
2397d9fb455aadc0c0363489591775496f27f4a560aJens Axboe}
2407d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
241bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboestatic void log_verify_failure(struct verify_header *hdr, struct vcont *vc)
242bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe{
243bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	unsigned long long offset;
244bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe
245bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	offset = vc->io_u->offset;
246bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	offset += vc->hdr_num * hdr->len;
24732c17adf7f75da1f0957d4691633fea60259910fJens Axboe	log_err("%.8s: verify failed at file %s offset %llu, length %u\n",
24832c17adf7f75da1f0957d4691633fea60259910fJens Axboe			vc->name, vc->io_u->file->file_name, offset, hdr->len);
249bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe
250bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (vc->good_crc && vc->bad_crc) {
251bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		log_err("       Expected CRC: ");
252bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		hexdump(vc->good_crc, vc->crc_len);
253bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		log_err("       Received CRC: ");
254bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		hexdump(vc->bad_crc, vc->crc_len);
255bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	}
2567d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
2577d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	dump_verify_buffers(hdr, vc);
258bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe}
259bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe
260936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe/*
261d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe * Return data area 'header_num'
262d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe */
263936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic inline void *io_u_verify_off(struct verify_header *hdr, struct vcont *vc)
264d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe{
265936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	return vc->io_u->buf + vc->hdr_num * hdr->len + hdr_size(hdr);
266d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe}
267d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe
2687437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic int verify_io_u_meta(struct verify_header *hdr, struct thread_data *td,
269936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			    struct vcont *vc)
2707437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{
2717437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	struct vhdr_meta *vh = hdr_priv(hdr);
272936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	struct io_u *io_u = vc->io_u;
2737437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
274bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "meta verify io_u %p, len %u\n", io_u, hdr->len);
275bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
276bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (vh->offset == io_u->offset + vc->hdr_num * td->o.verify_interval)
277bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
2787437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
279bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "meta";
280bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
281bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
2827437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis}
2837437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
284936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha512(struct verify_header *hdr, struct vcont *vc)
285cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
286936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
287546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha512 *vh = hdr_priv(hdr);
288cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	uint8_t sha512[128];
289cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha512_ctx sha512_ctx = {
290cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		.buf = sha512,
291cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
292cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
293936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "sha512 verify io_u %p, len %u\n", vc->io_u, hdr->len);
294bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
295cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha512_init(&sha512_ctx);
2968767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	sha512_update(&sha512_ctx, p, hdr->len - hdr_size(hdr));
297cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
298bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (!memcmp(vh->sha512, sha512_ctx.buf, sizeof(sha512)))
299bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
300cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
301bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "sha512";
302bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = vh->sha512;
303bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = sha512_ctx.buf;
304bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = sizeof(vh->sha512);
305bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
306bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
307cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
308cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
309936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha256(struct verify_header *hdr, struct vcont *vc)
310cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
311936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
312546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha256 *vh = hdr_priv(hdr);
313bc77f56f79f6ae155e9eb26263ed686ef28b47ecJens Axboe	uint8_t sha256[64];
314cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha256_ctx sha256_ctx = {
315cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		.buf = sha256,
316cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
317cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
318936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "sha256 verify io_u %p, len %u\n", vc->io_u, hdr->len);
319bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
320cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha256_init(&sha256_ctx);
3218767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	sha256_update(&sha256_ctx, p, hdr->len - hdr_size(hdr));
322cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
323bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (!memcmp(vh->sha256, sha256_ctx.buf, sizeof(sha256)))
324bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
325cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
326bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "sha256";
327bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = vh->sha256;
328bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = sha256_ctx.buf;
329bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = sizeof(vh->sha256);
330bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
331bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
332cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
333cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
334936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha1(struct verify_header *hdr, struct vcont *vc)
3357c353ceb3257b132f4c98326046b42201e070731Jens Axboe{
336936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
3377c353ceb3257b132f4c98326046b42201e070731Jens Axboe	struct vhdr_sha1 *vh = hdr_priv(hdr);
3387c353ceb3257b132f4c98326046b42201e070731Jens Axboe	uint32_t sha1[5];
3397c353ceb3257b132f4c98326046b42201e070731Jens Axboe	struct sha1_ctx sha1_ctx = {
3407c353ceb3257b132f4c98326046b42201e070731Jens Axboe		.H = sha1,
3417c353ceb3257b132f4c98326046b42201e070731Jens Axboe	};
3427c353ceb3257b132f4c98326046b42201e070731Jens Axboe
343936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "sha1 verify io_u %p, len %u\n", vc->io_u, hdr->len);
3447c353ceb3257b132f4c98326046b42201e070731Jens Axboe
3457c353ceb3257b132f4c98326046b42201e070731Jens Axboe	sha1_init(&sha1_ctx);
3467c353ceb3257b132f4c98326046b42201e070731Jens Axboe	sha1_update(&sha1_ctx, p, hdr->len - hdr_size(hdr));
3477c353ceb3257b132f4c98326046b42201e070731Jens Axboe
348bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (!memcmp(vh->sha1, sha1_ctx.H, sizeof(sha1)))
349bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
3507c353ceb3257b132f4c98326046b42201e070731Jens Axboe
351bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "sha1";
352bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = vh->sha1;
353bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = sha1_ctx.H;
354bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = sizeof(vh->sha1);
355bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
356bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
3577c353ceb3257b132f4c98326046b42201e070731Jens Axboe}
3587c353ceb3257b132f4c98326046b42201e070731Jens Axboe
359936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc7(struct verify_header *hdr, struct vcont *vc)
3601e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{
361936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
362546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc7 *vh = hdr_priv(hdr);
3631e154bdbf14a1d352117aea057035235b66f0381Jens Axboe	unsigned char c;
3641e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
365936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc7 verify io_u %p, len %u\n", vc->io_u, hdr->len);
366bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
3678767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc7(p, hdr->len - hdr_size(hdr));
3681e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
369bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc7)
370bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
3711e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
372bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc7";
373bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc7;
374bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
375bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 1;
376bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
377bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
3781e154bdbf14a1d352117aea057035235b66f0381Jens Axboe}
3791e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
380936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc16(struct verify_header *hdr, struct vcont *vc)
381969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{
382936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
383546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc16 *vh = hdr_priv(hdr);
384969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe	unsigned short c;
385969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
386936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc16 verify io_u %p, len %u\n", vc->io_u, hdr->len);
387bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
3888767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc16(p, hdr->len - hdr_size(hdr));
389969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
390bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc16)
391bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
392969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
393bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc16";
394bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc16;
395bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
396bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 2;
397bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
398bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
399969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe}
400969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
401936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc64(struct verify_header *hdr, struct vcont *vc)
402d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{
403936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
404546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc64 *vh = hdr_priv(hdr);
405d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe	unsigned long long c;
406d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
407936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc64 verify io_u %p, len %u\n", vc->io_u, hdr->len);
408bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
4098767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc64(p, hdr->len - hdr_size(hdr));
410d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
411bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc64)
412bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
413d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
414bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc64";
415bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc64;
416bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
417bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 8;
418bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
419bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
420d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe}
421d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
422936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc32(struct verify_header *hdr, struct vcont *vc)
423e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
424936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
425546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
426546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	uint32_t c;
427e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
428936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc32 verify io_u %p, len %u\n", vc->io_u, hdr->len);
429bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
4308767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	c = crc32(p, hdr->len - hdr_size(hdr));
431e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
432bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc32)
433bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
434e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
435bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc32";
436bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc32;
437bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
438bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 4;
439bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
440bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
441e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
442e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
443936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc32c(struct verify_header *hdr, struct vcont *vc)
444bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{
445936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
446bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
447bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	uint32_t c;
448bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
449936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "crc32c verify io_u %p, len %u\n", vc->io_u, hdr->len);
450bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
4513845591fadea480177223e28c9d1c03642d34f0eJens Axboe	if (hdr->verify_type == VERIFY_CRC32C_INTEL)
4523845591fadea480177223e28c9d1c03642d34f0eJens Axboe		c = crc32c_intel(p, hdr->len - hdr_size(hdr));
4533845591fadea480177223e28c9d1c03642d34f0eJens Axboe	else
4543845591fadea480177223e28c9d1c03642d34f0eJens Axboe		c = crc32c(p, hdr->len - hdr_size(hdr));
455bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
456bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (c == vh->crc32)
457bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
458bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
459bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "crc32c";
460bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = &vh->crc32;
461bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = &c;
462bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = 4;
463bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
464bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
465bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe}
466bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
467936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_md5(struct verify_header *hdr, struct vcont *vc)
468e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
469936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	void *p = io_u_verify_off(hdr, vc);
470546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_md5 *vh = hdr_priv(hdr);
4718c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	uint32_t hash[MD5_HASH_WORDS];
4728c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	struct md5_ctx md5_ctx = {
4738c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe		.hash = hash,
4748c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	};
475e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
476936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe	dprint(FD_VERIFY, "md5 verify io_u %p, len %u\n", vc->io_u, hdr->len);
477bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe
47861f821f16cf27d8742e09b3a137c933cd0085e9bJens Axboe	md5_init(&md5_ctx);
4798767783245faac99a7e1c330a1d6536e579c8402Jens Axboe	md5_update(&md5_ctx, p, hdr->len - hdr_size(hdr));
480e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
481bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	if (!memcmp(vh->md5_digest, md5_ctx.hash, sizeof(hash)))
482bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		return 0;
483e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
484bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->name = "md5";
485bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->good_crc = vh->md5_digest;
486bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->bad_crc = md5_ctx.hash;
487bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	vc->crc_len = sizeof(hash);
488bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	log_verify_failure(hdr, vc);
489bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe	return EILSEQ;
490e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
491e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
4923f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboestatic unsigned int hweight8(unsigned int w)
4933f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe{
4943f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe	unsigned int res = w - ((w >> 1) & 0x55);
4953f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
4963f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe	res = (res & 0x33) + ((res >> 2) & 0x33);
4973f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe	return (res + (res >> 4)) & 0x0F;
4983f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe}
4993f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
5000e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandranint verify_io_u_pattern(char *pattern, unsigned long pattern_size,
5015ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe			char *buf, unsigned int len, unsigned int mod)
502a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis{
503a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	unsigned int i;
504a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis
505a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	for (i = 0; i < len; i++) {
5060e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran		if (buf[i] != pattern[mod]) {
5073f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe			unsigned int bits;
5083f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
5090e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran			bits = hweight8(buf[i] ^ pattern[mod]);
5103f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe			log_err("fio: got pattern %x, wanted %x. Bad bits %d\n",
5110e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran				buf[i], pattern[mod], bits);
5123f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe			log_err("fio: bad pattern block offset %u\n", i);
5139fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe			return EILSEQ;
5143f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe		}
515a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis		mod++;
516a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis		if (mod == pattern_size)
517a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis			mod = 0;
518a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	}
519a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis
520a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	return 0;
521a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis}
522a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis
523e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe/*
524e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe * Push IO verification to a separate thread
525e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe */
526e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_io_u_async(struct thread_data *td, struct io_u *io_u)
527e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
528e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	if (io_u->file)
529e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		put_file_log(td, io_u->file);
530e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
531e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	io_u->file = NULL;
532e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
533e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_lock(&td->io_u_lock);
5340c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran
5350c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran	if (io_u->flags & IO_U_F_IN_CUR_DEPTH) {
5360c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran		td->cur_depth--;
5370c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran		io_u->flags &= ~IO_U_F_IN_CUR_DEPTH;
5380c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran	}
539e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	flist_del(&io_u->list);
540e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	flist_add_tail(&io_u->list, &td->verify_list);
5412ecc1b57721e3cb72bbf558bc169c97037fe3d0aJens Axboe	io_u->flags |= IO_U_F_FREE_DEF;
542e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_unlock(&td->io_u_lock);
543e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
544e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_cond_signal(&td->verify_cond);
545e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	return 0;
546e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
547e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
5480d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboestatic int verify_trimmed_io_u(struct thread_data *td, struct io_u *io_u)
5490d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe{
5500d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	static char zero_buf[1024];
5510d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	unsigned int this_len, len;
5520d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	int ret = 0;
5530d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	void *p;
5540d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
5550d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	if (!td->o.trim_zero)
5560d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		return 0;
5570d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
5580d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	len = io_u->buflen;
5590d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	p = io_u->buf;
5600d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	do {
5610d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		this_len = sizeof(zero_buf);
5620d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		if (this_len > len)
5630d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe			this_len = len;
5640d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		if (memcmp(p, zero_buf, this_len)) {
5650d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe			ret = EILSEQ;
5660d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe			break;
5670d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		}
5680d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		len -= this_len;
5690d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		p += this_len;
5700d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	} while (len);
5710d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
5720d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	if (!ret)
5730d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		return 0;
5740d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
575a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe	log_err("trim: verify failed at file %s offset %llu, length %lu"
576a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		", block offset %lu\n",
577a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe			io_u->file->file_name, io_u->offset, io_u->buflen,
5782f68124f26e54233db41b462a257dabc48e5c32bJens Axboe			(unsigned long) (p - io_u->buf));
5790d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	return ret;
5800d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe}
5810d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
58236690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboeint verify_io_u(struct thread_data *td, struct io_u *io_u)
583e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
5843f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis	struct verify_header *hdr;
585a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis	unsigned int hdr_size, hdr_inc, hdr_num = 0;
58695646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe	void *p;
587e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	int ret;
588e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
5891dcc049824b840df1ee0ef5d019fffa4037e1bb0Shawn Lewis	if (td->o.verify == VERIFY_NULL || io_u->ddir != DDIR_READ)
59036690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe		return 0;
5910d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	if (io_u->flags & IO_U_F_TRIMMED) {
5920d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		ret = verify_trimmed_io_u(td, io_u);
5930d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		goto done;
5940d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	}
59536690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe
5963f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis	hdr_inc = io_u->buflen;
597a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe	if (td->o.verify_interval)
598a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe		hdr_inc = td->o.verify_interval;
599e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
600a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe	ret = 0;
6015ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	for (p = io_u->buf; p < io_u->buf + io_u->buflen;
6025ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	     p += hdr_inc, hdr_num++) {
603bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		struct vcont vc = {
604bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe			.io_u		= io_u,
605bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe			.hdr_num	= hdr_num,
6067d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			.td		= td,
607bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe		};
608936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe
609f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe		if (ret && td->o.verify_fatal)
610a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe			break;
611f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe
612a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis		hdr_size = __hdr_size(td->o.verify);
613a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe		if (td->o.verify_offset)
614a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis			memswp(p, p + td->o.verify_offset, hdr_size);
61595646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe		hdr = p;
616e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
6173f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe		if (hdr->fio_magic != FIO_HDR_MAGIC) {
618c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe			log_err("verify: bad magic header %x, wanted %x at file %s offset %llu, length %u\n",
619c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe				hdr->fio_magic, FIO_HDR_MAGIC,
620c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe				io_u->file->file_name,
621c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe				io_u->offset + hdr_num * hdr->len, hdr->len);
6229fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe			return EILSEQ;
6233f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe		}
6243f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe
625e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis		if (td->o.verify_pattern_bytes) {
626bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			dprint(FD_VERIFY, "pattern verify io_u %p, len %u\n",
627bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe								io_u, hdr->len);
628e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis			ret = verify_io_u_pattern(td->o.verify_pattern,
6290e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran				  td->o.verify_pattern_bytes,
6300e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran				  p + hdr_size,
6310e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran				  hdr_inc - hdr_size,
6320e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran				  hdr_size % td->o.verify_pattern_bytes);
633c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe
634c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe			if (ret) {
635c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe				log_err("pattern: verify failed at file %s offset %llu, length %u\n",
636c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe					io_u->file->file_name,
637c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe					io_u->offset + hdr_num * hdr->len,
638c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe					hdr->len);
639c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe			}
640c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe
641e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran			/*
642e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran			 * Also verify the meta data, if applicable
643e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran			 */
644e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran			if (hdr->verify_type == VERIFY_META)
645936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe				ret |= verify_io_u_meta(hdr, td, &vc);
646e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis			continue;
647e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis		}
648e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis
6493f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		switch (hdr->verify_type) {
6503f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_MD5:
651936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_md5(hdr, &vc);
6523f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
6533f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC64:
654936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc64(hdr, &vc);
6553f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
656bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe		case VERIFY_CRC32C:
6573845591fadea480177223e28c9d1c03642d34f0eJens Axboe		case VERIFY_CRC32C_INTEL:
658936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc32c(hdr, &vc);
659bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe			break;
6603f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC32:
661936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc32(hdr, &vc);
6623f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
6633f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC16:
664936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc16(hdr, &vc);
6653f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
6663f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		case VERIFY_CRC7:
667936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_crc7(hdr, &vc);
6683f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			break;
669cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA256:
670936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_sha256(hdr, &vc);
671cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
672cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe		case VERIFY_SHA512:
673936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_sha512(hdr, &vc);
674cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe			break;
6757437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		case VERIFY_META:
676936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_meta(hdr, td, &vc);
6777437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis			break;
6787c353ceb3257b132f4c98326046b42201e070731Jens Axboe		case VERIFY_SHA1:
679936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe			ret = verify_io_u_sha1(hdr, &vc);
6807c353ceb3257b132f4c98326046b42201e070731Jens Axboe			break;
6813f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		default:
6823f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis			log_err("Bad verify type %u\n", hdr->verify_type);
683d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe			ret = EINVAL;
6843f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis		}
6853f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis	}
686a7dfe862c2e3fe72b8db6a6e67302048d3731c6dJens Axboe
6870d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboedone:
688f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe	if (ret && td->o.verify_fatal)
689f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe		td->terminate = 1;
690f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe
691a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe	return ret;
692e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
693e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
6947437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic void fill_meta(struct verify_header *hdr, struct thread_data *td,
6955ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe		      struct io_u *io_u, unsigned int header_num)
6967437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{
6977437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	struct vhdr_meta *vh = hdr_priv(hdr);
6987437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
6997437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->thread = td->thread_number;
7007437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
7017437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->time_sec = io_u->start_time.tv_sec;
7027437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->time_usec = io_u->start_time.tv_usec;
7037437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
7047437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->numberio = td->io_issues[DDIR_WRITE];
7057437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
7067437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis	vh->offset = io_u->offset + header_num * td->o.verify_interval;
7077437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis}
7087437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis
709cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha512(struct verify_header *hdr, void *p, unsigned int len)
710cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
711546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha512 *vh = hdr_priv(hdr);
712cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha512_ctx sha512_ctx = {
713546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.buf = vh->sha512,
714cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
715cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
716cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha512_init(&sha512_ctx);
717cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha512_update(&sha512_ctx, p, len);
718cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
719cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
720cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha256(struct verify_header *hdr, void *p, unsigned int len)
721cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{
722546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_sha256 *vh = hdr_priv(hdr);
723cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	struct sha256_ctx sha256_ctx = {
724546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.buf = vh->sha256,
725cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	};
726cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
727cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha256_init(&sha256_ctx);
728cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe	sha256_update(&sha256_ctx, p, len);
729cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe}
730cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe
7317c353ceb3257b132f4c98326046b42201e070731Jens Axboestatic void fill_sha1(struct verify_header *hdr, void *p, unsigned int len)
7327c353ceb3257b132f4c98326046b42201e070731Jens Axboe{
7337c353ceb3257b132f4c98326046b42201e070731Jens Axboe	struct vhdr_sha1 *vh = hdr_priv(hdr);
7347c353ceb3257b132f4c98326046b42201e070731Jens Axboe	struct sha1_ctx sha1_ctx = {
7357c353ceb3257b132f4c98326046b42201e070731Jens Axboe		.H = vh->sha1,
7367c353ceb3257b132f4c98326046b42201e070731Jens Axboe	};
7377c353ceb3257b132f4c98326046b42201e070731Jens Axboe
7387c353ceb3257b132f4c98326046b42201e070731Jens Axboe	sha1_init(&sha1_ctx);
7397c353ceb3257b132f4c98326046b42201e070731Jens Axboe	sha1_update(&sha1_ctx, p, len);
7407c353ceb3257b132f4c98326046b42201e070731Jens Axboe}
7417c353ceb3257b132f4c98326046b42201e070731Jens Axboe
7421e154bdbf14a1d352117aea057035235b66f0381Jens Axboestatic void fill_crc7(struct verify_header *hdr, void *p, unsigned int len)
7431e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{
744546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc7 *vh = hdr_priv(hdr);
745546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
746546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc7 = crc7(p, len);
7471e154bdbf14a1d352117aea057035235b66f0381Jens Axboe}
7481e154bdbf14a1d352117aea057035235b66f0381Jens Axboe
749969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboestatic void fill_crc16(struct verify_header *hdr, void *p, unsigned int len)
750969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{
751546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc16 *vh = hdr_priv(hdr);
752546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
753546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc16 = crc16(p, len);
754969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe}
755969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe
756e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_crc32(struct verify_header *hdr, void *p, unsigned int len)
757e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
758546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
759546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
760546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc32 = crc32(p, len);
761e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
762e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
763bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboestatic void fill_crc32c(struct verify_header *hdr, void *p, unsigned int len)
764bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{
765bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe	struct vhdr_crc32 *vh = hdr_priv(hdr);
766bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
7673845591fadea480177223e28c9d1c03642d34f0eJens Axboe	if (hdr->verify_type == VERIFY_CRC32C_INTEL)
7683845591fadea480177223e28c9d1c03642d34f0eJens Axboe		vh->crc32 = crc32c_intel(p, len);
7693845591fadea480177223e28c9d1c03642d34f0eJens Axboe	else
7703845591fadea480177223e28c9d1c03642d34f0eJens Axboe		vh->crc32 = crc32c(p, len);
771bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe}
772bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe
773d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboestatic void fill_crc64(struct verify_header *hdr, void *p, unsigned int len)
774d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{
775546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_crc64 *vh = hdr_priv(hdr);
776546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe
777546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	vh->crc64 = crc64(p, len);
778d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe}
779d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe
780e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_md5(struct verify_header *hdr, void *p, unsigned int len)
781e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
782546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe	struct vhdr_md5 *vh = hdr_priv(hdr);
7838c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	struct md5_ctx md5_ctx = {
784546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe		.hash = (uint32_t *) vh->md5_digest,
7858c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe	};
786e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
78761f821f16cf27d8742e09b3a137c933cd0085e9bJens Axboe	md5_init(&md5_ctx);
788e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	md5_update(&md5_ctx, p, len);
789e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
790e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
7917d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void populate_hdr(struct thread_data *td, struct io_u *io_u,
7927d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			 struct verify_header *hdr, unsigned int header_num,
7937d9fb455aadc0c0363489591775496f27f4a560aJens Axboe			 unsigned int header_len)
7947d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{
7957d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	unsigned int data_len;
7967d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	void *data, *p;
7977d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
7987d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	p = (void *) hdr;
7997d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
8007d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	hdr->fio_magic = FIO_HDR_MAGIC;
8017d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	hdr->len = header_len;
8027d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	hdr->verify_type = td->o.verify;
8037d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	hdr->rand_seed = io_u->rand_seed;
8047d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	data_len = header_len - hdr_size(hdr);
8057d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
8067d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	data = p + hdr_size(hdr);
8077d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	switch (td->o.verify) {
8087d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_MD5:
8097d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill md5 io_u %p, len %u\n",
8107d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8117d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_md5(hdr, data, data_len);
8127d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8137d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC64:
8147d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc64 io_u %p, len %u\n",
8157d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8167d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc64(hdr, data, data_len);
8177d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8187d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC32C:
8197d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC32C_INTEL:
8207d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc32c io_u %p, len %u\n",
8217d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8227d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc32c(hdr, data, data_len);
8237d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8247d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC32:
8257d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc32 io_u %p, len %u\n",
8267d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8277d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc32(hdr, data, data_len);
8287d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8297d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC16:
8307d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc16 io_u %p, len %u\n",
8317d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8327d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc16(hdr, data, data_len);
8337d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8347d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_CRC7:
8357d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill crc7 io_u %p, len %u\n",
8367d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8377d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_crc7(hdr, data, data_len);
8387d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8397d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_SHA256:
8407d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill sha256 io_u %p, len %u\n",
8417d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8427d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_sha256(hdr, data, data_len);
8437d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8447d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_SHA512:
8457d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill sha512 io_u %p, len %u\n",
8467d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8477d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_sha512(hdr, data, data_len);
8487d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8497d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_META:
8507d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill meta io_u %p, len %u\n",
8517d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8527d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_meta(hdr, td, io_u, header_num);
8537d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8547d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	case VERIFY_SHA1:
8557d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		dprint(FD_VERIFY, "fill sha1 io_u %p, len %u\n",
8567d9fb455aadc0c0363489591775496f27f4a560aJens Axboe						io_u, hdr->len);
8577d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		fill_sha1(hdr, data, data_len);
8587d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		break;
8597d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	default:
8607d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		log_err("fio: bad verify type: %d\n", td->o.verify);
8617d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		assert(0);
8627d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	}
8637d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	if (td->o.verify_offset)
8647d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		memswp(p, p + td->o.verify_offset, hdr_size(hdr));
8657d9fb455aadc0c0363489591775496f27f4a560aJens Axboe}
8667d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
867e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe/*
868e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * fill body of io_u->buf with random data and add a header with the
869e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * crc32 or md5 sum of that data.
870e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe */
871e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboevoid populate_verify_io_u(struct thread_data *td, struct io_u *io_u)
872e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
873baefa9beacca430b8e3275c07d2f46ef14654468Jens Axboe	struct verify_header *hdr;
8747d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	unsigned int hdr_inc, header_num = 0;
8757d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	void *p = io_u->buf;
876e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
8779cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe	if (td->o.verify == VERIFY_NULL)
8789cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe		return;
8799cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe
8807d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	fill_pattern(td, p, io_u->buflen, io_u, 0, 0);
881546a9142511875524850ac92776184fd9fb7196eShawn Lewis
882546a9142511875524850ac92776184fd9fb7196eShawn Lewis	hdr_inc = io_u->buflen;
883a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe	if (td->o.verify_interval)
884a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe		hdr_inc = td->o.verify_interval;
885baefa9beacca430b8e3275c07d2f46ef14654468Jens Axboe
8865ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe	for (; p < io_u->buf + io_u->buflen; p += hdr_inc) {
88795646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe		hdr = p;
8887d9fb455aadc0c0363489591775496f27f4a560aJens Axboe		populate_hdr(td, io_u, hdr, header_num, hdr_inc);
8897437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis		header_num++;
890e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	}
891e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
892e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
893e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboeint get_next_verify(struct thread_data *td, struct io_u *io_u)
894e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{
8958de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	struct io_piece *ipo = NULL;
896e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
897d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	/*
898d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	 * this io_u is from a requeue, we already filled the offsets
899d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	 */
900d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe	if (io_u->file)
901d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe		return 0;
902d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe
9038de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	if (!RB_EMPTY_ROOT(&td->io_hist_tree)) {
9048de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe		struct rb_node *n = rb_first(&td->io_hist_tree);
905e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
9068de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe		ipo = rb_entry(n, struct io_piece, rb_node);
9074b87898e8d76aaf05baec83077a11311c1447397Jens Axboe		rb_erase(n, &td->io_hist_tree);
908a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		assert(ipo->flags & IP_F_ONRB);
909a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		ipo->flags &= ~IP_F_ONRB;
91001743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe	} else if (!flist_empty(&td->io_hist_list)) {
91101743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe		ipo = flist_entry(td->io_hist_list.next, struct io_piece, list);
91201743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe		flist_del(&ipo->list);
913a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		assert(ipo->flags & IP_F_ONLIST);
914a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe		ipo->flags &= ~IP_F_ONLIST;
9158de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	}
916e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
9178de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe	if (ipo) {
9180d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		td->io_hist_len--;
9190d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
920e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->offset = ipo->offset;
921e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->buflen = ipo->len;
92236167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->file = ipo->file;
92397af62cec418cd722fb43c6010d6430534e12353Jens Axboe
9240d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		if (ipo->flags & IP_F_TRIMMED)
9250d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe			io_u->flags |= IO_U_F_TRIMMED;
9260d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
927d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe		if (!fio_file_open(io_u->file)) {
92897af62cec418cd722fb43c6010d6430534e12353Jens Axboe			int r = td_io_open_file(td, io_u->file);
92997af62cec418cd722fb43c6010d6430534e12353Jens Axboe
930bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			if (r) {
931bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe				dprint(FD_VERIFY, "failed file %s open\n",
932bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe						io_u->file->file_name);
93397af62cec418cd722fb43c6010d6430534e12353Jens Axboe				return 1;
934bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe			}
93597af62cec418cd722fb43c6010d6430534e12353Jens Axboe		}
93697af62cec418cd722fb43c6010d6430534e12353Jens Axboe
93797af62cec418cd722fb43c6010d6430534e12353Jens Axboe		get_file(ipo->file);
938d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe		assert(fio_file_open(io_u->file));
939e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		io_u->ddir = DDIR_READ;
94036167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->xfer_buf = io_u->buf;
94136167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		io_u->xfer_buflen = io_u->buflen;
9420d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe
9430d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe		remove_trim_entry(td, ipo);
944e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		free(ipo);
945bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe		dprint(FD_VERIFY, "get_next_verify: ret io_u %p\n", io_u);
946e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe		return 0;
947e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	}
948e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe
949bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe	dprint(FD_VERIFY, "get_next_verify: empty\n");
950e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe	return 1;
951e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe}
952e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
953e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboestatic void *verify_async_thread(void *data)
954e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
955e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	struct thread_data *td = data;
956e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	struct io_u *io_u;
957e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	int ret = 0;
958e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
959e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	if (td->o.verify_cpumask_set &&
960e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	    fio_setaffinity(td->pid, td->o.verify_cpumask)) {
961e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		log_err("fio: failed setting verify thread affinity\n");
962e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		goto done;
963e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	}
964e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
965e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	do {
966e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		FLIST_HEAD(list);
967e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe
968e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		read_barrier();
969e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		if (td->verify_thread_exit)
970e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			break;
971e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
972e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		pthread_mutex_lock(&td->io_u_lock);
973e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
974e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		while (flist_empty(&td->verify_list) &&
975e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		       !td->verify_thread_exit) {
976b36e298b5bdfc31ffc9a4c14e94a9c5c748888b0Jens Axboe			ret = pthread_cond_wait(&td->verify_cond,
977b36e298b5bdfc31ffc9a4c14e94a9c5c748888b0Jens Axboe							&td->io_u_lock);
978e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			if (ret) {
979e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe				pthread_mutex_unlock(&td->io_u_lock);
980e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe				break;
981e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			}
982e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		}
983e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
984e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		flist_splice_init(&td->verify_list, &list);
985e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		pthread_mutex_unlock(&td->io_u_lock);
986e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe
987e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		if (flist_empty(&list))
988e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			continue;
989e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
990e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		while (!flist_empty(&list)) {
991e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe			io_u = flist_entry(list.next, struct io_u, list);
992e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe			flist_del_init(&io_u->list);
993e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
994d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			ret = verify_io_u(td, io_u);
995e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe			put_io_u(td, io_u);
996d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			if (!ret)
997d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				continue;
998d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			if (td->o.continue_on_error &&
999d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			    td_non_fatal_error(ret)) {
1000d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				update_error_count(td, ret);
1001d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				td_clear_error(td);
1002d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe				ret = 0;
1003d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe			}
1004e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe		}
1005e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	} while (!ret);
1006e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1007d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe	if (ret) {
1008d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe		td_verror(td, ret, "async_verify");
1009f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe		if (td->o.verify_fatal)
1010f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe			td->terminate = 1;
1011d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe	}
1012d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe
1013e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboedone:
1014e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_lock(&td->io_u_lock);
1015e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->nr_verify_threads--;
1016e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_unlock(&td->io_u_lock);
1017e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1018e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_cond_signal(&td->free_cond);
1019e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	return NULL;
1020e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
1021e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1022e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_async_init(struct thread_data *td)
1023e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
1024e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	int i, ret;
1025304a47c7d94f407cc72a87025679a67f02288447bart Van Assche	pthread_attr_t attr;
1026304a47c7d94f407cc72a87025679a67f02288447bart Van Assche
1027304a47c7d94f407cc72a87025679a67f02288447bart Van Assche	pthread_attr_init(&attr);
1028304a47c7d94f407cc72a87025679a67f02288447bart Van Assche	pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN);
1029e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1030e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_thread_exit = 0;
1031e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1032e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_threads = malloc(sizeof(pthread_t) * td->o.verify_async);
1033e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	for (i = 0; i < td->o.verify_async; i++) {
1034304a47c7d94f407cc72a87025679a67f02288447bart Van Assche		ret = pthread_create(&td->verify_threads[i], &attr,
1035e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe					verify_async_thread, td);
1036e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		if (ret) {
1037e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			log_err("fio: async verify creation failed: %s\n",
1038e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe					strerror(ret));
1039e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			break;
1040e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		}
1041e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		ret = pthread_detach(td->verify_threads[i]);
1042e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		if (ret) {
1043e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			log_err("fio: async verify thread detach failed: %s\n",
1044e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe					strerror(ret));
1045e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe			break;
1046e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		}
1047e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		td->nr_verify_threads++;
1048e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	}
1049e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1050304a47c7d94f407cc72a87025679a67f02288447bart Van Assche	pthread_attr_destroy(&attr);
1051304a47c7d94f407cc72a87025679a67f02288447bart Van Assche
1052e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	if (i != td->o.verify_async) {
1053e40823b10920f679d84f3f2222e319c168b1e7daJens Axboe		log_err("fio: only %d verify threads started, exiting\n", i);
1054e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		td->verify_thread_exit = 1;
1055e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		write_barrier();
1056e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		pthread_cond_broadcast(&td->verify_cond);
1057e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		return 1;
1058e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	}
1059e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1060e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	return 0;
1061e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
1062e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1063e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboevoid verify_async_exit(struct thread_data *td)
1064e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{
1065e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_thread_exit = 1;
1066e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	write_barrier();
1067e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_cond_broadcast(&td->verify_cond);
1068e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1069e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_lock(&td->io_u_lock);
1070e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1071e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	while (td->nr_verify_threads)
1072e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe		pthread_cond_wait(&td->free_cond, &td->io_u_lock);
1073e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe
1074e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	pthread_mutex_unlock(&td->io_u_lock);
1075e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	free(td->verify_threads);
1076e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	td->verify_threads = NULL;
1077e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe}
1078