Home | History | Annotate | Download | only in fio
      1 /*
      2  * IO verification helpers
      3  */
      4 #include <unistd.h>
      5 #include <fcntl.h>
      6 #include <string.h>
      7 #include <assert.h>
      8 #include <pthread.h>
      9 #include <libgen.h>
     10 
     11 #include "fio.h"
     12 #include "verify.h"
     13 #include "trim.h"
     14 #include "lib/rand.h"
     15 #include "lib/hweight.h"
     16 
     17 #include "crc/md5.h"
     18 #include "crc/crc64.h"
     19 #include "crc/crc32.h"
     20 #include "crc/crc32c.h"
     21 #include "crc/crc16.h"
     22 #include "crc/crc7.h"
     23 #include "crc/sha256.h"
     24 #include "crc/sha512.h"
     25 #include "crc/sha1.h"
     26 #include "crc/xxhash.h"
     27 
     28 static void populate_hdr(struct thread_data *td, struct io_u *io_u,
     29 			 struct verify_header *hdr, unsigned int header_num,
     30 			 unsigned int header_len);
     31 
     32 void fill_buffer_pattern(struct thread_data *td, void *p, unsigned int len)
     33 {
     34 	fill_pattern(p, len, td->o.buffer_pattern, td->o.buffer_pattern_bytes);
     35 }
     36 
     37 void __fill_buffer(struct thread_options *o, unsigned long seed, void *p,
     38 		   unsigned int len)
     39 {
     40 	__fill_random_buf_percentage(seed, p, o->compress_percentage, len, len, o->buffer_pattern, o->buffer_pattern_bytes);
     41 }
     42 
     43 unsigned long fill_buffer(struct thread_data *td, void *p, unsigned int len)
     44 {
     45 	struct frand_state *fs = &td->verify_state;
     46 	struct thread_options *o = &td->o;
     47 
     48 	return fill_random_buf_percentage(fs, p, o->compress_percentage, len, len, o->buffer_pattern, o->buffer_pattern_bytes);
     49 }
     50 
     51 void fill_verify_pattern(struct thread_data *td, void *p, unsigned int len,
     52 			 struct io_u *io_u, unsigned long seed, int use_seed)
     53 {
     54 	struct thread_options *o = &td->o;
     55 
     56 	if (!o->verify_pattern_bytes) {
     57 		dprint(FD_VERIFY, "fill random bytes len=%u\n", len);
     58 
     59 		if (use_seed)
     60 			__fill_buffer(o, seed, p, len);
     61 		else
     62 			io_u->rand_seed = fill_buffer(td, p, len);
     63 		return;
     64 	}
     65 
     66 	if (io_u->buf_filled_len >= len) {
     67 		dprint(FD_VERIFY, "using already filled verify pattern b=%d len=%u\n",
     68 			o->verify_pattern_bytes, len);
     69 		return;
     70 	}
     71 
     72 	fill_pattern(p, len, o->verify_pattern, o->verify_pattern_bytes);
     73 	io_u->buf_filled_len = len;
     74 }
     75 
     76 static unsigned int get_hdr_inc(struct thread_data *td, struct io_u *io_u)
     77 {
     78 	unsigned int hdr_inc;
     79 
     80 	hdr_inc = io_u->buflen;
     81 	if (td->o.verify_interval && td->o.verify_interval <= io_u->buflen)
     82 		hdr_inc = td->o.verify_interval;
     83 
     84 	return hdr_inc;
     85 }
     86 
     87 static void fill_pattern_headers(struct thread_data *td, struct io_u *io_u,
     88 				 unsigned long seed, int use_seed)
     89 {
     90 	unsigned int hdr_inc, header_num;
     91 	struct verify_header *hdr;
     92 	void *p = io_u->buf;
     93 
     94 	fill_verify_pattern(td, p, io_u->buflen, io_u, seed, use_seed);
     95 
     96 	hdr_inc = get_hdr_inc(td, io_u);
     97 	header_num = 0;
     98 	for (; p < io_u->buf + io_u->buflen; p += hdr_inc) {
     99 		hdr = p;
    100 		populate_hdr(td, io_u, hdr, header_num, hdr_inc);
    101 		header_num++;
    102 	}
    103 }
    104 
    105 static void memswp(void *buf1, void *buf2, unsigned int len)
    106 {
    107 	char swap[200];
    108 
    109 	assert(len <= sizeof(swap));
    110 
    111 	memcpy(&swap, buf1, len);
    112 	memcpy(buf1, buf2, len);
    113 	memcpy(buf2, &swap, len);
    114 }
    115 
    116 static void hexdump(void *buffer, int len)
    117 {
    118 	unsigned char *p = buffer;
    119 	int i;
    120 
    121 	for (i = 0; i < len; i++)
    122 		log_err("%02x", p[i]);
    123 	log_err("\n");
    124 }
    125 
    126 /*
    127  * Prepare for separation of verify_header and checksum header
    128  */
    129 static inline unsigned int __hdr_size(int verify_type)
    130 {
    131 	unsigned int len = 0;
    132 
    133 	switch (verify_type) {
    134 	case VERIFY_NONE:
    135 	case VERIFY_NULL:
    136 		len = 0;
    137 		break;
    138 	case VERIFY_MD5:
    139 		len = sizeof(struct vhdr_md5);
    140 		break;
    141 	case VERIFY_CRC64:
    142 		len = sizeof(struct vhdr_crc64);
    143 		break;
    144 	case VERIFY_CRC32C:
    145 	case VERIFY_CRC32:
    146 	case VERIFY_CRC32C_INTEL:
    147 		len = sizeof(struct vhdr_crc32);
    148 		break;
    149 	case VERIFY_CRC16:
    150 		len = sizeof(struct vhdr_crc16);
    151 		break;
    152 	case VERIFY_CRC7:
    153 		len = sizeof(struct vhdr_crc7);
    154 		break;
    155 	case VERIFY_SHA256:
    156 		len = sizeof(struct vhdr_sha256);
    157 		break;
    158 	case VERIFY_SHA512:
    159 		len = sizeof(struct vhdr_sha512);
    160 		break;
    161 	case VERIFY_XXHASH:
    162 		len = sizeof(struct vhdr_xxhash);
    163 		break;
    164 	case VERIFY_META:
    165 		len = sizeof(struct vhdr_meta);
    166 		break;
    167 	case VERIFY_SHA1:
    168 		len = sizeof(struct vhdr_sha1);
    169 		break;
    170 	case VERIFY_PATTERN:
    171 		len = 0;
    172 		break;
    173 	default:
    174 		log_err("fio: unknown verify header!\n");
    175 		assert(0);
    176 	}
    177 
    178 	return len + sizeof(struct verify_header);
    179 }
    180 
    181 static inline unsigned int hdr_size(struct verify_header *hdr)
    182 {
    183 	return __hdr_size(hdr->verify_type);
    184 }
    185 
    186 static void *hdr_priv(struct verify_header *hdr)
    187 {
    188 	void *priv = hdr;
    189 
    190 	return priv + sizeof(struct verify_header);
    191 }
    192 
    193 /*
    194  * Verify container, pass info to verify handlers and allow them to
    195  * pass info back in case of error
    196  */
    197 struct vcont {
    198 	/*
    199 	 * Input
    200 	 */
    201 	struct io_u *io_u;
    202 	unsigned int hdr_num;
    203 	struct thread_data *td;
    204 
    205 	/*
    206 	 * Output, only valid in case of error
    207 	 */
    208 	const char *name;
    209 	void *good_crc;
    210 	void *bad_crc;
    211 	unsigned int crc_len;
    212 };
    213 
    214 #define DUMP_BUF_SZ	255
    215 static int dump_buf_warned;
    216 
    217 static void dump_buf(char *buf, unsigned int len, unsigned long long offset,
    218 		     const char *type, struct fio_file *f)
    219 {
    220 	char *ptr, fname[DUMP_BUF_SZ];
    221 	size_t buf_left = DUMP_BUF_SZ;
    222 	int ret, fd;
    223 
    224 	ptr = strdup(f->file_name);
    225 
    226 	fname[DUMP_BUF_SZ - 1] = '\0';
    227 	strncpy(fname, basename(ptr), DUMP_BUF_SZ - 1);
    228 
    229 	buf_left -= strlen(fname);
    230 	if (buf_left <= 0) {
    231 		if (!dump_buf_warned) {
    232 			log_err("fio: verify failure dump buffer too small\n");
    233 			dump_buf_warned = 1;
    234 		}
    235 		free(ptr);
    236 		return;
    237 	}
    238 
    239 	snprintf(fname + strlen(fname), buf_left, ".%llu.%s", offset, type);
    240 
    241 	fd = open(fname, O_CREAT | O_TRUNC | O_WRONLY, 0644);
    242 	if (fd < 0) {
    243 		perror("open verify buf file");
    244 		return;
    245 	}
    246 
    247 	while (len) {
    248 		ret = write(fd, buf, len);
    249 		if (!ret)
    250 			break;
    251 		else if (ret < 0) {
    252 			perror("write verify buf file");
    253 			break;
    254 		}
    255 		len -= ret;
    256 		buf += ret;
    257 	}
    258 
    259 	close(fd);
    260 	log_err("       %s data dumped as %s\n", type, fname);
    261 	free(ptr);
    262 }
    263 
    264 /*
    265  * Dump the contents of the read block and re-generate the correct data
    266  * and dump that too.
    267  */
    268 static void dump_verify_buffers(struct verify_header *hdr, struct vcont *vc)
    269 {
    270 	struct thread_data *td = vc->td;
    271 	struct io_u *io_u = vc->io_u;
    272 	unsigned long hdr_offset;
    273 	struct io_u dummy;
    274 	void *buf;
    275 
    276 	if (!td->o.verify_dump)
    277 		return;
    278 
    279 	/*
    280 	 * Dump the contents we just read off disk
    281 	 */
    282 	hdr_offset = vc->hdr_num * hdr->len;
    283 
    284 	dump_buf(io_u->buf + hdr_offset, hdr->len, io_u->offset + hdr_offset,
    285 			"received", vc->io_u->file);
    286 
    287 	/*
    288 	 * Allocate a new buf and re-generate the original data
    289 	 */
    290 	buf = malloc(io_u->buflen);
    291 	dummy = *io_u;
    292 	dummy.buf = buf;
    293 	dummy.rand_seed = hdr->rand_seed;
    294 	dummy.buf_filled_len = 0;
    295 	dummy.buflen = io_u->buflen;
    296 
    297 	fill_pattern_headers(td, &dummy, hdr->rand_seed, 1);
    298 
    299 	dump_buf(buf + hdr_offset, hdr->len, io_u->offset + hdr_offset,
    300 			"expected", vc->io_u->file);
    301 	free(buf);
    302 }
    303 
    304 static void log_verify_failure(struct verify_header *hdr, struct vcont *vc)
    305 {
    306 	unsigned long long offset;
    307 
    308 	offset = vc->io_u->offset;
    309 	offset += vc->hdr_num * hdr->len;
    310 	log_err("%.8s: verify failed at file %s offset %llu, length %u\n",
    311 			vc->name, vc->io_u->file->file_name, offset, hdr->len);
    312 
    313 	if (vc->good_crc && vc->bad_crc) {
    314 		log_err("       Expected CRC: ");
    315 		hexdump(vc->good_crc, vc->crc_len);
    316 		log_err("       Received CRC: ");
    317 		hexdump(vc->bad_crc, vc->crc_len);
    318 	}
    319 
    320 	dump_verify_buffers(hdr, vc);
    321 }
    322 
    323 /*
    324  * Return data area 'header_num'
    325  */
    326 static inline void *io_u_verify_off(struct verify_header *hdr, struct vcont *vc)
    327 {
    328 	return vc->io_u->buf + vc->hdr_num * hdr->len + hdr_size(hdr);
    329 }
    330 
    331 static int verify_io_u_pattern(struct verify_header *hdr, struct vcont *vc)
    332 {
    333 	struct thread_data *td = vc->td;
    334 	struct io_u *io_u = vc->io_u;
    335 	char *buf, *pattern;
    336 	unsigned int header_size = __hdr_size(td->o.verify);
    337 	unsigned int len, mod, i, size, pattern_size;
    338 
    339 	pattern = td->o.verify_pattern;
    340 	pattern_size = td->o.verify_pattern_bytes;
    341 	if (pattern_size <= 1)
    342 		pattern_size = MAX_PATTERN_SIZE;
    343 	buf = (void *) hdr + header_size;
    344 	len = get_hdr_inc(td, io_u) - header_size;
    345 	mod = header_size % pattern_size;
    346 
    347 	for (i = 0; i < len; i += size) {
    348 		size = pattern_size - mod;
    349 		if (size > (len - i))
    350 			size = len - i;
    351 		if (memcmp(buf + i, pattern + mod, size))
    352 			/* Let the slow compare find the first mismatch byte. */
    353 			break;
    354 		mod = 0;
    355 	}
    356 
    357 	for (; i < len; i++) {
    358 		if (buf[i] != pattern[mod]) {
    359 			unsigned int bits;
    360 
    361 			bits = hweight8(buf[i] ^ pattern[mod]);
    362 			log_err("fio: got pattern %x, wanted %x. Bad bits %d\n",
    363 				buf[i], pattern[mod], bits);
    364 			log_err("fio: bad pattern block offset %u\n", i);
    365 			dump_verify_buffers(hdr, vc);
    366 			return EILSEQ;
    367 		}
    368 		mod++;
    369 		if (mod == td->o.verify_pattern_bytes)
    370 			mod = 0;
    371 	}
    372 
    373 	return 0;
    374 }
    375 
    376 static int verify_io_u_meta(struct verify_header *hdr, struct vcont *vc)
    377 {
    378 	struct thread_data *td = vc->td;
    379 	struct vhdr_meta *vh = hdr_priv(hdr);
    380 	struct io_u *io_u = vc->io_u;
    381 	int ret = EILSEQ;
    382 
    383 	dprint(FD_VERIFY, "meta verify io_u %p, len %u\n", io_u, hdr->len);
    384 
    385 	if (vh->offset == io_u->offset + vc->hdr_num * td->o.verify_interval)
    386 		ret = 0;
    387 
    388 	if (td->o.verify_pattern_bytes)
    389 		ret |= verify_io_u_pattern(hdr, vc);
    390 
    391 	/*
    392 	 * For read-only workloads, the program cannot be certain of the
    393 	 * last numberio written to a block. Checking of numberio will be
    394 	 * done only for workloads that write data.  For verify_only,
    395 	 * numberio will be checked in the last iteration when the correct
    396 	 * state of numberio, that would have been written to each block
    397 	 * in a previous run of fio, has been reached.
    398 	 */
    399 	if ((td_write(td) || td_rw(td)) && (td_min_bs(td) == td_max_bs(td)) &&
    400 	    !td->o.time_based)
    401 		if (!td->o.verify_only || td->o.loops == 0)
    402 			if (vh->numberio != io_u->numberio)
    403 				ret = EILSEQ;
    404 
    405 	if (!ret)
    406 		return 0;
    407 
    408 	vc->name = "meta";
    409 	log_verify_failure(hdr, vc);
    410 	return ret;
    411 }
    412 
    413 static int verify_io_u_xxhash(struct verify_header *hdr, struct vcont *vc)
    414 {
    415 	void *p = io_u_verify_off(hdr, vc);
    416 	struct vhdr_xxhash *vh = hdr_priv(hdr);
    417 	uint32_t hash;
    418 	void *state;
    419 
    420 	dprint(FD_VERIFY, "xxhash verify io_u %p, len %u\n", vc->io_u, hdr->len);
    421 
    422 	state = XXH32_init(1);
    423 	XXH32_update(state, p, hdr->len - hdr_size(hdr));
    424 	hash = XXH32_digest(state);
    425 
    426 	if (vh->hash == hash)
    427 		return 0;
    428 
    429 	vc->name = "xxhash";
    430 	vc->good_crc = &vh->hash;
    431 	vc->bad_crc = &hash;
    432 	vc->crc_len = sizeof(hash);
    433 	log_verify_failure(hdr, vc);
    434 	return EILSEQ;
    435 }
    436 
    437 static int verify_io_u_sha512(struct verify_header *hdr, struct vcont *vc)
    438 {
    439 	void *p = io_u_verify_off(hdr, vc);
    440 	struct vhdr_sha512 *vh = hdr_priv(hdr);
    441 	uint8_t sha512[128];
    442 	struct fio_sha512_ctx sha512_ctx = {
    443 		.buf = sha512,
    444 	};
    445 
    446 	dprint(FD_VERIFY, "sha512 verify io_u %p, len %u\n", vc->io_u, hdr->len);
    447 
    448 	fio_sha512_init(&sha512_ctx);
    449 	fio_sha512_update(&sha512_ctx, p, hdr->len - hdr_size(hdr));
    450 
    451 	if (!memcmp(vh->sha512, sha512_ctx.buf, sizeof(sha512)))
    452 		return 0;
    453 
    454 	vc->name = "sha512";
    455 	vc->good_crc = vh->sha512;
    456 	vc->bad_crc = sha512_ctx.buf;
    457 	vc->crc_len = sizeof(vh->sha512);
    458 	log_verify_failure(hdr, vc);
    459 	return EILSEQ;
    460 }
    461 
    462 static int verify_io_u_sha256(struct verify_header *hdr, struct vcont *vc)
    463 {
    464 	void *p = io_u_verify_off(hdr, vc);
    465 	struct vhdr_sha256 *vh = hdr_priv(hdr);
    466 	uint8_t sha256[64];
    467 	struct fio_sha256_ctx sha256_ctx = {
    468 		.buf = sha256,
    469 	};
    470 
    471 	dprint(FD_VERIFY, "sha256 verify io_u %p, len %u\n", vc->io_u, hdr->len);
    472 
    473 	fio_sha256_init(&sha256_ctx);
    474 	fio_sha256_update(&sha256_ctx, p, hdr->len - hdr_size(hdr));
    475 	fio_sha256_final(&sha256_ctx);
    476 
    477 	if (!memcmp(vh->sha256, sha256_ctx.buf, sizeof(sha256)))
    478 		return 0;
    479 
    480 	vc->name = "sha256";
    481 	vc->good_crc = vh->sha256;
    482 	vc->bad_crc = sha256_ctx.buf;
    483 	vc->crc_len = sizeof(vh->sha256);
    484 	log_verify_failure(hdr, vc);
    485 	return EILSEQ;
    486 }
    487 
    488 static int verify_io_u_sha1(struct verify_header *hdr, struct vcont *vc)
    489 {
    490 	void *p = io_u_verify_off(hdr, vc);
    491 	struct vhdr_sha1 *vh = hdr_priv(hdr);
    492 	uint32_t sha1[5];
    493 	struct fio_sha1_ctx sha1_ctx = {
    494 		.H = sha1,
    495 	};
    496 
    497 	dprint(FD_VERIFY, "sha1 verify io_u %p, len %u\n", vc->io_u, hdr->len);
    498 
    499 	fio_sha1_init(&sha1_ctx);
    500 	fio_sha1_update(&sha1_ctx, p, hdr->len - hdr_size(hdr));
    501 	fio_sha1_final(&sha1_ctx);
    502 
    503 	if (!memcmp(vh->sha1, sha1_ctx.H, sizeof(sha1)))
    504 		return 0;
    505 
    506 	vc->name = "sha1";
    507 	vc->good_crc = vh->sha1;
    508 	vc->bad_crc = sha1_ctx.H;
    509 	vc->crc_len = sizeof(vh->sha1);
    510 	log_verify_failure(hdr, vc);
    511 	return EILSEQ;
    512 }
    513 
    514 static int verify_io_u_crc7(struct verify_header *hdr, struct vcont *vc)
    515 {
    516 	void *p = io_u_verify_off(hdr, vc);
    517 	struct vhdr_crc7 *vh = hdr_priv(hdr);
    518 	unsigned char c;
    519 
    520 	dprint(FD_VERIFY, "crc7 verify io_u %p, len %u\n", vc->io_u, hdr->len);
    521 
    522 	c = fio_crc7(p, hdr->len - hdr_size(hdr));
    523 
    524 	if (c == vh->crc7)
    525 		return 0;
    526 
    527 	vc->name = "crc7";
    528 	vc->good_crc = &vh->crc7;
    529 	vc->bad_crc = &c;
    530 	vc->crc_len = 1;
    531 	log_verify_failure(hdr, vc);
    532 	return EILSEQ;
    533 }
    534 
    535 static int verify_io_u_crc16(struct verify_header *hdr, struct vcont *vc)
    536 {
    537 	void *p = io_u_verify_off(hdr, vc);
    538 	struct vhdr_crc16 *vh = hdr_priv(hdr);
    539 	unsigned short c;
    540 
    541 	dprint(FD_VERIFY, "crc16 verify io_u %p, len %u\n", vc->io_u, hdr->len);
    542 
    543 	c = fio_crc16(p, hdr->len - hdr_size(hdr));
    544 
    545 	if (c == vh->crc16)
    546 		return 0;
    547 
    548 	vc->name = "crc16";
    549 	vc->good_crc = &vh->crc16;
    550 	vc->bad_crc = &c;
    551 	vc->crc_len = 2;
    552 	log_verify_failure(hdr, vc);
    553 	return EILSEQ;
    554 }
    555 
    556 static int verify_io_u_crc64(struct verify_header *hdr, struct vcont *vc)
    557 {
    558 	void *p = io_u_verify_off(hdr, vc);
    559 	struct vhdr_crc64 *vh = hdr_priv(hdr);
    560 	unsigned long long c;
    561 
    562 	dprint(FD_VERIFY, "crc64 verify io_u %p, len %u\n", vc->io_u, hdr->len);
    563 
    564 	c = fio_crc64(p, hdr->len - hdr_size(hdr));
    565 
    566 	if (c == vh->crc64)
    567 		return 0;
    568 
    569 	vc->name = "crc64";
    570 	vc->good_crc = &vh->crc64;
    571 	vc->bad_crc = &c;
    572 	vc->crc_len = 8;
    573 	log_verify_failure(hdr, vc);
    574 	return EILSEQ;
    575 }
    576 
    577 static int verify_io_u_crc32(struct verify_header *hdr, struct vcont *vc)
    578 {
    579 	void *p = io_u_verify_off(hdr, vc);
    580 	struct vhdr_crc32 *vh = hdr_priv(hdr);
    581 	uint32_t c;
    582 
    583 	dprint(FD_VERIFY, "crc32 verify io_u %p, len %u\n", vc->io_u, hdr->len);
    584 
    585 	c = fio_crc32(p, hdr->len - hdr_size(hdr));
    586 
    587 	if (c == vh->crc32)
    588 		return 0;
    589 
    590 	vc->name = "crc32";
    591 	vc->good_crc = &vh->crc32;
    592 	vc->bad_crc = &c;
    593 	vc->crc_len = 4;
    594 	log_verify_failure(hdr, vc);
    595 	return EILSEQ;
    596 }
    597 
    598 static int verify_io_u_crc32c(struct verify_header *hdr, struct vcont *vc)
    599 {
    600 	void *p = io_u_verify_off(hdr, vc);
    601 	struct vhdr_crc32 *vh = hdr_priv(hdr);
    602 	uint32_t c;
    603 
    604 	dprint(FD_VERIFY, "crc32c verify io_u %p, len %u\n", vc->io_u, hdr->len);
    605 
    606 	c = fio_crc32c(p, hdr->len - hdr_size(hdr));
    607 
    608 	if (c == vh->crc32)
    609 		return 0;
    610 
    611 	vc->name = "crc32c";
    612 	vc->good_crc = &vh->crc32;
    613 	vc->bad_crc = &c;
    614 	vc->crc_len = 4;
    615 	log_verify_failure(hdr, vc);
    616 	return EILSEQ;
    617 }
    618 
    619 static int verify_io_u_md5(struct verify_header *hdr, struct vcont *vc)
    620 {
    621 	void *p = io_u_verify_off(hdr, vc);
    622 	struct vhdr_md5 *vh = hdr_priv(hdr);
    623 	uint32_t hash[MD5_HASH_WORDS];
    624 	struct fio_md5_ctx md5_ctx = {
    625 		.hash = hash,
    626 	};
    627 
    628 	dprint(FD_VERIFY, "md5 verify io_u %p, len %u\n", vc->io_u, hdr->len);
    629 
    630 	fio_md5_init(&md5_ctx);
    631 	fio_md5_update(&md5_ctx, p, hdr->len - hdr_size(hdr));
    632 	fio_md5_final(&md5_ctx);
    633 
    634 	if (!memcmp(vh->md5_digest, md5_ctx.hash, sizeof(hash)))
    635 		return 0;
    636 
    637 	vc->name = "md5";
    638 	vc->good_crc = vh->md5_digest;
    639 	vc->bad_crc = md5_ctx.hash;
    640 	vc->crc_len = sizeof(hash);
    641 	log_verify_failure(hdr, vc);
    642 	return EILSEQ;
    643 }
    644 
    645 /*
    646  * Push IO verification to a separate thread
    647  */
    648 int verify_io_u_async(struct thread_data *td, struct io_u **io_u_ptr)
    649 {
    650 	struct io_u *io_u = *io_u_ptr;
    651 
    652 	pthread_mutex_lock(&td->io_u_lock);
    653 
    654 	if (io_u->file)
    655 		put_file_log(td, io_u->file);
    656 
    657 	if (io_u->flags & IO_U_F_IN_CUR_DEPTH) {
    658 		td->cur_depth--;
    659 		io_u->flags &= ~IO_U_F_IN_CUR_DEPTH;
    660 	}
    661 	flist_add_tail(&io_u->verify_list, &td->verify_list);
    662 	*io_u_ptr = NULL;
    663 	pthread_mutex_unlock(&td->io_u_lock);
    664 
    665 	pthread_cond_signal(&td->verify_cond);
    666 	return 0;
    667 }
    668 
    669 static int verify_trimmed_io_u(struct thread_data *td, struct io_u *io_u)
    670 {
    671 	static char zero_buf[1024];
    672 	unsigned int this_len, len;
    673 	int ret = 0;
    674 	void *p;
    675 
    676 	if (!td->o.trim_zero)
    677 		return 0;
    678 
    679 	len = io_u->buflen;
    680 	p = io_u->buf;
    681 	do {
    682 		this_len = sizeof(zero_buf);
    683 		if (this_len > len)
    684 			this_len = len;
    685 		if (memcmp(p, zero_buf, this_len)) {
    686 			ret = EILSEQ;
    687 			break;
    688 		}
    689 		len -= this_len;
    690 		p += this_len;
    691 	} while (len);
    692 
    693 	if (!ret)
    694 		return 0;
    695 
    696 	log_err("trim: verify failed at file %s offset %llu, length %lu"
    697 		", block offset %lu\n",
    698 			io_u->file->file_name, io_u->offset, io_u->buflen,
    699 			(unsigned long) (p - io_u->buf));
    700 	return ret;
    701 }
    702 
    703 static int verify_header(struct io_u *io_u, struct verify_header *hdr,
    704 			 unsigned int hdr_num, unsigned int hdr_len)
    705 {
    706 	void *p = hdr;
    707 	uint32_t crc;
    708 
    709 	if (hdr->magic != FIO_HDR_MAGIC) {
    710 		log_err("verify: bad magic header %x, wanted %x",
    711 			hdr->magic, FIO_HDR_MAGIC);
    712 		goto err;
    713 	}
    714 	if (hdr->len != hdr_len) {
    715 		log_err("verify: bad header length %u, wanted %u",
    716 			hdr->len, hdr_len);
    717 		goto err;
    718 	}
    719 	if (hdr->rand_seed != io_u->rand_seed) {
    720 		log_err("verify: bad header rand_seed %"PRIu64
    721 			", wanted %"PRIu64,
    722 			hdr->rand_seed, io_u->rand_seed);
    723 		goto err;
    724 	}
    725 
    726 	crc = fio_crc32c(p, offsetof(struct verify_header, crc32));
    727 	if (crc != hdr->crc32) {
    728 		log_err("verify: bad header crc %x, calculated %x",
    729 			hdr->crc32, crc);
    730 		goto err;
    731 	}
    732 	return 0;
    733 
    734 err:
    735 	log_err(" at file %s offset %llu, length %u\n",
    736 		io_u->file->file_name,
    737 		io_u->offset + hdr_num * hdr_len, hdr_len);
    738 	return EILSEQ;
    739 }
    740 
    741 int verify_io_u(struct thread_data *td, struct io_u **io_u_ptr)
    742 {
    743 	struct verify_header *hdr;
    744 	struct io_u *io_u = *io_u_ptr;
    745 	unsigned int header_size, hdr_inc, hdr_num = 0;
    746 	void *p;
    747 	int ret;
    748 
    749 	if (td->o.verify == VERIFY_NULL || io_u->ddir != DDIR_READ)
    750 		return 0;
    751 	/*
    752 	 * If the IO engine is faking IO (like null), then just pretend
    753 	 * we verified everything.
    754 	 */
    755 	if (td->io_ops->flags & FIO_FAKEIO)
    756 		return 0;
    757 
    758 	if (io_u->flags & IO_U_F_TRIMMED) {
    759 		ret = verify_trimmed_io_u(td, io_u);
    760 		goto done;
    761 	}
    762 
    763 	hdr_inc = get_hdr_inc(td, io_u);
    764 
    765 	ret = 0;
    766 	for (p = io_u->buf; p < io_u->buf + io_u->buflen;
    767 	     p += hdr_inc, hdr_num++) {
    768 		struct vcont vc = {
    769 			.io_u		= io_u,
    770 			.hdr_num	= hdr_num,
    771 			.td		= td,
    772 		};
    773 		unsigned int verify_type;
    774 
    775 		if (ret && td->o.verify_fatal)
    776 			break;
    777 
    778 		header_size = __hdr_size(td->o.verify);
    779 		if (td->o.verify_offset)
    780 			memswp(p, p + td->o.verify_offset, header_size);
    781 		hdr = p;
    782 
    783 		/*
    784 		 * Make rand_seed check pass when have verifysort or
    785 		 * verify_backlog.
    786 		 */
    787 		if (td->o.verifysort || (td->flags & TD_F_VER_BACKLOG))
    788 			io_u->rand_seed = hdr->rand_seed;
    789 
    790 		ret = verify_header(io_u, hdr, hdr_num, hdr_inc);
    791 		if (ret)
    792 			return ret;
    793 
    794 		if (td->o.verify != VERIFY_NONE)
    795 			verify_type = td->o.verify;
    796 		else
    797 			verify_type = hdr->verify_type;
    798 
    799 		switch (verify_type) {
    800 		case VERIFY_MD5:
    801 			ret = verify_io_u_md5(hdr, &vc);
    802 			break;
    803 		case VERIFY_CRC64:
    804 			ret = verify_io_u_crc64(hdr, &vc);
    805 			break;
    806 		case VERIFY_CRC32C:
    807 		case VERIFY_CRC32C_INTEL:
    808 			ret = verify_io_u_crc32c(hdr, &vc);
    809 			break;
    810 		case VERIFY_CRC32:
    811 			ret = verify_io_u_crc32(hdr, &vc);
    812 			break;
    813 		case VERIFY_CRC16:
    814 			ret = verify_io_u_crc16(hdr, &vc);
    815 			break;
    816 		case VERIFY_CRC7:
    817 			ret = verify_io_u_crc7(hdr, &vc);
    818 			break;
    819 		case VERIFY_SHA256:
    820 			ret = verify_io_u_sha256(hdr, &vc);
    821 			break;
    822 		case VERIFY_SHA512:
    823 			ret = verify_io_u_sha512(hdr, &vc);
    824 			break;
    825 		case VERIFY_XXHASH:
    826 			ret = verify_io_u_xxhash(hdr, &vc);
    827 			break;
    828 		case VERIFY_META:
    829 			ret = verify_io_u_meta(hdr, &vc);
    830 			break;
    831 		case VERIFY_SHA1:
    832 			ret = verify_io_u_sha1(hdr, &vc);
    833 			break;
    834 		case VERIFY_PATTERN:
    835 			ret = verify_io_u_pattern(hdr, &vc);
    836 			break;
    837 		default:
    838 			log_err("Bad verify type %u\n", hdr->verify_type);
    839 			ret = EINVAL;
    840 		}
    841 
    842 		if (ret && verify_type != hdr->verify_type)
    843 			log_err("fio: verify type mismatch (%u media, %u given)\n",
    844 					hdr->verify_type, verify_type);
    845 	}
    846 
    847 done:
    848 	if (ret && td->o.verify_fatal)
    849 		fio_mark_td_terminate(td);
    850 
    851 	return ret;
    852 }
    853 
    854 static void fill_meta(struct verify_header *hdr, struct thread_data *td,
    855 		      struct io_u *io_u, unsigned int header_num)
    856 {
    857 	struct vhdr_meta *vh = hdr_priv(hdr);
    858 
    859 	vh->thread = td->thread_number;
    860 
    861 	vh->time_sec = io_u->start_time.tv_sec;
    862 	vh->time_usec = io_u->start_time.tv_usec;
    863 
    864 	vh->numberio = io_u->numberio;
    865 
    866 	vh->offset = io_u->offset + header_num * td->o.verify_interval;
    867 }
    868 
    869 static void fill_xxhash(struct verify_header *hdr, void *p, unsigned int len)
    870 {
    871 	struct vhdr_xxhash *vh = hdr_priv(hdr);
    872 	void *state;
    873 
    874 	state = XXH32_init(1);
    875 	XXH32_update(state, p, len);
    876 	vh->hash = XXH32_digest(state);
    877 }
    878 
    879 static void fill_sha512(struct verify_header *hdr, void *p, unsigned int len)
    880 {
    881 	struct vhdr_sha512 *vh = hdr_priv(hdr);
    882 	struct fio_sha512_ctx sha512_ctx = {
    883 		.buf = vh->sha512,
    884 	};
    885 
    886 	fio_sha512_init(&sha512_ctx);
    887 	fio_sha512_update(&sha512_ctx, p, len);
    888 }
    889 
    890 static void fill_sha256(struct verify_header *hdr, void *p, unsigned int len)
    891 {
    892 	struct vhdr_sha256 *vh = hdr_priv(hdr);
    893 	struct fio_sha256_ctx sha256_ctx = {
    894 		.buf = vh->sha256,
    895 	};
    896 
    897 	fio_sha256_init(&sha256_ctx);
    898 	fio_sha256_update(&sha256_ctx, p, len);
    899 	fio_sha256_final(&sha256_ctx);
    900 }
    901 
    902 static void fill_sha1(struct verify_header *hdr, void *p, unsigned int len)
    903 {
    904 	struct vhdr_sha1 *vh = hdr_priv(hdr);
    905 	struct fio_sha1_ctx sha1_ctx = {
    906 		.H = vh->sha1,
    907 	};
    908 
    909 	fio_sha1_init(&sha1_ctx);
    910 	fio_sha1_update(&sha1_ctx, p, len);
    911 	fio_sha1_final(&sha1_ctx);
    912 }
    913 
    914 static void fill_crc7(struct verify_header *hdr, void *p, unsigned int len)
    915 {
    916 	struct vhdr_crc7 *vh = hdr_priv(hdr);
    917 
    918 	vh->crc7 = fio_crc7(p, len);
    919 }
    920 
    921 static void fill_crc16(struct verify_header *hdr, void *p, unsigned int len)
    922 {
    923 	struct vhdr_crc16 *vh = hdr_priv(hdr);
    924 
    925 	vh->crc16 = fio_crc16(p, len);
    926 }
    927 
    928 static void fill_crc32(struct verify_header *hdr, void *p, unsigned int len)
    929 {
    930 	struct vhdr_crc32 *vh = hdr_priv(hdr);
    931 
    932 	vh->crc32 = fio_crc32(p, len);
    933 }
    934 
    935 static void fill_crc32c(struct verify_header *hdr, void *p, unsigned int len)
    936 {
    937 	struct vhdr_crc32 *vh = hdr_priv(hdr);
    938 
    939 	vh->crc32 = fio_crc32c(p, len);
    940 }
    941 
    942 static void fill_crc64(struct verify_header *hdr, void *p, unsigned int len)
    943 {
    944 	struct vhdr_crc64 *vh = hdr_priv(hdr);
    945 
    946 	vh->crc64 = fio_crc64(p, len);
    947 }
    948 
    949 static void fill_md5(struct verify_header *hdr, void *p, unsigned int len)
    950 {
    951 	struct vhdr_md5 *vh = hdr_priv(hdr);
    952 	struct fio_md5_ctx md5_ctx = {
    953 		.hash = (uint32_t *) vh->md5_digest,
    954 	};
    955 
    956 	fio_md5_init(&md5_ctx);
    957 	fio_md5_update(&md5_ctx, p, len);
    958 	fio_md5_final(&md5_ctx);
    959 }
    960 
    961 static void populate_hdr(struct thread_data *td, struct io_u *io_u,
    962 			 struct verify_header *hdr, unsigned int header_num,
    963 			 unsigned int header_len)
    964 {
    965 	unsigned int data_len;
    966 	void *data, *p;
    967 
    968 	p = (void *) hdr;
    969 
    970 	hdr->magic = FIO_HDR_MAGIC;
    971 	hdr->verify_type = td->o.verify;
    972 	hdr->len = header_len;
    973 	hdr->rand_seed = io_u->rand_seed;
    974 	hdr->crc32 = fio_crc32c(p, offsetof(struct verify_header, crc32));
    975 
    976 	data_len = header_len - hdr_size(hdr);
    977 
    978 	data = p + hdr_size(hdr);
    979 	switch (td->o.verify) {
    980 	case VERIFY_MD5:
    981 		dprint(FD_VERIFY, "fill md5 io_u %p, len %u\n",
    982 						io_u, hdr->len);
    983 		fill_md5(hdr, data, data_len);
    984 		break;
    985 	case VERIFY_CRC64:
    986 		dprint(FD_VERIFY, "fill crc64 io_u %p, len %u\n",
    987 						io_u, hdr->len);
    988 		fill_crc64(hdr, data, data_len);
    989 		break;
    990 	case VERIFY_CRC32C:
    991 	case VERIFY_CRC32C_INTEL:
    992 		dprint(FD_VERIFY, "fill crc32c io_u %p, len %u\n",
    993 						io_u, hdr->len);
    994 		fill_crc32c(hdr, data, data_len);
    995 		break;
    996 	case VERIFY_CRC32:
    997 		dprint(FD_VERIFY, "fill crc32 io_u %p, len %u\n",
    998 						io_u, hdr->len);
    999 		fill_crc32(hdr, data, data_len);
   1000 		break;
   1001 	case VERIFY_CRC16:
   1002 		dprint(FD_VERIFY, "fill crc16 io_u %p, len %u\n",
   1003 						io_u, hdr->len);
   1004 		fill_crc16(hdr, data, data_len);
   1005 		break;
   1006 	case VERIFY_CRC7:
   1007 		dprint(FD_VERIFY, "fill crc7 io_u %p, len %u\n",
   1008 						io_u, hdr->len);
   1009 		fill_crc7(hdr, data, data_len);
   1010 		break;
   1011 	case VERIFY_SHA256:
   1012 		dprint(FD_VERIFY, "fill sha256 io_u %p, len %u\n",
   1013 						io_u, hdr->len);
   1014 		fill_sha256(hdr, data, data_len);
   1015 		break;
   1016 	case VERIFY_SHA512:
   1017 		dprint(FD_VERIFY, "fill sha512 io_u %p, len %u\n",
   1018 						io_u, hdr->len);
   1019 		fill_sha512(hdr, data, data_len);
   1020 		break;
   1021 	case VERIFY_XXHASH:
   1022 		dprint(FD_VERIFY, "fill xxhash io_u %p, len %u\n",
   1023 						io_u, hdr->len);
   1024 		fill_xxhash(hdr, data, data_len);
   1025 		break;
   1026 	case VERIFY_META:
   1027 		dprint(FD_VERIFY, "fill meta io_u %p, len %u\n",
   1028 						io_u, hdr->len);
   1029 		fill_meta(hdr, td, io_u, header_num);
   1030 		break;
   1031 	case VERIFY_SHA1:
   1032 		dprint(FD_VERIFY, "fill sha1 io_u %p, len %u\n",
   1033 						io_u, hdr->len);
   1034 		fill_sha1(hdr, data, data_len);
   1035 		break;
   1036 	case VERIFY_PATTERN:
   1037 		/* nothing to do here */
   1038 		break;
   1039 	default:
   1040 		log_err("fio: bad verify type: %d\n", td->o.verify);
   1041 		assert(0);
   1042 	}
   1043 	if (td->o.verify_offset)
   1044 		memswp(p, p + td->o.verify_offset, hdr_size(hdr));
   1045 }
   1046 
   1047 /*
   1048  * fill body of io_u->buf with random data and add a header with the
   1049  * checksum of choice
   1050  */
   1051 void populate_verify_io_u(struct thread_data *td, struct io_u *io_u)
   1052 {
   1053 	if (td->o.verify == VERIFY_NULL)
   1054 		return;
   1055 
   1056 	io_u->numberio = td->io_issues[io_u->ddir];
   1057 
   1058 	fill_pattern_headers(td, io_u, 0, 0);
   1059 }
   1060 
   1061 int get_next_verify(struct thread_data *td, struct io_u *io_u)
   1062 {
   1063 	struct io_piece *ipo = NULL;
   1064 
   1065 	/*
   1066 	 * this io_u is from a requeue, we already filled the offsets
   1067 	 */
   1068 	if (io_u->file)
   1069 		return 0;
   1070 
   1071 	if (!RB_EMPTY_ROOT(&td->io_hist_tree)) {
   1072 		struct rb_node *n = rb_first(&td->io_hist_tree);
   1073 
   1074 		ipo = rb_entry(n, struct io_piece, rb_node);
   1075 
   1076 		/*
   1077 		 * Ensure that the associated IO has completed
   1078 		 */
   1079 		read_barrier();
   1080 		if (ipo->flags & IP_F_IN_FLIGHT)
   1081 			goto nothing;
   1082 
   1083 		rb_erase(n, &td->io_hist_tree);
   1084 		assert(ipo->flags & IP_F_ONRB);
   1085 		ipo->flags &= ~IP_F_ONRB;
   1086 	} else if (!flist_empty(&td->io_hist_list)) {
   1087 		ipo = flist_first_entry(&td->io_hist_list, struct io_piece, list);
   1088 
   1089 		/*
   1090 		 * Ensure that the associated IO has completed
   1091 		 */
   1092 		read_barrier();
   1093 		if (ipo->flags & IP_F_IN_FLIGHT)
   1094 			goto nothing;
   1095 
   1096 		flist_del(&ipo->list);
   1097 		assert(ipo->flags & IP_F_ONLIST);
   1098 		ipo->flags &= ~IP_F_ONLIST;
   1099 	}
   1100 
   1101 	if (ipo) {
   1102 		td->io_hist_len--;
   1103 
   1104 		io_u->offset = ipo->offset;
   1105 		io_u->buflen = ipo->len;
   1106 		io_u->numberio = ipo->numberio;
   1107 		io_u->file = ipo->file;
   1108 		io_u->flags |= IO_U_F_VER_LIST;
   1109 
   1110 		if (ipo->flags & IP_F_TRIMMED)
   1111 			io_u->flags |= IO_U_F_TRIMMED;
   1112 
   1113 		if (!fio_file_open(io_u->file)) {
   1114 			int r = td_io_open_file(td, io_u->file);
   1115 
   1116 			if (r) {
   1117 				dprint(FD_VERIFY, "failed file %s open\n",
   1118 						io_u->file->file_name);
   1119 				return 1;
   1120 			}
   1121 		}
   1122 
   1123 		get_file(ipo->file);
   1124 		assert(fio_file_open(io_u->file));
   1125 		io_u->ddir = DDIR_READ;
   1126 		io_u->xfer_buf = io_u->buf;
   1127 		io_u->xfer_buflen = io_u->buflen;
   1128 
   1129 		remove_trim_entry(td, ipo);
   1130 		free(ipo);
   1131 		dprint(FD_VERIFY, "get_next_verify: ret io_u %p\n", io_u);
   1132 
   1133 		if (!td->o.verify_pattern_bytes) {
   1134 			io_u->rand_seed = __rand(&td->verify_state);
   1135 			if (sizeof(int) != sizeof(long *))
   1136 				io_u->rand_seed *= __rand(&td->verify_state);
   1137 		}
   1138 		return 0;
   1139 	}
   1140 
   1141 nothing:
   1142 	dprint(FD_VERIFY, "get_next_verify: empty\n");
   1143 	return 1;
   1144 }
   1145 
   1146 void fio_verify_init(struct thread_data *td)
   1147 {
   1148 	if (td->o.verify == VERIFY_CRC32C_INTEL ||
   1149 	    td->o.verify == VERIFY_CRC32C) {
   1150 		crc32c_intel_probe();
   1151 	}
   1152 }
   1153 
   1154 static void *verify_async_thread(void *data)
   1155 {
   1156 	struct thread_data *td = data;
   1157 	struct io_u *io_u;
   1158 	int ret = 0;
   1159 
   1160 	if (fio_option_is_set(&td->o, verify_cpumask) &&
   1161 	    fio_setaffinity(td->pid, td->o.verify_cpumask)) {
   1162 		log_err("fio: failed setting verify thread affinity\n");
   1163 		goto done;
   1164 	}
   1165 
   1166 	do {
   1167 		FLIST_HEAD(list);
   1168 
   1169 		read_barrier();
   1170 		if (td->verify_thread_exit)
   1171 			break;
   1172 
   1173 		pthread_mutex_lock(&td->io_u_lock);
   1174 
   1175 		while (flist_empty(&td->verify_list) &&
   1176 		       !td->verify_thread_exit) {
   1177 			ret = pthread_cond_wait(&td->verify_cond,
   1178 							&td->io_u_lock);
   1179 			if (ret) {
   1180 				pthread_mutex_unlock(&td->io_u_lock);
   1181 				break;
   1182 			}
   1183 		}
   1184 
   1185 		flist_splice_init(&td->verify_list, &list);
   1186 		pthread_mutex_unlock(&td->io_u_lock);
   1187 
   1188 		if (flist_empty(&list))
   1189 			continue;
   1190 
   1191 		while (!flist_empty(&list)) {
   1192 			io_u = flist_first_entry(&list, struct io_u, verify_list);
   1193 			flist_del_init(&io_u->verify_list);
   1194 
   1195 			io_u->flags |= IO_U_F_NO_FILE_PUT;
   1196 			ret = verify_io_u(td, &io_u);
   1197 
   1198 			put_io_u(td, io_u);
   1199 			if (!ret)
   1200 				continue;
   1201 			if (td_non_fatal_error(td, ERROR_TYPE_VERIFY_BIT, ret)) {
   1202 				update_error_count(td, ret);
   1203 				td_clear_error(td);
   1204 				ret = 0;
   1205 			}
   1206 		}
   1207 	} while (!ret);
   1208 
   1209 	if (ret) {
   1210 		td_verror(td, ret, "async_verify");
   1211 		if (td->o.verify_fatal)
   1212 			fio_mark_td_terminate(td);
   1213 	}
   1214 
   1215 done:
   1216 	pthread_mutex_lock(&td->io_u_lock);
   1217 	td->nr_verify_threads--;
   1218 	pthread_mutex_unlock(&td->io_u_lock);
   1219 
   1220 	pthread_cond_signal(&td->free_cond);
   1221 	return NULL;
   1222 }
   1223 
   1224 int verify_async_init(struct thread_data *td)
   1225 {
   1226 	int i, ret;
   1227 	pthread_attr_t attr;
   1228 
   1229 	pthread_attr_init(&attr);
   1230 	pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN);
   1231 
   1232 	td->verify_thread_exit = 0;
   1233 
   1234 	td->verify_threads = malloc(sizeof(pthread_t) * td->o.verify_async);
   1235 	for (i = 0; i < td->o.verify_async; i++) {
   1236 		ret = pthread_create(&td->verify_threads[i], &attr,
   1237 					verify_async_thread, td);
   1238 		if (ret) {
   1239 			log_err("fio: async verify creation failed: %s\n",
   1240 					strerror(ret));
   1241 			break;
   1242 		}
   1243 		ret = pthread_detach(td->verify_threads[i]);
   1244 		if (ret) {
   1245 			log_err("fio: async verify thread detach failed: %s\n",
   1246 					strerror(ret));
   1247 			break;
   1248 		}
   1249 		td->nr_verify_threads++;
   1250 	}
   1251 
   1252 	pthread_attr_destroy(&attr);
   1253 
   1254 	if (i != td->o.verify_async) {
   1255 		log_err("fio: only %d verify threads started, exiting\n", i);
   1256 		td->verify_thread_exit = 1;
   1257 		write_barrier();
   1258 		pthread_cond_broadcast(&td->verify_cond);
   1259 		return 1;
   1260 	}
   1261 
   1262 	return 0;
   1263 }
   1264 
   1265 void verify_async_exit(struct thread_data *td)
   1266 {
   1267 	td->verify_thread_exit = 1;
   1268 	write_barrier();
   1269 	pthread_cond_broadcast(&td->verify_cond);
   1270 
   1271 	pthread_mutex_lock(&td->io_u_lock);
   1272 
   1273 	while (td->nr_verify_threads)
   1274 		pthread_cond_wait(&td->free_cond, &td->io_u_lock);
   1275 
   1276 	pthread_mutex_unlock(&td->io_u_lock);
   1277 	free(td->verify_threads);
   1278 	td->verify_threads = NULL;
   1279 }
   1280 
   1281 struct all_io_list *get_all_io_list(int save_mask, size_t *sz)
   1282 {
   1283 	struct all_io_list *rep;
   1284 	struct thread_data *td;
   1285 	size_t depth;
   1286 	void *next;
   1287 	int i, nr;
   1288 
   1289 	compiletime_assert(sizeof(struct all_io_list) == 8, "all_io_list");
   1290 
   1291 	/*
   1292 	 * Calculate reply space needed. We need one 'io_state' per thread,
   1293 	 * and the size will vary depending on depth.
   1294 	 */
   1295 	depth = 0;
   1296 	nr = 0;
   1297 	for_each_td(td, i) {
   1298 		if (save_mask != IO_LIST_ALL && (i + 1) != save_mask)
   1299 			continue;
   1300 		td->stop_io = 1;
   1301 		td->flags |= TD_F_VSTATE_SAVED;
   1302 		depth += td->o.iodepth;
   1303 		nr++;
   1304 	}
   1305 
   1306 	if (!nr)
   1307 		return NULL;
   1308 
   1309 	*sz = sizeof(*rep);
   1310 	*sz += nr * sizeof(struct thread_io_list);
   1311 	*sz += depth * sizeof(uint64_t);
   1312 	rep = malloc(*sz);
   1313 
   1314 	rep->threads = cpu_to_le64((uint64_t) nr);
   1315 
   1316 	next = &rep->state[0];
   1317 	for_each_td(td, i) {
   1318 		struct thread_io_list *s = next;
   1319 		unsigned int comps;
   1320 
   1321 		if (save_mask != IO_LIST_ALL && (i + 1) != save_mask)
   1322 			continue;
   1323 
   1324 		if (td->last_write_comp) {
   1325 			int j, k;
   1326 
   1327 			if (td->io_blocks[DDIR_WRITE] < td->o.iodepth)
   1328 				comps = td->io_blocks[DDIR_WRITE];
   1329 			else
   1330 				comps = td->o.iodepth;
   1331 
   1332 			k = td->last_write_idx - 1;
   1333 			for (j = 0; j < comps; j++) {
   1334 				if (k == -1)
   1335 					k = td->o.iodepth - 1;
   1336 				s->offsets[j] = cpu_to_le64(td->last_write_comp[k]);
   1337 				k--;
   1338 			}
   1339 		} else
   1340 			comps = 0;
   1341 
   1342 		s->no_comps = cpu_to_le64((uint64_t) comps);
   1343 		s->depth = cpu_to_le64((uint64_t) td->o.iodepth);
   1344 		s->numberio = cpu_to_le64((uint64_t) td->io_issues[DDIR_WRITE]);
   1345 		s->index = cpu_to_le64((uint64_t) i);
   1346 		s->rand.s[0] = cpu_to_le32(td->random_state.s1);
   1347 		s->rand.s[1] = cpu_to_le32(td->random_state.s2);
   1348 		s->rand.s[2] = cpu_to_le32(td->random_state.s3);
   1349 		s->rand.s[3] = 0;
   1350 		s->name[sizeof(s->name) - 1] = '\0';
   1351 		strncpy((char *) s->name, td->o.name, sizeof(s->name) - 1);
   1352 		next = io_list_next(s);
   1353 	}
   1354 
   1355 	return rep;
   1356 }
   1357 
   1358 static int open_state_file(const char *name, const char *prefix, int num,
   1359 			   int for_write)
   1360 {
   1361 	char out[64];
   1362 	int flags;
   1363 	int fd;
   1364 
   1365 	if (for_write)
   1366 		flags = O_CREAT | O_TRUNC | O_WRONLY | O_SYNC;
   1367 	else
   1368 		flags = O_RDONLY;
   1369 
   1370 	verify_state_gen_name(out, sizeof(out), name, prefix, num);
   1371 
   1372 	fd = open(out, flags, 0644);
   1373 	if (fd == -1) {
   1374 		perror("fio: open state file");
   1375 		return -1;
   1376 	}
   1377 
   1378 	return fd;
   1379 }
   1380 
   1381 static int write_thread_list_state(struct thread_io_list *s,
   1382 				   const char *prefix)
   1383 {
   1384 	struct verify_state_hdr hdr;
   1385 	uint64_t crc;
   1386 	ssize_t ret;
   1387 	int fd;
   1388 
   1389 	fd = open_state_file((const char *) s->name, prefix, s->index, 1);
   1390 	if (fd == -1)
   1391 		return 1;
   1392 
   1393 	crc = fio_crc32c((void *)s, thread_io_list_sz(s));
   1394 
   1395 	hdr.version = cpu_to_le64((uint64_t) VSTATE_HDR_VERSION);
   1396 	hdr.size = cpu_to_le64((uint64_t) thread_io_list_sz(s));
   1397 	hdr.crc = cpu_to_le64(crc);
   1398 	ret = write(fd, &hdr, sizeof(hdr));
   1399 	if (ret != sizeof(hdr))
   1400 		goto write_fail;
   1401 
   1402 	ret = write(fd, s, thread_io_list_sz(s));
   1403 	if (ret != thread_io_list_sz(s)) {
   1404 write_fail:
   1405 		if (ret < 0)
   1406 			perror("fio: write state file");
   1407 		log_err("fio: failed to write state file\n");
   1408 		ret = 1;
   1409 	} else
   1410 		ret = 0;
   1411 
   1412 	close(fd);
   1413 	return ret;
   1414 }
   1415 
   1416 void __verify_save_state(struct all_io_list *state, const char *prefix)
   1417 {
   1418 	struct thread_io_list *s = &state->state[0];
   1419 	unsigned int i;
   1420 
   1421 	for (i = 0; i < le64_to_cpu(state->threads); i++) {
   1422 		write_thread_list_state(s,  prefix);
   1423 		s = io_list_next(s);
   1424 	}
   1425 }
   1426 
   1427 void verify_save_state(void)
   1428 {
   1429 	struct all_io_list *state;
   1430 	size_t sz;
   1431 
   1432 	state = get_all_io_list(IO_LIST_ALL, &sz);
   1433 	if (state) {
   1434 		__verify_save_state(state, "local");
   1435 		free(state);
   1436 	}
   1437 }
   1438 
   1439 void verify_free_state(struct thread_data *td)
   1440 {
   1441 	if (td->vstate)
   1442 		free(td->vstate);
   1443 }
   1444 
   1445 void verify_convert_assign_state(struct thread_data *td,
   1446 				 struct thread_io_list *s)
   1447 {
   1448 	int i;
   1449 
   1450 	s->no_comps = le64_to_cpu(s->no_comps);
   1451 	s->depth = le64_to_cpu(s->depth);
   1452 	s->numberio = le64_to_cpu(s->numberio);
   1453 	for (i = 0; i < 4; i++)
   1454 		s->rand.s[i] = le32_to_cpu(s->rand.s[i]);
   1455 	for (i = 0; i < s->no_comps; i++)
   1456 		s->offsets[i] = le64_to_cpu(s->offsets[i]);
   1457 
   1458 	td->vstate = s;
   1459 }
   1460 
   1461 int verify_state_hdr(struct verify_state_hdr *hdr, struct thread_io_list *s)
   1462 {
   1463 	uint64_t crc;
   1464 
   1465 	hdr->version = le64_to_cpu(hdr->version);
   1466 	hdr->size = le64_to_cpu(hdr->size);
   1467 	hdr->crc = le64_to_cpu(hdr->crc);
   1468 
   1469 	if (hdr->version != VSTATE_HDR_VERSION)
   1470 		return 1;
   1471 
   1472 	crc = fio_crc32c((void *)s, hdr->size);
   1473 	if (crc != hdr->crc)
   1474 		return 1;
   1475 
   1476 	return 0;
   1477 }
   1478 
   1479 int verify_load_state(struct thread_data *td, const char *prefix)
   1480 {
   1481 	struct thread_io_list *s = NULL;
   1482 	struct verify_state_hdr hdr;
   1483 	uint64_t crc;
   1484 	ssize_t ret;
   1485 	int fd;
   1486 
   1487 	if (!td->o.verify_state)
   1488 		return 0;
   1489 
   1490 	fd = open_state_file(td->o.name, prefix, td->thread_number - 1, 0);
   1491 	if (fd == -1)
   1492 		return 1;
   1493 
   1494 	ret = read(fd, &hdr, sizeof(hdr));
   1495 	if (ret != sizeof(hdr)) {
   1496 		if (ret < 0)
   1497 			td_verror(td, errno, "read verify state hdr");
   1498 		log_err("fio: failed reading verify state header\n");
   1499 		goto err;
   1500 	}
   1501 
   1502 	hdr.version = le64_to_cpu(hdr.version);
   1503 	hdr.size = le64_to_cpu(hdr.size);
   1504 	hdr.crc = le64_to_cpu(hdr.crc);
   1505 
   1506 	if (hdr.version != VSTATE_HDR_VERSION) {
   1507 		log_err("fio: bad version in verify state header\n");
   1508 		goto err;
   1509 	}
   1510 
   1511 	s = malloc(hdr.size);
   1512 	ret = read(fd, s, hdr.size);
   1513 	if (ret != hdr.size) {
   1514 		if (ret < 0)
   1515 			td_verror(td, errno, "read verify state");
   1516 		log_err("fio: failed reading verity state\n");
   1517 		goto err;
   1518 	}
   1519 
   1520 	crc = fio_crc32c((void *)s, hdr.size);
   1521 	if (crc != hdr.crc) {
   1522 		log_err("fio: verify state is corrupt\n");
   1523 		goto err;
   1524 	}
   1525 
   1526 	close(fd);
   1527 
   1528 	verify_convert_assign_state(td, s);
   1529 	return 0;
   1530 err:
   1531 	if (s)
   1532 		free(s);
   1533 	close(fd);
   1534 	return 1;
   1535 }
   1536 
   1537 /*
   1538  * Use the loaded verify state to know when to stop doing verification
   1539  */
   1540 int verify_state_should_stop(struct thread_data *td, struct io_u *io_u)
   1541 {
   1542 	struct thread_io_list *s = td->vstate;
   1543 	int i;
   1544 
   1545 	if (!s)
   1546 		return 0;
   1547 
   1548 	/*
   1549 	 * If we're not into the window of issues - depth yet, continue. If
   1550 	 * issue is shorter than depth, do check.
   1551 	 */
   1552 	if ((td->io_blocks[DDIR_READ] < s->depth ||
   1553 	    s->numberio - td->io_blocks[DDIR_READ] > s->depth) &&
   1554 	    s->numberio > s->depth)
   1555 		return 0;
   1556 
   1557 	/*
   1558 	 * We're in the window of having to check if this io was
   1559 	 * completed or not. If the IO was seen as completed, then
   1560 	 * lets verify it.
   1561 	 */
   1562 	for (i = 0; i < s->no_comps; i++)
   1563 		if (io_u->offset == s->offsets[i])
   1564 			return 0;
   1565 
   1566 	/*
   1567 	 * Not found, we have to stop
   1568 	 */
   1569 	return 1;
   1570 }
   1571