+
+ if (ret && verify_type != hdr->verify_type)
+ log_err("fio: verify type mismatch (%u media, %u given)\n",
+ hdr->verify_type, verify_type);
+ }
+
+done:
+ if (ret && td->o.verify_fatal)
+ fio_mark_td_terminate(td);
+
+ return ret;
+}
+
+static void fill_xxhash(struct verify_header *hdr, void *p, unsigned int len)
+{
+ struct vhdr_xxhash *vh = hdr_priv(hdr);
+ void *state;
+
+ state = XXH32_init(1);
+ XXH32_update(state, p, len);
+ vh->hash = XXH32_digest(state);
+}
+
+static void fill_sha3(struct fio_sha3_ctx *sha3_ctx, void *p, unsigned int len)
+{
+ fio_sha3_update(sha3_ctx, p, len);
+ fio_sha3_final(sha3_ctx);
+}
+
+static void fill_sha3_224(struct verify_header *hdr, void *p, unsigned int len)
+{
+ struct vhdr_sha3_224 *vh = hdr_priv(hdr);
+ struct fio_sha3_ctx sha3_ctx = {
+ .sha = vh->sha,
+ };
+
+ fio_sha3_224_init(&sha3_ctx);
+ fill_sha3(&sha3_ctx, p, len);
+}
+
+static void fill_sha3_256(struct verify_header *hdr, void *p, unsigned int len)
+{
+ struct vhdr_sha3_256 *vh = hdr_priv(hdr);
+ struct fio_sha3_ctx sha3_ctx = {
+ .sha = vh->sha,
+ };
+
+ fio_sha3_256_init(&sha3_ctx);
+ fill_sha3(&sha3_ctx, p, len);
+}
+
+static void fill_sha3_384(struct verify_header *hdr, void *p, unsigned int len)
+{
+ struct vhdr_sha3_384 *vh = hdr_priv(hdr);
+ struct fio_sha3_ctx sha3_ctx = {
+ .sha = vh->sha,
+ };
+
+ fio_sha3_384_init(&sha3_ctx);
+ fill_sha3(&sha3_ctx, p, len);
+}
+
+static void fill_sha3_512(struct verify_header *hdr, void *p, unsigned int len)
+{
+ struct vhdr_sha3_512 *vh = hdr_priv(hdr);
+ struct fio_sha3_ctx sha3_ctx = {
+ .sha = vh->sha,
+ };
+
+ fio_sha3_512_init(&sha3_ctx);
+ fill_sha3(&sha3_ctx, p, len);
+}
+
+static void fill_sha512(struct verify_header *hdr, void *p, unsigned int len)
+{
+ struct vhdr_sha512 *vh = hdr_priv(hdr);
+ struct fio_sha512_ctx sha512_ctx = {
+ .buf = vh->sha512,
+ };
+
+ fio_sha512_init(&sha512_ctx);
+ fio_sha512_update(&sha512_ctx, p, len);
+}
+
+static void fill_sha256(struct verify_header *hdr, void *p, unsigned int len)
+{
+ struct vhdr_sha256 *vh = hdr_priv(hdr);
+ struct fio_sha256_ctx sha256_ctx = {
+ .buf = vh->sha256,
+ };
+
+ fio_sha256_init(&sha256_ctx);
+ fio_sha256_update(&sha256_ctx, p, len);
+ fio_sha256_final(&sha256_ctx);
+}
+
+static void fill_sha1(struct verify_header *hdr, void *p, unsigned int len)
+{
+ struct vhdr_sha1 *vh = hdr_priv(hdr);
+ struct fio_sha1_ctx sha1_ctx = {
+ .H = vh->sha1,
+ };
+
+ fio_sha1_init(&sha1_ctx);
+ fio_sha1_update(&sha1_ctx, p, len);
+ fio_sha1_final(&sha1_ctx);
+}
+
+static void fill_crc7(struct verify_header *hdr, void *p, unsigned int len)
+{
+ struct vhdr_crc7 *vh = hdr_priv(hdr);
+
+ vh->crc7 = fio_crc7(p, len);
+}
+
+static void fill_crc16(struct verify_header *hdr, void *p, unsigned int len)
+{
+ struct vhdr_crc16 *vh = hdr_priv(hdr);
+
+ vh->crc16 = fio_crc16(p, len);
+}
+
+static void fill_crc32(struct verify_header *hdr, void *p, unsigned int len)
+{
+ struct vhdr_crc32 *vh = hdr_priv(hdr);
+
+ vh->crc32 = fio_crc32(p, len);
+}
+
+static void fill_crc32c(struct verify_header *hdr, void *p, unsigned int len)
+{
+ struct vhdr_crc32 *vh = hdr_priv(hdr);
+
+ vh->crc32 = fio_crc32c(p, len);
+}
+
+static void fill_crc64(struct verify_header *hdr, void *p, unsigned int len)
+{
+ struct vhdr_crc64 *vh = hdr_priv(hdr);
+
+ vh->crc64 = fio_crc64(p, len);
+}
+
+static void fill_md5(struct verify_header *hdr, void *p, unsigned int len)
+{
+ struct vhdr_md5 *vh = hdr_priv(hdr);
+ struct fio_md5_ctx md5_ctx = {
+ .hash = (uint32_t *) vh->md5_digest,
+ };
+
+ fio_md5_init(&md5_ctx);
+ fio_md5_update(&md5_ctx, p, len);
+ fio_md5_final(&md5_ctx);
+}
+
+static void __fill_hdr(struct thread_data *td, struct io_u *io_u,
+ struct verify_header *hdr, unsigned int header_num,
+ unsigned int header_len, uint64_t rand_seed)
+{
+ void *p = hdr;
+
+ hdr->magic = FIO_HDR_MAGIC;
+ hdr->verify_type = td->o.verify;
+ hdr->len = header_len;
+ hdr->rand_seed = rand_seed;
+ hdr->offset = io_u->offset + header_num * td->o.verify_interval;
+ hdr->time_sec = io_u->start_time.tv_sec;
+ hdr->time_usec = io_u->start_time.tv_nsec / 1000;
+ hdr->thread = td->thread_number;
+ hdr->numberio = io_u->numberio;
+ hdr->crc32 = fio_crc32c(p, offsetof(struct verify_header, crc32));
+}
+
+
+static void fill_hdr(struct thread_data *td, struct io_u *io_u,
+ struct verify_header *hdr, unsigned int header_num,
+ unsigned int header_len, uint64_t rand_seed)
+{
+
+ if (td->o.verify != VERIFY_PATTERN_NO_HDR)
+ __fill_hdr(td, io_u, hdr, header_num, header_len, rand_seed);
+}
+
+static void populate_hdr(struct thread_data *td, struct io_u *io_u,
+ struct verify_header *hdr, unsigned int header_num,
+ unsigned int header_len)
+{
+ unsigned int data_len;
+ void *data;
+ char *p;
+
+ p = (char *) hdr;
+
+ fill_hdr(td, io_u, hdr, header_num, header_len, io_u->rand_seed);
+
+ data_len = header_len - hdr_size(td, hdr);
+
+ data = p + hdr_size(td, hdr);
+ switch (td->o.verify) {
+ case VERIFY_MD5:
+ dprint(FD_VERIFY, "fill md5 io_u %p, len %u\n",
+ io_u, hdr->len);
+ fill_md5(hdr, data, data_len);
+ break;
+ case VERIFY_CRC64:
+ dprint(FD_VERIFY, "fill crc64 io_u %p, len %u\n",
+ io_u, hdr->len);
+ fill_crc64(hdr, data, data_len);
+ break;
+ case VERIFY_CRC32C:
+ case VERIFY_CRC32C_INTEL:
+ dprint(FD_VERIFY, "fill crc32c io_u %p, len %u\n",
+ io_u, hdr->len);
+ fill_crc32c(hdr, data, data_len);
+ break;
+ case VERIFY_CRC32:
+ dprint(FD_VERIFY, "fill crc32 io_u %p, len %u\n",
+ io_u, hdr->len);
+ fill_crc32(hdr, data, data_len);
+ break;
+ case VERIFY_CRC16:
+ dprint(FD_VERIFY, "fill crc16 io_u %p, len %u\n",
+ io_u, hdr->len);
+ fill_crc16(hdr, data, data_len);
+ break;
+ case VERIFY_CRC7:
+ dprint(FD_VERIFY, "fill crc7 io_u %p, len %u\n",
+ io_u, hdr->len);
+ fill_crc7(hdr, data, data_len);
+ break;
+ case VERIFY_SHA256:
+ dprint(FD_VERIFY, "fill sha256 io_u %p, len %u\n",
+ io_u, hdr->len);
+ fill_sha256(hdr, data, data_len);
+ break;
+ case VERIFY_SHA512:
+ dprint(FD_VERIFY, "fill sha512 io_u %p, len %u\n",
+ io_u, hdr->len);
+ fill_sha512(hdr, data, data_len);
+ break;
+ case VERIFY_SHA3_224:
+ dprint(FD_VERIFY, "fill sha3-224 io_u %p, len %u\n",
+ io_u, hdr->len);
+ fill_sha3_224(hdr, data, data_len);
+ break;
+ case VERIFY_SHA3_256:
+ dprint(FD_VERIFY, "fill sha3-256 io_u %p, len %u\n",
+ io_u, hdr->len);
+ fill_sha3_256(hdr, data, data_len);
+ break;
+ case VERIFY_SHA3_384:
+ dprint(FD_VERIFY, "fill sha3-384 io_u %p, len %u\n",
+ io_u, hdr->len);
+ fill_sha3_384(hdr, data, data_len);
+ break;
+ case VERIFY_SHA3_512:
+ dprint(FD_VERIFY, "fill sha3-512 io_u %p, len %u\n",
+ io_u, hdr->len);
+ fill_sha3_512(hdr, data, data_len);
+ break;
+ case VERIFY_XXHASH:
+ dprint(FD_VERIFY, "fill xxhash io_u %p, len %u\n",
+ io_u, hdr->len);
+ fill_xxhash(hdr, data, data_len);
+ break;
+ case VERIFY_SHA1:
+ dprint(FD_VERIFY, "fill sha1 io_u %p, len %u\n",
+ io_u, hdr->len);
+ fill_sha1(hdr, data, data_len);
+ break;
+ case VERIFY_HDR_ONLY:
+ case VERIFY_PATTERN:
+ case VERIFY_PATTERN_NO_HDR:
+ /* nothing to do here */
+ break;
+ default:
+ log_err("fio: bad verify type: %d\n", td->o.verify);
+ assert(0);