1e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe/* 2e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * IO verification helpers 3e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe */ 4e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe#include <unistd.h> 5e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe#include <fcntl.h> 6e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe#include <string.h> 797af62cec418cd722fb43c6010d6430534e12353Jens Axboe#include <assert.h> 8e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe#include <pthread.h> 979402a12eecf371238f2326c9e8850eedd269b7fJens Axboe#include <libgen.h> 10e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 11e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe#include "fio.h" 124f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe#include "verify.h" 130d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe#include "trim.h" 14637ef8d9f7645135cf4829894d1e3983cd7a042eJens Axboe#include "lib/rand.h" 1551aa2da8cf422a06ddfa1ce673f3bfc03f96b86eJens Axboe#include "lib/hweight.h" 16e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 17eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/md5.h" 18eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc64.h" 19eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc32.h" 20bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe#include "crc/crc32c.h" 21eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc16.h" 22eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc7.h" 23eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/sha256.h" 24eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/sha512.h" 257c353ceb3257b132f4c98326046b42201e070731Jens Axboe#include "crc/sha1.h" 26844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe#include "crc/xxhash.h" 27cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 287d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void populate_hdr(struct thread_data *td, struct io_u *io_u, 297d9fb455aadc0c0363489591775496f27f4a560aJens Axboe struct verify_header *hdr, unsigned int header_num, 307d9fb455aadc0c0363489591775496f27f4a560aJens Axboe unsigned int header_len); 317d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 32ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboevoid fill_buffer_pattern(struct thread_data *td, void *p, unsigned int len) 33ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe{ 34d18c04151dc0ab322067e604596cbd6d66845c27Jens Axboe fill_pattern(p, len, td->o.buffer_pattern, td->o.buffer_pattern_bytes); 35ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe} 36ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe 372d613fe1751d83d21de3107c2023df55edc9c141Jens Axboevoid __fill_buffer(struct thread_options *o, unsigned long seed, void *p, 382d613fe1751d83d21de3107c2023df55edc9c141Jens Axboe unsigned int len) 392d613fe1751d83d21de3107c2023df55edc9c141Jens Axboe{ 402d613fe1751d83d21de3107c2023df55edc9c141Jens Axboe __fill_random_buf_percentage(seed, p, o->compress_percentage, len, len, o->buffer_pattern, o->buffer_pattern_bytes); 412d613fe1751d83d21de3107c2023df55edc9c141Jens Axboe} 422d613fe1751d83d21de3107c2023df55edc9c141Jens Axboe 432d613fe1751d83d21de3107c2023df55edc9c141Jens Axboeunsigned long fill_buffer(struct thread_data *td, void *p, unsigned int len) 442d613fe1751d83d21de3107c2023df55edc9c141Jens Axboe{ 452d613fe1751d83d21de3107c2023df55edc9c141Jens Axboe struct frand_state *fs = &td->verify_state; 462d613fe1751d83d21de3107c2023df55edc9c141Jens Axboe struct thread_options *o = &td->o; 472d613fe1751d83d21de3107c2023df55edc9c141Jens Axboe 482d613fe1751d83d21de3107c2023df55edc9c141Jens Axboe return fill_random_buf_percentage(fs, p, o->compress_percentage, len, len, o->buffer_pattern, o->buffer_pattern_bytes); 492d613fe1751d83d21de3107c2023df55edc9c141Jens Axboe} 502d613fe1751d83d21de3107c2023df55edc9c141Jens Axboe 51ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboevoid fill_verify_pattern(struct thread_data *td, void *p, unsigned int len, 52ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe struct io_u *io_u, unsigned long seed, int use_seed) 53ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe{ 54e1457298d009911f05a1860f3bd15ea54f019984Jens Axboe struct thread_options *o = &td->o; 55e1457298d009911f05a1860f3bd15ea54f019984Jens Axboe 56e1457298d009911f05a1860f3bd15ea54f019984Jens Axboe if (!o->verify_pattern_bytes) { 57ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe dprint(FD_VERIFY, "fill random bytes len=%u\n", len); 58ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe 59ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe if (use_seed) 602d613fe1751d83d21de3107c2023df55edc9c141Jens Axboe __fill_buffer(o, seed, p, len); 612d613fe1751d83d21de3107c2023df55edc9c141Jens Axboe else 622d613fe1751d83d21de3107c2023df55edc9c141Jens Axboe io_u->rand_seed = fill_buffer(td, p, len); 63ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe return; 64ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe } 65c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat 66ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe if (io_u->buf_filled_len >= len) { 67ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe dprint(FD_VERIFY, "using already filled verify pattern b=%d len=%u\n", 68e1457298d009911f05a1860f3bd15ea54f019984Jens Axboe o->verify_pattern_bytes, len); 69ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe return; 70ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe } 71ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe 72e1457298d009911f05a1860f3bd15ea54f019984Jens Axboe fill_pattern(p, len, o->verify_pattern, o->verify_pattern_bytes); 73ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe io_u->buf_filled_len = len; 74ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe} 75ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe 76cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboestatic unsigned int get_hdr_inc(struct thread_data *td, struct io_u *io_u) 77cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe{ 78cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe unsigned int hdr_inc; 79cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe 80cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe hdr_inc = io_u->buflen; 818a99fdf63e1350fc2c35794e1c1f779885905b29Jens Axboe if (td->o.verify_interval && td->o.verify_interval <= io_u->buflen) 82cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe hdr_inc = td->o.verify_interval; 83cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe 84cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe return hdr_inc; 85cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe} 86cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe 87c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboestatic void fill_pattern_headers(struct thread_data *td, struct io_u *io_u, 88c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe unsigned long seed, int use_seed) 89c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe{ 90c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe unsigned int hdr_inc, header_num; 91c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe struct verify_header *hdr; 92c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe void *p = io_u->buf; 93c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe 94ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe fill_verify_pattern(td, p, io_u->buflen, io_u, seed, use_seed); 95c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe 96cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe hdr_inc = get_hdr_inc(td, io_u); 97c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe header_num = 0; 98c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe for (; p < io_u->buf + io_u->buflen; p += hdr_inc) { 99c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe hdr = p; 100c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe populate_hdr(td, io_u, hdr, header_num, hdr_inc); 101c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe header_num++; 102c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe } 103c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe} 104c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe 1054764aec9fe5988281bdc114c13ac771fb16713ccJens Axboestatic void memswp(void *buf1, void *buf2, unsigned int len) 106546a9142511875524850ac92776184fd9fb7196eShawn Lewis{ 107dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis char swap[200]; 108dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis 109dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis assert(len <= sizeof(swap)); 11090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe 111546a9142511875524850ac92776184fd9fb7196eShawn Lewis memcpy(&swap, buf1, len); 112546a9142511875524850ac92776184fd9fb7196eShawn Lewis memcpy(buf1, buf2, len); 113546a9142511875524850ac92776184fd9fb7196eShawn Lewis memcpy(buf2, &swap, len); 114546a9142511875524850ac92776184fd9fb7196eShawn Lewis} 115546a9142511875524850ac92776184fd9fb7196eShawn Lewis 116e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void hexdump(void *buffer, int len) 117e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 118e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe unsigned char *p = buffer; 119e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe int i; 120e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 121e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe for (i = 0; i < len; i++) 122bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_err("%02x", p[i]); 123bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_err("\n"); 124e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 125e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 126d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe/* 127de8f6de97438d5664cd8765e60102b9109a273e2Anatol Pomozov * Prepare for separation of verify_header and checksum header 1288767783245faac99a7e1c330a1d6536e579c8402Jens Axboe */ 129546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic inline unsigned int __hdr_size(int verify_type) 1308767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{ 13103e20d687566753b90383571e5e152c5142bdffdBruce Cran unsigned int len = 0; 1328767783245faac99a7e1c330a1d6536e579c8402Jens Axboe 133546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe switch (verify_type) { 134546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_NONE: 135546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_NULL: 136546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = 0; 137546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 138546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_MD5: 139546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_md5); 140546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 141546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC64: 142546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc64); 143546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 144bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe case VERIFY_CRC32C: 145546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC32: 1463845591fadea480177223e28c9d1c03642d34f0eJens Axboe case VERIFY_CRC32C_INTEL: 147546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc32); 148546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 149546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC16: 150546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc16); 151546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 152546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC7: 153546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc7); 154546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 155546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_SHA256: 156546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_sha256); 157546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 158546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_SHA512: 159546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_sha512); 160546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 161844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe case VERIFY_XXHASH: 162844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe len = sizeof(struct vhdr_xxhash); 163844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe break; 1647437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis case VERIFY_META: 1657437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis len = sizeof(struct vhdr_meta); 1667437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis break; 1677c353ceb3257b132f4c98326046b42201e070731Jens Axboe case VERIFY_SHA1: 1687c353ceb3257b132f4c98326046b42201e070731Jens Axboe len = sizeof(struct vhdr_sha1); 1697c353ceb3257b132f4c98326046b42201e070731Jens Axboe break; 17092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe case VERIFY_PATTERN: 17192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe len = 0; 17292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe break; 173546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe default: 174546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe log_err("fio: unknown verify header!\n"); 175546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe assert(0); 176546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe } 177546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 178546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe return len + sizeof(struct verify_header); 1798767783245faac99a7e1c330a1d6536e579c8402Jens Axboe} 1808767783245faac99a7e1c330a1d6536e579c8402Jens Axboe 1818767783245faac99a7e1c330a1d6536e579c8402Jens Axboestatic inline unsigned int hdr_size(struct verify_header *hdr) 1828767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{ 183546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe return __hdr_size(hdr->verify_type); 184546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe} 185546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 186546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic void *hdr_priv(struct verify_header *hdr) 187546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe{ 188546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe void *priv = hdr; 189546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 190546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe return priv + sizeof(struct verify_header); 1918767783245faac99a7e1c330a1d6536e579c8402Jens Axboe} 1928767783245faac99a7e1c330a1d6536e579c8402Jens Axboe 1938767783245faac99a7e1c330a1d6536e579c8402Jens Axboe/* 194936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * Verify container, pass info to verify handlers and allow them to 195936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * pass info back in case of error 196936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe */ 197936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestruct vcont { 198936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe /* 199936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * Input 200936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe */ 201936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe struct io_u *io_u; 202936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe unsigned int hdr_num; 2037d9fb455aadc0c0363489591775496f27f4a560aJens Axboe struct thread_data *td; 204936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe 205936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe /* 206936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * Output, only valid in case of error 207936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe */ 208bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe const char *name; 209bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe void *good_crc; 210bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe void *bad_crc; 211936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe unsigned int crc_len; 212936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe}; 213936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe 214dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe#define DUMP_BUF_SZ 255 215dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboestatic int dump_buf_warned; 216dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe 217c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboestatic void dump_buf(char *buf, unsigned int len, unsigned long long offset, 218c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe const char *type, struct fio_file *f) 2197d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{ 220dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe char *ptr, fname[DUMP_BUF_SZ]; 221dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe size_t buf_left = DUMP_BUF_SZ; 2227d9fb455aadc0c0363489591775496f27f4a560aJens Axboe int ret, fd; 2237d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 2246f260b317f4cec3027f79b8b329dd3f98c3906acJens Axboe ptr = strdup(f->file_name); 225c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe 226dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe fname[DUMP_BUF_SZ - 1] = '\0'; 227dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe strncpy(fname, basename(ptr), DUMP_BUF_SZ - 1); 228dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe 229dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe buf_left -= strlen(fname); 230dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe if (buf_left <= 0) { 231dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe if (!dump_buf_warned) { 232dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe log_err("fio: verify failure dump buffer too small\n"); 233dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe dump_buf_warned = 1; 234dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe } 235dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe free(ptr); 236dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe return; 237dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe } 238dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe 239dacbbb8875c09e982d59e1c1a40879af81842a42Jens Axboe snprintf(fname + strlen(fname), buf_left, ".%llu.%s", offset, type); 2407d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 2417d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fd = open(fname, O_CREAT | O_TRUNC | O_WRONLY, 0644); 2427d9fb455aadc0c0363489591775496f27f4a560aJens Axboe if (fd < 0) { 2437d9fb455aadc0c0363489591775496f27f4a560aJens Axboe perror("open verify buf file"); 2447d9fb455aadc0c0363489591775496f27f4a560aJens Axboe return; 2457d9fb455aadc0c0363489591775496f27f4a560aJens Axboe } 2467d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 2477d9fb455aadc0c0363489591775496f27f4a560aJens Axboe while (len) { 2487d9fb455aadc0c0363489591775496f27f4a560aJens Axboe ret = write(fd, buf, len); 2497d9fb455aadc0c0363489591775496f27f4a560aJens Axboe if (!ret) 2507d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 2517d9fb455aadc0c0363489591775496f27f4a560aJens Axboe else if (ret < 0) { 2527d9fb455aadc0c0363489591775496f27f4a560aJens Axboe perror("write verify buf file"); 2537d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 2547d9fb455aadc0c0363489591775496f27f4a560aJens Axboe } 2557d9fb455aadc0c0363489591775496f27f4a560aJens Axboe len -= ret; 2567d9fb455aadc0c0363489591775496f27f4a560aJens Axboe buf += ret; 2577d9fb455aadc0c0363489591775496f27f4a560aJens Axboe } 2587d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 2597d9fb455aadc0c0363489591775496f27f4a560aJens Axboe close(fd); 260c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe log_err(" %s data dumped as %s\n", type, fname); 2616f260b317f4cec3027f79b8b329dd3f98c3906acJens Axboe free(ptr); 2627d9fb455aadc0c0363489591775496f27f4a560aJens Axboe} 2637d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 264c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe/* 265c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * Dump the contents of the read block and re-generate the correct data 266c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * and dump that too. 267c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe */ 2687d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void dump_verify_buffers(struct verify_header *hdr, struct vcont *vc) 2697d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{ 2707d9fb455aadc0c0363489591775496f27f4a560aJens Axboe struct thread_data *td = vc->td; 2717d9fb455aadc0c0363489591775496f27f4a560aJens Axboe struct io_u *io_u = vc->io_u; 2727d9fb455aadc0c0363489591775496f27f4a560aJens Axboe unsigned long hdr_offset; 2737d9fb455aadc0c0363489591775496f27f4a560aJens Axboe struct io_u dummy; 274c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe void *buf; 2757d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 2760dce9bc9b21a8d91aa55a29258dfaeffc57bd466Steven Lang if (!td->o.verify_dump) 2770dce9bc9b21a8d91aa55a29258dfaeffc57bd466Steven Lang return; 2780dce9bc9b21a8d91aa55a29258dfaeffc57bd466Steven Lang 279c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe /* 280c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * Dump the contents we just read off disk 281c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe */ 2827d9fb455aadc0c0363489591775496f27f4a560aJens Axboe hdr_offset = vc->hdr_num * hdr->len; 2837d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 284c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe dump_buf(io_u->buf + hdr_offset, hdr->len, io_u->offset + hdr_offset, 285c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe "received", vc->io_u->file); 2867d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 287c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe /* 288c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * Allocate a new buf and re-generate the original data 289c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe */ 290c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe buf = malloc(io_u->buflen); 2917d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dummy = *io_u; 292c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe dummy.buf = buf; 2934aae38a645f3315ca2f8cc57a7ec4110ba7d8319Jens Axboe dummy.rand_seed = hdr->rand_seed; 294cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe dummy.buf_filled_len = 0; 2950d81daf9d164c4bf829f4911e1f7b211c2e661fbJosef Bacik dummy.buflen = io_u->buflen; 2967d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 297c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe fill_pattern_headers(td, &dummy, hdr->rand_seed, 1); 2987d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 299c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe dump_buf(buf + hdr_offset, hdr->len, io_u->offset + hdr_offset, 300c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe "expected", vc->io_u->file); 3017d9fb455aadc0c0363489591775496f27f4a560aJens Axboe free(buf); 3027d9fb455aadc0c0363489591775496f27f4a560aJens Axboe} 3037d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 304bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboestatic void log_verify_failure(struct verify_header *hdr, struct vcont *vc) 305bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe{ 306bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe unsigned long long offset; 307bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe 308bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe offset = vc->io_u->offset; 309bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe offset += vc->hdr_num * hdr->len; 31032c17adf7f75da1f0957d4691633fea60259910fJens Axboe log_err("%.8s: verify failed at file %s offset %llu, length %u\n", 31132c17adf7f75da1f0957d4691633fea60259910fJens Axboe vc->name, vc->io_u->file->file_name, offset, hdr->len); 312bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe 313bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (vc->good_crc && vc->bad_crc) { 314bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_err(" Expected CRC: "); 315bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe hexdump(vc->good_crc, vc->crc_len); 316bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_err(" Received CRC: "); 317bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe hexdump(vc->bad_crc, vc->crc_len); 318bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe } 3197d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 3207d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dump_verify_buffers(hdr, vc); 321bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe} 322bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe 323936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe/* 324d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe * Return data area 'header_num' 325d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe */ 326936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic inline void *io_u_verify_off(struct verify_header *hdr, struct vcont *vc) 327d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe{ 328936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe return vc->io_u->buf + vc->hdr_num * hdr->len + hdr_size(hdr); 329d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe} 330d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe 33192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboestatic int verify_io_u_pattern(struct verify_header *hdr, struct vcont *vc) 33292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe{ 33392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe struct thread_data *td = vc->td; 33492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe struct io_u *io_u = vc->io_u; 33592bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe char *buf, *pattern; 3362b13e716c0921356c0930522718e00b8df34293aJens Axboe unsigned int header_size = __hdr_size(td->o.verify); 3379a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang unsigned int len, mod, i, size, pattern_size; 33892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe 33992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe pattern = td->o.verify_pattern; 3409a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang pattern_size = td->o.verify_pattern_bytes; 3419a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang if (pattern_size <= 1) 3429a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang pattern_size = MAX_PATTERN_SIZE; 3432b13e716c0921356c0930522718e00b8df34293aJens Axboe buf = (void *) hdr + header_size; 3442b13e716c0921356c0930522718e00b8df34293aJens Axboe len = get_hdr_inc(td, io_u) - header_size; 3459a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang mod = header_size % pattern_size; 3469a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang 3479a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang for (i = 0; i < len; i += size) { 3489a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang size = pattern_size - mod; 3499a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang if (size > (len - i)) 3509a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang size = len - i; 3519a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang if (memcmp(buf + i, pattern + mod, size)) 352e4ad68b1364aebfe949e2d6a649c7b1001ebca07Jens Axboe /* Let the slow compare find the first mismatch byte. */ 3539a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang break; 3549a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang mod = 0; 3559a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang } 35692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe 3579a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang for (; i < len; i++) { 35892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe if (buf[i] != pattern[mod]) { 35992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe unsigned int bits; 36092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe 36192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe bits = hweight8(buf[i] ^ pattern[mod]); 36292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe log_err("fio: got pattern %x, wanted %x. Bad bits %d\n", 36392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe buf[i], pattern[mod], bits); 36492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe log_err("fio: bad pattern block offset %u\n", i); 36592bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe dump_verify_buffers(hdr, vc); 36692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe return EILSEQ; 36792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe } 36892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe mod++; 36992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe if (mod == td->o.verify_pattern_bytes) 37092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe mod = 0; 37192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe } 37292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe 37392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe return 0; 37492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe} 37592bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe 37692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboestatic int verify_io_u_meta(struct verify_header *hdr, struct vcont *vc) 3777437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{ 37892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe struct thread_data *td = vc->td; 3797437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis struct vhdr_meta *vh = hdr_priv(hdr); 380936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe struct io_u *io_u = vc->io_u; 38192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe int ret = EILSEQ; 3827437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 383bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "meta verify io_u %p, len %u\n", io_u, hdr->len); 384bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 385bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (vh->offset == io_u->offset + vc->hdr_num * td->o.verify_interval) 38692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe ret = 0; 38792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe 38892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe if (td->o.verify_pattern_bytes) 38992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe ret |= verify_io_u_pattern(hdr, vc); 39092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe 391da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse /* 392da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse * For read-only workloads, the program cannot be certain of the 393984c8696332a85d87ab9c65ce2efa2fe6e72114eJens Axboe * last numberio written to a block. Checking of numberio will be 394984c8696332a85d87ab9c65ce2efa2fe6e72114eJens Axboe * done only for workloads that write data. For verify_only, 395984c8696332a85d87ab9c65ce2efa2fe6e72114eJens Axboe * numberio will be checked in the last iteration when the correct 396984c8696332a85d87ab9c65ce2efa2fe6e72114eJens Axboe * state of numberio, that would have been written to each block 397984c8696332a85d87ab9c65ce2efa2fe6e72114eJens Axboe * in a previous run of fio, has been reached. 398da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse */ 3991fc351bf5e17ed33709cb363c0034cf20ec7d7a1Jens Axboe if ((td_write(td) || td_rw(td)) && (td_min_bs(td) == td_max_bs(td)) && 4001fc351bf5e17ed33709cb363c0034cf20ec7d7a1Jens Axboe !td->o.time_based) 401621677626f2551bedfdc4a5fc3b3e5f8492b94faJuan Casse if (!td->o.verify_only || td->o.loops == 0) 402621677626f2551bedfdc4a5fc3b3e5f8492b94faJuan Casse if (vh->numberio != io_u->numberio) 403621677626f2551bedfdc4a5fc3b3e5f8492b94faJuan Casse ret = EILSEQ; 404da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse 40592bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe if (!ret) 406bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 4077437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 408bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "meta"; 409bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 41092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe return ret; 4117437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis} 4127437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 413844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboestatic int verify_io_u_xxhash(struct verify_header *hdr, struct vcont *vc) 414844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe{ 415844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe void *p = io_u_verify_off(hdr, vc); 416844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe struct vhdr_xxhash *vh = hdr_priv(hdr); 417844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe uint32_t hash; 418844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe void *state; 419844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe 420844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe dprint(FD_VERIFY, "xxhash verify io_u %p, len %u\n", vc->io_u, hdr->len); 421844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe 422844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe state = XXH32_init(1); 423844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe XXH32_update(state, p, hdr->len - hdr_size(hdr)); 424844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe hash = XXH32_digest(state); 425844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe 426844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe if (vh->hash == hash) 427844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe return 0; 428844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe 429844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe vc->name = "xxhash"; 430844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe vc->good_crc = &vh->hash; 431844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe vc->bad_crc = &hash; 432844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe vc->crc_len = sizeof(hash); 433844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe log_verify_failure(hdr, vc); 434844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe return EILSEQ; 435844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe} 436844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe 437936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha512(struct verify_header *hdr, struct vcont *vc) 438cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 439936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 440546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha512 *vh = hdr_priv(hdr); 441cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe uint8_t sha512[128]; 44225dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe struct fio_sha512_ctx sha512_ctx = { 443cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe .buf = sha512, 444cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 445cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 446936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "sha512 verify io_u %p, len %u\n", vc->io_u, hdr->len); 447bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 44825dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha512_init(&sha512_ctx); 44925dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha512_update(&sha512_ctx, p, hdr->len - hdr_size(hdr)); 450cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 451bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (!memcmp(vh->sha512, sha512_ctx.buf, sizeof(sha512))) 452bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 453cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 454bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "sha512"; 455bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = vh->sha512; 456bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = sha512_ctx.buf; 457bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = sizeof(vh->sha512); 458bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 459bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 460cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 461cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 462936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha256(struct verify_header *hdr, struct vcont *vc) 463cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 464936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 465546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha256 *vh = hdr_priv(hdr); 466bc77f56f79f6ae155e9eb26263ed686ef28b47ecJens Axboe uint8_t sha256[64]; 46725dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe struct fio_sha256_ctx sha256_ctx = { 468cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe .buf = sha256, 469cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 470cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 471936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "sha256 verify io_u %p, len %u\n", vc->io_u, hdr->len); 472bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 47325dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha256_init(&sha256_ctx); 47425dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha256_update(&sha256_ctx, p, hdr->len - hdr_size(hdr)); 475f795c8195eab217a834638cd4b2be609453872e8Jens Axboe fio_sha256_final(&sha256_ctx); 476cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 477bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (!memcmp(vh->sha256, sha256_ctx.buf, sizeof(sha256))) 478bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 479cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 480bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "sha256"; 481bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = vh->sha256; 482bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = sha256_ctx.buf; 483bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = sizeof(vh->sha256); 484bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 485bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 486cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 487cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 488936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha1(struct verify_header *hdr, struct vcont *vc) 4897c353ceb3257b132f4c98326046b42201e070731Jens Axboe{ 490936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 4917c353ceb3257b132f4c98326046b42201e070731Jens Axboe struct vhdr_sha1 *vh = hdr_priv(hdr); 4927c353ceb3257b132f4c98326046b42201e070731Jens Axboe uint32_t sha1[5]; 49325dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe struct fio_sha1_ctx sha1_ctx = { 4947c353ceb3257b132f4c98326046b42201e070731Jens Axboe .H = sha1, 4957c353ceb3257b132f4c98326046b42201e070731Jens Axboe }; 4967c353ceb3257b132f4c98326046b42201e070731Jens Axboe 497936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "sha1 verify io_u %p, len %u\n", vc->io_u, hdr->len); 4987c353ceb3257b132f4c98326046b42201e070731Jens Axboe 49925dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha1_init(&sha1_ctx); 50025dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha1_update(&sha1_ctx, p, hdr->len - hdr_size(hdr)); 501f795c8195eab217a834638cd4b2be609453872e8Jens Axboe fio_sha1_final(&sha1_ctx); 5027c353ceb3257b132f4c98326046b42201e070731Jens Axboe 503bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (!memcmp(vh->sha1, sha1_ctx.H, sizeof(sha1))) 504bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 5057c353ceb3257b132f4c98326046b42201e070731Jens Axboe 506bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "sha1"; 507bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = vh->sha1; 508bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = sha1_ctx.H; 509bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = sizeof(vh->sha1); 510bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 511bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 5127c353ceb3257b132f4c98326046b42201e070731Jens Axboe} 5137c353ceb3257b132f4c98326046b42201e070731Jens Axboe 514936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc7(struct verify_header *hdr, struct vcont *vc) 5151e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{ 516936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 517546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc7 *vh = hdr_priv(hdr); 5181e154bdbf14a1d352117aea057035235b66f0381Jens Axboe unsigned char c; 5191e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 520936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "crc7 verify io_u %p, len %u\n", vc->io_u, hdr->len); 521bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 52225dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe c = fio_crc7(p, hdr->len - hdr_size(hdr)); 5231e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 524bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (c == vh->crc7) 525bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 5261e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 527bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "crc7"; 528bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = &vh->crc7; 529bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = &c; 530bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = 1; 531bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 532bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 5331e154bdbf14a1d352117aea057035235b66f0381Jens Axboe} 5341e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 535936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc16(struct verify_header *hdr, struct vcont *vc) 536969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{ 537936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 538546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc16 *vh = hdr_priv(hdr); 539969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe unsigned short c; 540969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 541936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "crc16 verify io_u %p, len %u\n", vc->io_u, hdr->len); 542bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 54325dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe c = fio_crc16(p, hdr->len - hdr_size(hdr)); 544969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 545bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (c == vh->crc16) 546bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 547969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 548bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "crc16"; 549bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = &vh->crc16; 550bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = &c; 551bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = 2; 552bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 553bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 554969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe} 555969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 556936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc64(struct verify_header *hdr, struct vcont *vc) 557d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{ 558936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 559546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc64 *vh = hdr_priv(hdr); 560d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe unsigned long long c; 561d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 562936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "crc64 verify io_u %p, len %u\n", vc->io_u, hdr->len); 563bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 56425dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe c = fio_crc64(p, hdr->len - hdr_size(hdr)); 565d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 566bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (c == vh->crc64) 567bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 568d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 569bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "crc64"; 570bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = &vh->crc64; 571bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = &c; 572bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = 8; 573bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 574bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 575d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe} 576d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 577936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc32(struct verify_header *hdr, struct vcont *vc) 578e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 579936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 580546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 581546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe uint32_t c; 582e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 583936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "crc32 verify io_u %p, len %u\n", vc->io_u, hdr->len); 584bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 58525dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe c = fio_crc32(p, hdr->len - hdr_size(hdr)); 586e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 587bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (c == vh->crc32) 588bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 589e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 590bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "crc32"; 591bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = &vh->crc32; 592bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = &c; 593bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = 4; 594bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 595bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 596e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 597e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 598936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc32c(struct verify_header *hdr, struct vcont *vc) 599bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{ 600936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 601bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 602bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe uint32_t c; 603bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 604936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "crc32c verify io_u %p, len %u\n", vc->io_u, hdr->len); 605bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 60625dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe c = fio_crc32c(p, hdr->len - hdr_size(hdr)); 607bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 608bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (c == vh->crc32) 609bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 610bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 611bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "crc32c"; 612bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = &vh->crc32; 613bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = &c; 614bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = 4; 615bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 616bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 617bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe} 618bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 619936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_md5(struct verify_header *hdr, struct vcont *vc) 620e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 621936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 622546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_md5 *vh = hdr_priv(hdr); 6238c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe uint32_t hash[MD5_HASH_WORDS]; 62425dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe struct fio_md5_ctx md5_ctx = { 6258c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe .hash = hash, 6268c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe }; 627e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 628936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "md5 verify io_u %p, len %u\n", vc->io_u, hdr->len); 629bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 63025dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_md5_init(&md5_ctx); 63125dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_md5_update(&md5_ctx, p, hdr->len - hdr_size(hdr)); 632f795c8195eab217a834638cd4b2be609453872e8Jens Axboe fio_md5_final(&md5_ctx); 633e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 634bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (!memcmp(vh->md5_digest, md5_ctx.hash, sizeof(hash))) 635bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 636e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 637bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "md5"; 638bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = vh->md5_digest; 639bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = md5_ctx.hash; 640bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = sizeof(hash); 641bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 642bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 643e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 644e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 645e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe/* 646e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe * Push IO verification to a separate thread 647e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe */ 648e69fdf7efe336037a588fdda5a86c9467347c6e0Jens Axboeint verify_io_u_async(struct thread_data *td, struct io_u **io_u_ptr) 649e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{ 650e69fdf7efe336037a588fdda5a86c9467347c6e0Jens Axboe struct io_u *io_u = *io_u_ptr; 651e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 652e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_lock(&td->io_u_lock); 653d7ee2a7d431c2cabdf56d04ca14805cad72cf985Steven Lang 654e69fdf7efe336037a588fdda5a86c9467347c6e0Jens Axboe if (io_u->file) 655e69fdf7efe336037a588fdda5a86c9467347c6e0Jens Axboe put_file_log(td, io_u->file); 656e69fdf7efe336037a588fdda5a86c9467347c6e0Jens Axboe 6570c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran if (io_u->flags & IO_U_F_IN_CUR_DEPTH) { 6580c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran td->cur_depth--; 6590c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran io_u->flags &= ~IO_U_F_IN_CUR_DEPTH; 6600c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran } 6612ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe flist_add_tail(&io_u->verify_list, &td->verify_list); 662e69fdf7efe336037a588fdda5a86c9467347c6e0Jens Axboe *io_u_ptr = NULL; 663e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 664e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 665e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_signal(&td->verify_cond); 666e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe return 0; 667e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe} 668e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 6690d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboestatic int verify_trimmed_io_u(struct thread_data *td, struct io_u *io_u) 6700d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe{ 6710d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe static char zero_buf[1024]; 6720d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe unsigned int this_len, len; 6730d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe int ret = 0; 6740d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe void *p; 6750d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 6760d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe if (!td->o.trim_zero) 6770d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe return 0; 6780d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 6790d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe len = io_u->buflen; 6800d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe p = io_u->buf; 6810d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe do { 6820d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe this_len = sizeof(zero_buf); 6830d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe if (this_len > len) 6840d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe this_len = len; 6850d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe if (memcmp(p, zero_buf, this_len)) { 6860d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe ret = EILSEQ; 6870d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe break; 6880d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe } 6890d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe len -= this_len; 6900d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe p += this_len; 6910d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe } while (len); 6920d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 6930d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe if (!ret) 6940d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe return 0; 6950d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 696a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe log_err("trim: verify failed at file %s offset %llu, length %lu" 697a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe ", block offset %lu\n", 698a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe io_u->file->file_name, io_u->offset, io_u->buflen, 6992f68124f26e54233db41b462a257dabc48e5c32bJens Axboe (unsigned long) (p - io_u->buf)); 7000d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe return ret; 7010d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe} 7020d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 703bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacherstatic int verify_header(struct io_u *io_u, struct verify_header *hdr, 704bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher unsigned int hdr_num, unsigned int hdr_len) 705f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe{ 706f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe void *p = hdr; 707f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe uint32_t crc; 708f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe 709bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher if (hdr->magic != FIO_HDR_MAGIC) { 710bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher log_err("verify: bad magic header %x, wanted %x", 711bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher hdr->magic, FIO_HDR_MAGIC); 712bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher goto err; 713bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher } 7144547419851b578e260beef187ba405b2f632608cAndreas Gruenbacher if (hdr->len != hdr_len) { 715bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher log_err("verify: bad header length %u, wanted %u", 716bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher hdr->len, hdr_len); 717bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher goto err; 718bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher } 719bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher if (hdr->rand_seed != io_u->rand_seed) { 720bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher log_err("verify: bad header rand_seed %"PRIu64 721bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher ", wanted %"PRIu64, 722bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher hdr->rand_seed, io_u->rand_seed); 723bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher goto err; 724bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher } 725ae38c0dcd570265aef09aa132ce27278d8909a1dJens Axboe 72625dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe crc = fio_crc32c(p, offsetof(struct verify_header, crc32)); 727bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher if (crc != hdr->crc32) { 728bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher log_err("verify: bad header crc %x, calculated %x", 729bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher hdr->crc32, crc); 730bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher goto err; 731bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher } 732bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher return 0; 733bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher 734bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbachererr: 735bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher log_err(" at file %s offset %llu, length %u\n", 736bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher io_u->file->file_name, 737bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher io_u->offset + hdr_num * hdr_len, hdr_len); 738bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher return EILSEQ; 739f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe} 740f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe 741e69fdf7efe336037a588fdda5a86c9467347c6e0Jens Axboeint verify_io_u(struct thread_data *td, struct io_u **io_u_ptr) 742e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 7433f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis struct verify_header *hdr; 744e69fdf7efe336037a588fdda5a86c9467347c6e0Jens Axboe struct io_u *io_u = *io_u_ptr; 7452b13e716c0921356c0930522718e00b8df34293aJens Axboe unsigned int header_size, hdr_inc, hdr_num = 0; 74695646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe void *p; 747e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe int ret; 748e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 7491dcc049824b840df1ee0ef5d019fffa4037e1bb0Shawn Lewis if (td->o.verify == VERIFY_NULL || io_u->ddir != DDIR_READ) 75036690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe return 0; 751d957070e88cf0be34aa3925f44feea39f6b54228Jens Axboe /* 752d957070e88cf0be34aa3925f44feea39f6b54228Jens Axboe * If the IO engine is faking IO (like null), then just pretend 753d957070e88cf0be34aa3925f44feea39f6b54228Jens Axboe * we verified everything. 754d957070e88cf0be34aa3925f44feea39f6b54228Jens Axboe */ 755d957070e88cf0be34aa3925f44feea39f6b54228Jens Axboe if (td->io_ops->flags & FIO_FAKEIO) 756d957070e88cf0be34aa3925f44feea39f6b54228Jens Axboe return 0; 757d957070e88cf0be34aa3925f44feea39f6b54228Jens Axboe 7580d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe if (io_u->flags & IO_U_F_TRIMMED) { 7590d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe ret = verify_trimmed_io_u(td, io_u); 7600d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe goto done; 7610d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe } 76236690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe 763cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe hdr_inc = get_hdr_inc(td, io_u); 764e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 765a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe ret = 0; 7665ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe for (p = io_u->buf; p < io_u->buf + io_u->buflen; 7675ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe p += hdr_inc, hdr_num++) { 768bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe struct vcont vc = { 769bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe .io_u = io_u, 770bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe .hdr_num = hdr_num, 7717d9fb455aadc0c0363489591775496f27f4a560aJens Axboe .td = td, 772bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe }; 773f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe unsigned int verify_type; 774936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe 775f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe if (ret && td->o.verify_fatal) 776a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe break; 777f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe 7782b13e716c0921356c0930522718e00b8df34293aJens Axboe header_size = __hdr_size(td->o.verify); 779a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe if (td->o.verify_offset) 7802b13e716c0921356c0930522718e00b8df34293aJens Axboe memswp(p, p + td->o.verify_offset, header_size); 78195646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe hdr = p; 782e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 783c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat /* 784c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat * Make rand_seed check pass when have verifysort or 785c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat * verify_backlog. 786c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat */ 787c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat if (td->o.verifysort || (td->flags & TD_F_VER_BACKLOG)) 788c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat io_u->rand_seed = hdr->rand_seed; 789c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat 790bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher ret = verify_header(io_u, hdr, hdr_num, hdr_inc); 791bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher if (ret) 792bf65415f8d080f1649ee3432d4f11f62216f6ceeAndreas Gruenbacher return ret; 7933f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe 794f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe if (td->o.verify != VERIFY_NONE) 795f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe verify_type = td->o.verify; 796f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe else 797f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe verify_type = hdr->verify_type; 798f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe 799f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe switch (verify_type) { 8003f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_MD5: 801936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_md5(hdr, &vc); 8023f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 8033f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC64: 804936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_crc64(hdr, &vc); 8053f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 806bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe case VERIFY_CRC32C: 8073845591fadea480177223e28c9d1c03642d34f0eJens Axboe case VERIFY_CRC32C_INTEL: 808936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_crc32c(hdr, &vc); 809bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe break; 8103f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC32: 811936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_crc32(hdr, &vc); 8123f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 8133f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC16: 814936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_crc16(hdr, &vc); 8153f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 8163f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC7: 817936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_crc7(hdr, &vc); 8183f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 819cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe case VERIFY_SHA256: 820936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_sha256(hdr, &vc); 821cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe break; 822cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe case VERIFY_SHA512: 823936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_sha512(hdr, &vc); 824cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe break; 825844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe case VERIFY_XXHASH: 826844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe ret = verify_io_u_xxhash(hdr, &vc); 827844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe break; 8287437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis case VERIFY_META: 82992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe ret = verify_io_u_meta(hdr, &vc); 8307437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis break; 8317c353ceb3257b132f4c98326046b42201e070731Jens Axboe case VERIFY_SHA1: 832936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_sha1(hdr, &vc); 8337c353ceb3257b132f4c98326046b42201e070731Jens Axboe break; 83492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe case VERIFY_PATTERN: 83592bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe ret = verify_io_u_pattern(hdr, &vc); 83692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe break; 8373f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis default: 8383f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("Bad verify type %u\n", hdr->verify_type); 839d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe ret = EINVAL; 8403f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis } 841f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe 842f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe if (ret && verify_type != hdr->verify_type) 843f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe log_err("fio: verify type mismatch (%u media, %u given)\n", 844f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe hdr->verify_type, verify_type); 8453f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis } 846a7dfe862c2e3fe72b8db6a6e67302048d3731c6dJens Axboe 8470d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboedone: 848f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe if (ret && td->o.verify_fatal) 8493b44e8bb2a96110472c3b5132d5115f903e354edJens Axboe fio_mark_td_terminate(td); 850f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe 851a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe return ret; 852e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 853e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 8547437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic void fill_meta(struct verify_header *hdr, struct thread_data *td, 8555ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe struct io_u *io_u, unsigned int header_num) 8567437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{ 8577437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis struct vhdr_meta *vh = hdr_priv(hdr); 8587437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 8597437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->thread = td->thread_number; 8607437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 8617437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->time_sec = io_u->start_time.tv_sec; 8627437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->time_usec = io_u->start_time.tv_usec; 8637437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 864da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse vh->numberio = io_u->numberio; 8657437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 8667437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->offset = io_u->offset + header_num * td->o.verify_interval; 8677437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis} 8687437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 869844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboestatic void fill_xxhash(struct verify_header *hdr, void *p, unsigned int len) 870844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe{ 871844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe struct vhdr_xxhash *vh = hdr_priv(hdr); 872844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe void *state; 873844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe 874844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe state = XXH32_init(1); 875844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe XXH32_update(state, p, len); 876844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe vh->hash = XXH32_digest(state); 877844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe} 878844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe 879cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha512(struct verify_header *hdr, void *p, unsigned int len) 880cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 881546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha512 *vh = hdr_priv(hdr); 88225dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe struct fio_sha512_ctx sha512_ctx = { 883546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe .buf = vh->sha512, 884cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 885cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 88625dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha512_init(&sha512_ctx); 88725dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha512_update(&sha512_ctx, p, len); 888cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 889cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 890cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha256(struct verify_header *hdr, void *p, unsigned int len) 891cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 892546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha256 *vh = hdr_priv(hdr); 89325dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe struct fio_sha256_ctx sha256_ctx = { 894546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe .buf = vh->sha256, 895cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 896cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 89725dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha256_init(&sha256_ctx); 89825dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha256_update(&sha256_ctx, p, len); 899f795c8195eab217a834638cd4b2be609453872e8Jens Axboe fio_sha256_final(&sha256_ctx); 900cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 901cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 9027c353ceb3257b132f4c98326046b42201e070731Jens Axboestatic void fill_sha1(struct verify_header *hdr, void *p, unsigned int len) 9037c353ceb3257b132f4c98326046b42201e070731Jens Axboe{ 9047c353ceb3257b132f4c98326046b42201e070731Jens Axboe struct vhdr_sha1 *vh = hdr_priv(hdr); 90525dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe struct fio_sha1_ctx sha1_ctx = { 9067c353ceb3257b132f4c98326046b42201e070731Jens Axboe .H = vh->sha1, 9077c353ceb3257b132f4c98326046b42201e070731Jens Axboe }; 9087c353ceb3257b132f4c98326046b42201e070731Jens Axboe 90925dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha1_init(&sha1_ctx); 91025dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha1_update(&sha1_ctx, p, len); 911f795c8195eab217a834638cd4b2be609453872e8Jens Axboe fio_sha1_final(&sha1_ctx); 9127c353ceb3257b132f4c98326046b42201e070731Jens Axboe} 9137c353ceb3257b132f4c98326046b42201e070731Jens Axboe 9141e154bdbf14a1d352117aea057035235b66f0381Jens Axboestatic void fill_crc7(struct verify_header *hdr, void *p, unsigned int len) 9151e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{ 916546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc7 *vh = hdr_priv(hdr); 917546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 91825dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe vh->crc7 = fio_crc7(p, len); 9191e154bdbf14a1d352117aea057035235b66f0381Jens Axboe} 9201e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 921969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboestatic void fill_crc16(struct verify_header *hdr, void *p, unsigned int len) 922969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{ 923546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc16 *vh = hdr_priv(hdr); 924546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 92525dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe vh->crc16 = fio_crc16(p, len); 926969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe} 927969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 928e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_crc32(struct verify_header *hdr, void *p, unsigned int len) 929e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 930546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 931546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 93225dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe vh->crc32 = fio_crc32(p, len); 933e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 934e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 935bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboestatic void fill_crc32c(struct verify_header *hdr, void *p, unsigned int len) 936bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{ 937bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 938bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 93925dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe vh->crc32 = fio_crc32c(p, len); 940bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe} 941bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 942d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboestatic void fill_crc64(struct verify_header *hdr, void *p, unsigned int len) 943d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{ 944546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc64 *vh = hdr_priv(hdr); 945546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 94625dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe vh->crc64 = fio_crc64(p, len); 947d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe} 948d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 949e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_md5(struct verify_header *hdr, void *p, unsigned int len) 950e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 951546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_md5 *vh = hdr_priv(hdr); 95225dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe struct fio_md5_ctx md5_ctx = { 953546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe .hash = (uint32_t *) vh->md5_digest, 9548c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe }; 955e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 95625dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_md5_init(&md5_ctx); 95725dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_md5_update(&md5_ctx, p, len); 958f795c8195eab217a834638cd4b2be609453872e8Jens Axboe fio_md5_final(&md5_ctx); 959e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 960e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 9617d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void populate_hdr(struct thread_data *td, struct io_u *io_u, 9627d9fb455aadc0c0363489591775496f27f4a560aJens Axboe struct verify_header *hdr, unsigned int header_num, 9637d9fb455aadc0c0363489591775496f27f4a560aJens Axboe unsigned int header_len) 9647d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{ 9657d9fb455aadc0c0363489591775496f27f4a560aJens Axboe unsigned int data_len; 9667d9fb455aadc0c0363489591775496f27f4a560aJens Axboe void *data, *p; 9677d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 9687d9fb455aadc0c0363489591775496f27f4a560aJens Axboe p = (void *) hdr; 9697d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 970d3a173a927084660c365d6aa162016ebb0746946Jens Axboe hdr->magic = FIO_HDR_MAGIC; 9717d9fb455aadc0c0363489591775496f27f4a560aJens Axboe hdr->verify_type = td->o.verify; 972d3a173a927084660c365d6aa162016ebb0746946Jens Axboe hdr->len = header_len; 9737d9fb455aadc0c0363489591775496f27f4a560aJens Axboe hdr->rand_seed = io_u->rand_seed; 97425dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe hdr->crc32 = fio_crc32c(p, offsetof(struct verify_header, crc32)); 975f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe 9767d9fb455aadc0c0363489591775496f27f4a560aJens Axboe data_len = header_len - hdr_size(hdr); 9777d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 9787d9fb455aadc0c0363489591775496f27f4a560aJens Axboe data = p + hdr_size(hdr); 9797d9fb455aadc0c0363489591775496f27f4a560aJens Axboe switch (td->o.verify) { 9807d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_MD5: 9817d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill md5 io_u %p, len %u\n", 9827d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 9837d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_md5(hdr, data, data_len); 9847d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 9857d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_CRC64: 9867d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill crc64 io_u %p, len %u\n", 9877d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 9887d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_crc64(hdr, data, data_len); 9897d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 9907d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_CRC32C: 9917d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_CRC32C_INTEL: 9927d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill crc32c io_u %p, len %u\n", 9937d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 9947d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_crc32c(hdr, data, data_len); 9957d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 9967d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_CRC32: 9977d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill crc32 io_u %p, len %u\n", 9987d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 9997d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_crc32(hdr, data, data_len); 10007d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 10017d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_CRC16: 10027d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill crc16 io_u %p, len %u\n", 10037d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 10047d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_crc16(hdr, data, data_len); 10057d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 10067d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_CRC7: 10077d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill crc7 io_u %p, len %u\n", 10087d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 10097d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_crc7(hdr, data, data_len); 10107d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 10117d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_SHA256: 10127d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill sha256 io_u %p, len %u\n", 10137d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 10147d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_sha256(hdr, data, data_len); 10157d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 10167d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_SHA512: 10177d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill sha512 io_u %p, len %u\n", 10187d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 10197d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_sha512(hdr, data, data_len); 10207d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 1021844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe case VERIFY_XXHASH: 1022844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe dprint(FD_VERIFY, "fill xxhash io_u %p, len %u\n", 1023844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe io_u, hdr->len); 1024844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe fill_xxhash(hdr, data, data_len); 1025844ea60273f4e7862150d9c6430cdb15768e2f34Jens Axboe break; 10267d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_META: 10277d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill meta io_u %p, len %u\n", 10287d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 10297d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_meta(hdr, td, io_u, header_num); 10307d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 10317d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_SHA1: 10327d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill sha1 io_u %p, len %u\n", 10337d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 10347d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_sha1(hdr, data, data_len); 10357d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 103692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe case VERIFY_PATTERN: 103792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe /* nothing to do here */ 103892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe break; 10397d9fb455aadc0c0363489591775496f27f4a560aJens Axboe default: 10407d9fb455aadc0c0363489591775496f27f4a560aJens Axboe log_err("fio: bad verify type: %d\n", td->o.verify); 10417d9fb455aadc0c0363489591775496f27f4a560aJens Axboe assert(0); 10427d9fb455aadc0c0363489591775496f27f4a560aJens Axboe } 10437d9fb455aadc0c0363489591775496f27f4a560aJens Axboe if (td->o.verify_offset) 10447d9fb455aadc0c0363489591775496f27f4a560aJens Axboe memswp(p, p + td->o.verify_offset, hdr_size(hdr)); 10457d9fb455aadc0c0363489591775496f27f4a560aJens Axboe} 10467d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 1047e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe/* 1048e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * fill body of io_u->buf with random data and add a header with the 1049c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * checksum of choice 1050e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe */ 1051e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboevoid populate_verify_io_u(struct thread_data *td, struct io_u *io_u) 1052e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 10539cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe if (td->o.verify == VERIFY_NULL) 10549cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe return; 10559cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe 1056da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse io_u->numberio = td->io_issues[io_u->ddir]; 1057da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse 1058c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe fill_pattern_headers(td, io_u, 0, 0); 1059e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 1060e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 1061e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboeint get_next_verify(struct thread_data *td, struct io_u *io_u) 1062e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 10638de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe struct io_piece *ipo = NULL; 1064e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 1065d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe /* 1066d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe * this io_u is from a requeue, we already filled the offsets 1067d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe */ 1068d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe if (io_u->file) 1069d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe return 0; 1070d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe 10718de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe if (!RB_EMPTY_ROOT(&td->io_hist_tree)) { 10728de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe struct rb_node *n = rb_first(&td->io_hist_tree); 1073e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 10748de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe ipo = rb_entry(n, struct io_piece, rb_node); 1075f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe 1076f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe /* 1077f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe * Ensure that the associated IO has completed 1078f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe */ 1079f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe read_barrier(); 1080f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe if (ipo->flags & IP_F_IN_FLIGHT) 1081f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe goto nothing; 1082f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe 10834b87898e8d76aaf05baec83077a11311c1447397Jens Axboe rb_erase(n, &td->io_hist_tree); 1084a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe assert(ipo->flags & IP_F_ONRB); 1085a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe ipo->flags &= ~IP_F_ONRB; 108601743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe } else if (!flist_empty(&td->io_hist_list)) { 108712dbd06d3203840c8ebdc4d0a6135a69c4380949Jens Axboe ipo = flist_first_entry(&td->io_hist_list, struct io_piece, list); 1088f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe 1089f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe /* 1090f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe * Ensure that the associated IO has completed 1091f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe */ 1092f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe read_barrier(); 1093f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe if (ipo->flags & IP_F_IN_FLIGHT) 1094f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe goto nothing; 1095f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe 109601743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe flist_del(&ipo->list); 1097a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe assert(ipo->flags & IP_F_ONLIST); 1098a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe ipo->flags &= ~IP_F_ONLIST; 10998de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe } 1100e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 11018de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe if (ipo) { 11020d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe td->io_hist_len--; 11030d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 1104e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe io_u->offset = ipo->offset; 1105e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe io_u->buflen = ipo->len; 1106da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse io_u->numberio = ipo->numberio; 110736167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe io_u->file = ipo->file; 110882af2a7ca1a543b41c003de69d5e3c36860f47d5Jens Axboe io_u->flags |= IO_U_F_VER_LIST; 110997af62cec418cd722fb43c6010d6430534e12353Jens Axboe 11100d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe if (ipo->flags & IP_F_TRIMMED) 11110d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe io_u->flags |= IO_U_F_TRIMMED; 11120d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 1113d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (!fio_file_open(io_u->file)) { 111497af62cec418cd722fb43c6010d6430534e12353Jens Axboe int r = td_io_open_file(td, io_u->file); 111597af62cec418cd722fb43c6010d6430534e12353Jens Axboe 1116bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe if (r) { 1117bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "failed file %s open\n", 1118bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u->file->file_name); 111997af62cec418cd722fb43c6010d6430534e12353Jens Axboe return 1; 1120bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe } 112197af62cec418cd722fb43c6010d6430534e12353Jens Axboe } 112297af62cec418cd722fb43c6010d6430534e12353Jens Axboe 112397af62cec418cd722fb43c6010d6430534e12353Jens Axboe get_file(ipo->file); 1124d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe assert(fio_file_open(io_u->file)); 1125e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe io_u->ddir = DDIR_READ; 112636167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe io_u->xfer_buf = io_u->buf; 112736167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe io_u->xfer_buflen = io_u->buflen; 11280d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 11290d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe remove_trim_entry(td, ipo); 1130e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe free(ipo); 1131bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "get_next_verify: ret io_u %p\n", io_u); 1132c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat 1133c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat if (!td->o.verify_pattern_bytes) { 1134f678701783f1c200ce574215feeb7ff801c4ff72Jens Axboe io_u->rand_seed = __rand(&td->verify_state); 1135c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat if (sizeof(int) != sizeof(long *)) 1136f678701783f1c200ce574215feeb7ff801c4ff72Jens Axboe io_u->rand_seed *= __rand(&td->verify_state); 1137c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat } 1138e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe return 0; 1139e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe } 1140e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 1141f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboenothing: 1142bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "get_next_verify: empty\n"); 1143e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe return 1; 1144e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 1145e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1146dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboevoid fio_verify_init(struct thread_data *td) 1147dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe{ 1148dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe if (td->o.verify == VERIFY_CRC32C_INTEL || 1149dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe td->o.verify == VERIFY_CRC32C) { 1150dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe crc32c_intel_probe(); 1151dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe } 1152dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe} 1153dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe 1154e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboestatic void *verify_async_thread(void *data) 1155e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{ 1156e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe struct thread_data *td = data; 1157e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe struct io_u *io_u; 1158e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe int ret = 0; 1159e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 116094b360f41976a2bd3c4d3476b5e26a96e1ea9b12Jens Axboe if (fio_option_is_set(&td->o, verify_cpumask) && 1161e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe fio_setaffinity(td->pid, td->o.verify_cpumask)) { 1162e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe log_err("fio: failed setting verify thread affinity\n"); 1163e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe goto done; 1164e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 1165e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1166e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe do { 1167e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe FLIST_HEAD(list); 1168e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe 1169e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe read_barrier(); 1170e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (td->verify_thread_exit) 1171e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe break; 1172e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1173e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_lock(&td->io_u_lock); 1174e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1175e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe while (flist_empty(&td->verify_list) && 1176e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe !td->verify_thread_exit) { 1177b36e298b5bdfc31ffc9a4c14e94a9c5c748888b0Jens Axboe ret = pthread_cond_wait(&td->verify_cond, 1178b36e298b5bdfc31ffc9a4c14e94a9c5c748888b0Jens Axboe &td->io_u_lock); 1179e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (ret) { 1180e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 1181e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe break; 1182e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 1183e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 1184e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1185e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe flist_splice_init(&td->verify_list, &list); 1186e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 1187e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe 1188e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe if (flist_empty(&list)) 1189e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe continue; 1190e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1191e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe while (!flist_empty(&list)) { 119212dbd06d3203840c8ebdc4d0a6135a69c4380949Jens Axboe io_u = flist_first_entry(&list, struct io_u, verify_list); 1193e69fdf7efe336037a588fdda5a86c9467347c6e0Jens Axboe flist_del_init(&io_u->verify_list); 1194e69fdf7efe336037a588fdda5a86c9467347c6e0Jens Axboe 1195e69fdf7efe336037a588fdda5a86c9467347c6e0Jens Axboe io_u->flags |= IO_U_F_NO_FILE_PUT; 1196e69fdf7efe336037a588fdda5a86c9467347c6e0Jens Axboe ret = verify_io_u(td, &io_u); 1197e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1198e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe put_io_u(td, io_u); 1199d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe if (!ret) 1200d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe continue; 12018b28bd41375930664a0ff9ff9b101a88ac416ac5Dmitry Monakhov if (td_non_fatal_error(td, ERROR_TYPE_VERIFY_BIT, ret)) { 1202d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe update_error_count(td, ret); 1203d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe td_clear_error(td); 1204d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe ret = 0; 1205d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe } 1206e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe } 1207e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } while (!ret); 1208e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1209d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe if (ret) { 1210d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe td_verror(td, ret, "async_verify"); 1211f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe if (td->o.verify_fatal) 12123b44e8bb2a96110472c3b5132d5115f903e354edJens Axboe fio_mark_td_terminate(td); 1213d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe } 1214d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe 1215e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboedone: 1216e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_lock(&td->io_u_lock); 1217e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->nr_verify_threads--; 1218e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 1219e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1220e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_signal(&td->free_cond); 1221e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe return NULL; 1222e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe} 1223e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1224e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_async_init(struct thread_data *td) 1225e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{ 1226e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe int i, ret; 1227304a47c7d94f407cc72a87025679a67f02288447bart Van Assche pthread_attr_t attr; 1228304a47c7d94f407cc72a87025679a67f02288447bart Van Assche 1229304a47c7d94f407cc72a87025679a67f02288447bart Van Assche pthread_attr_init(&attr); 1230304a47c7d94f407cc72a87025679a67f02288447bart Van Assche pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN); 1231e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1232e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_thread_exit = 0; 1233e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1234e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_threads = malloc(sizeof(pthread_t) * td->o.verify_async); 1235e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe for (i = 0; i < td->o.verify_async; i++) { 1236304a47c7d94f407cc72a87025679a67f02288447bart Van Assche ret = pthread_create(&td->verify_threads[i], &attr, 1237e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe verify_async_thread, td); 1238e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (ret) { 1239e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe log_err("fio: async verify creation failed: %s\n", 1240e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe strerror(ret)); 1241e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe break; 1242e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 1243e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe ret = pthread_detach(td->verify_threads[i]); 1244e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (ret) { 1245e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe log_err("fio: async verify thread detach failed: %s\n", 1246e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe strerror(ret)); 1247e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe break; 1248e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 1249e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->nr_verify_threads++; 1250e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 1251e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1252304a47c7d94f407cc72a87025679a67f02288447bart Van Assche pthread_attr_destroy(&attr); 1253304a47c7d94f407cc72a87025679a67f02288447bart Van Assche 1254e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (i != td->o.verify_async) { 1255e40823b10920f679d84f3f2222e319c168b1e7daJens Axboe log_err("fio: only %d verify threads started, exiting\n", i); 1256e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_thread_exit = 1; 1257e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe write_barrier(); 1258e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_broadcast(&td->verify_cond); 1259e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe return 1; 1260e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 1261e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1262e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe return 0; 1263e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe} 1264e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1265e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboevoid verify_async_exit(struct thread_data *td) 1266e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{ 1267e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_thread_exit = 1; 1268e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe write_barrier(); 1269e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_broadcast(&td->verify_cond); 1270e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1271e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_lock(&td->io_u_lock); 1272e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1273e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe while (td->nr_verify_threads) 1274e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_wait(&td->free_cond, &td->io_u_lock); 1275e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1276e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 1277e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe free(td->verify_threads); 1278e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_threads = NULL; 1279e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe} 1280de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1281de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboestruct all_io_list *get_all_io_list(int save_mask, size_t *sz) 1282de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe{ 1283de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe struct all_io_list *rep; 1284de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe struct thread_data *td; 1285de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe size_t depth; 1286de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe void *next; 1287de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe int i, nr; 1288de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1289de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe compiletime_assert(sizeof(struct all_io_list) == 8, "all_io_list"); 1290de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1291de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe /* 1292de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe * Calculate reply space needed. We need one 'io_state' per thread, 1293de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe * and the size will vary depending on depth. 1294de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe */ 1295de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe depth = 0; 1296de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe nr = 0; 1297de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe for_each_td(td, i) { 1298de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe if (save_mask != IO_LIST_ALL && (i + 1) != save_mask) 1299de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe continue; 1300de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe td->stop_io = 1; 1301de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe td->flags |= TD_F_VSTATE_SAVED; 1302de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe depth += td->o.iodepth; 1303de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe nr++; 1304de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe } 1305de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1306de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe if (!nr) 1307de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe return NULL; 1308de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1309de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe *sz = sizeof(*rep); 1310de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe *sz += nr * sizeof(struct thread_io_list); 1311de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe *sz += depth * sizeof(uint64_t); 1312de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe rep = malloc(*sz); 1313de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1314de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe rep->threads = cpu_to_le64((uint64_t) nr); 1315de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1316de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe next = &rep->state[0]; 1317de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe for_each_td(td, i) { 1318de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe struct thread_io_list *s = next; 1319de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe unsigned int comps; 1320de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1321de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe if (save_mask != IO_LIST_ALL && (i + 1) != save_mask) 1322de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe continue; 1323de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1324de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe if (td->last_write_comp) { 1325de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe int j, k; 1326de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1327de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe if (td->io_blocks[DDIR_WRITE] < td->o.iodepth) 1328de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe comps = td->io_blocks[DDIR_WRITE]; 1329de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe else 1330de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe comps = td->o.iodepth; 1331de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1332de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe k = td->last_write_idx - 1; 1333de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe for (j = 0; j < comps; j++) { 1334de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe if (k == -1) 1335de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe k = td->o.iodepth - 1; 1336de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe s->offsets[j] = cpu_to_le64(td->last_write_comp[k]); 1337de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe k--; 1338de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe } 1339de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe } else 1340de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe comps = 0; 1341de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1342de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe s->no_comps = cpu_to_le64((uint64_t) comps); 1343de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe s->depth = cpu_to_le64((uint64_t) td->o.iodepth); 1344de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe s->numberio = cpu_to_le64((uint64_t) td->io_issues[DDIR_WRITE]); 1345de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe s->index = cpu_to_le64((uint64_t) i); 1346de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe s->rand.s[0] = cpu_to_le32(td->random_state.s1); 1347de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe s->rand.s[1] = cpu_to_le32(td->random_state.s2); 1348de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe s->rand.s[2] = cpu_to_le32(td->random_state.s3); 1349de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe s->rand.s[3] = 0; 135097c6334383ae05891841567e308c02eb9469bea1Jens Axboe s->name[sizeof(s->name) - 1] = '\0'; 135197c6334383ae05891841567e308c02eb9469bea1Jens Axboe strncpy((char *) s->name, td->o.name, sizeof(s->name) - 1); 1352de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe next = io_list_next(s); 1353de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe } 1354de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1355de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe return rep; 1356de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe} 1357de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1358de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboestatic int open_state_file(const char *name, const char *prefix, int num, 1359de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe int for_write) 1360de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe{ 1361de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe char out[64]; 1362de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe int flags; 1363de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe int fd; 1364de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1365de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe if (for_write) 1366de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe flags = O_CREAT | O_TRUNC | O_WRONLY | O_SYNC; 1367de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe else 1368de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe flags = O_RDONLY; 1369de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 13703ebcfd56868fd11f66bee3a9792811c02d66db04Jens Axboe verify_state_gen_name(out, sizeof(out), name, prefix, num); 1371de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1372de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe fd = open(out, flags, 0644); 1373de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe if (fd == -1) { 1374de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe perror("fio: open state file"); 1375de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe return -1; 1376de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe } 1377de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1378de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe return fd; 1379de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe} 1380de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1381de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboestatic int write_thread_list_state(struct thread_io_list *s, 1382de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe const char *prefix) 1383de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe{ 1384de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe struct verify_state_hdr hdr; 1385de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe uint64_t crc; 1386de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe ssize_t ret; 1387de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe int fd; 1388de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1389de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe fd = open_state_file((const char *) s->name, prefix, s->index, 1); 1390de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe if (fd == -1) 1391de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe return 1; 1392de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1393de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe crc = fio_crc32c((void *)s, thread_io_list_sz(s)); 1394de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1395de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe hdr.version = cpu_to_le64((uint64_t) VSTATE_HDR_VERSION); 1396de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe hdr.size = cpu_to_le64((uint64_t) thread_io_list_sz(s)); 1397de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe hdr.crc = cpu_to_le64(crc); 1398de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe ret = write(fd, &hdr, sizeof(hdr)); 1399de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe if (ret != sizeof(hdr)) 1400de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe goto write_fail; 1401de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1402de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe ret = write(fd, s, thread_io_list_sz(s)); 1403de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe if (ret != thread_io_list_sz(s)) { 1404de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboewrite_fail: 1405de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe if (ret < 0) 1406de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe perror("fio: write state file"); 1407de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe log_err("fio: failed to write state file\n"); 1408de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe ret = 1; 1409de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe } else 1410de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe ret = 0; 1411de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1412de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe close(fd); 1413de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe return ret; 1414de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe} 1415de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1416de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboevoid __verify_save_state(struct all_io_list *state, const char *prefix) 1417de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe{ 1418de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe struct thread_io_list *s = &state->state[0]; 1419de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe unsigned int i; 1420de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1421de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe for (i = 0; i < le64_to_cpu(state->threads); i++) { 1422de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe write_thread_list_state(s, prefix); 1423de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe s = io_list_next(s); 1424de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe } 1425de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe} 1426de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1427de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboevoid verify_save_state(void) 1428de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe{ 1429de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe struct all_io_list *state; 1430de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe size_t sz; 1431de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1432de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe state = get_all_io_list(IO_LIST_ALL, &sz); 1433de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe if (state) { 1434de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe __verify_save_state(state, "local"); 1435de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe free(state); 1436de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe } 1437de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe} 1438de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1439de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboevoid verify_free_state(struct thread_data *td) 1440de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe{ 1441de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe if (td->vstate) 1442de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe free(td->vstate); 1443de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe} 1444de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1445de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboevoid verify_convert_assign_state(struct thread_data *td, 1446de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe struct thread_io_list *s) 1447de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe{ 1448de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe int i; 1449de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1450de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe s->no_comps = le64_to_cpu(s->no_comps); 1451de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe s->depth = le64_to_cpu(s->depth); 1452de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe s->numberio = le64_to_cpu(s->numberio); 1453de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe for (i = 0; i < 4; i++) 1454de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe s->rand.s[i] = le32_to_cpu(s->rand.s[i]); 1455de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe for (i = 0; i < s->no_comps; i++) 1456de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe s->offsets[i] = le64_to_cpu(s->offsets[i]); 1457de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1458de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe td->vstate = s; 1459de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe} 1460de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1461de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboeint verify_state_hdr(struct verify_state_hdr *hdr, struct thread_io_list *s) 1462de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe{ 1463de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe uint64_t crc; 1464de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1465de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe hdr->version = le64_to_cpu(hdr->version); 1466de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe hdr->size = le64_to_cpu(hdr->size); 1467de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe hdr->crc = le64_to_cpu(hdr->crc); 1468de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1469de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe if (hdr->version != VSTATE_HDR_VERSION) 1470de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe return 1; 1471de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1472de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe crc = fio_crc32c((void *)s, hdr->size); 1473de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe if (crc != hdr->crc) 1474de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe return 1; 1475de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1476de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe return 0; 1477de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe} 1478de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1479de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboeint verify_load_state(struct thread_data *td, const char *prefix) 1480de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe{ 1481de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe struct thread_io_list *s = NULL; 1482de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe struct verify_state_hdr hdr; 1483de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe uint64_t crc; 1484de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe ssize_t ret; 1485de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe int fd; 1486de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1487de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe if (!td->o.verify_state) 1488de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe return 0; 1489de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1490de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe fd = open_state_file(td->o.name, prefix, td->thread_number - 1, 0); 1491de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe if (fd == -1) 1492de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe return 1; 1493de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1494de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe ret = read(fd, &hdr, sizeof(hdr)); 1495de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe if (ret != sizeof(hdr)) { 1496de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe if (ret < 0) 1497de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe td_verror(td, errno, "read verify state hdr"); 1498de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe log_err("fio: failed reading verify state header\n"); 1499de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe goto err; 1500de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe } 1501de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1502de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe hdr.version = le64_to_cpu(hdr.version); 1503de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe hdr.size = le64_to_cpu(hdr.size); 1504de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe hdr.crc = le64_to_cpu(hdr.crc); 1505de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1506de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe if (hdr.version != VSTATE_HDR_VERSION) { 1507de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe log_err("fio: bad version in verify state header\n"); 1508de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe goto err; 1509de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe } 1510de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1511de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe s = malloc(hdr.size); 1512de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe ret = read(fd, s, hdr.size); 1513de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe if (ret != hdr.size) { 1514de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe if (ret < 0) 1515de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe td_verror(td, errno, "read verify state"); 1516de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe log_err("fio: failed reading verity state\n"); 1517de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe goto err; 1518de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe } 1519de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1520de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe crc = fio_crc32c((void *)s, hdr.size); 1521de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe if (crc != hdr.crc) { 1522de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe log_err("fio: verify state is corrupt\n"); 1523de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe goto err; 1524de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe } 1525de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1526de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe close(fd); 1527de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1528de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe verify_convert_assign_state(td, s); 1529de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe return 0; 1530de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboeerr: 1531de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe if (s) 1532de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe free(s); 1533de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe close(fd); 1534de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe return 1; 1535de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe} 1536de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1537de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe/* 1538de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe * Use the loaded verify state to know when to stop doing verification 1539de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe */ 1540de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboeint verify_state_should_stop(struct thread_data *td, struct io_u *io_u) 1541de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe{ 1542de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe struct thread_io_list *s = td->vstate; 1543de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe int i; 1544de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1545de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe if (!s) 1546de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe return 0; 1547de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1548de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe /* 1549d1a44b2fae5053c957cbde69144ba2ff342a7040Jens Axboe * If we're not into the window of issues - depth yet, continue. If 1550d1a44b2fae5053c957cbde69144ba2ff342a7040Jens Axboe * issue is shorter than depth, do check. 1551de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe */ 1552d1a44b2fae5053c957cbde69144ba2ff342a7040Jens Axboe if ((td->io_blocks[DDIR_READ] < s->depth || 1553d1a44b2fae5053c957cbde69144ba2ff342a7040Jens Axboe s->numberio - td->io_blocks[DDIR_READ] > s->depth) && 1554d1a44b2fae5053c957cbde69144ba2ff342a7040Jens Axboe s->numberio > s->depth) 1555de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe return 0; 1556de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1557de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe /* 1558de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe * We're in the window of having to check if this io was 1559de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe * completed or not. If the IO was seen as completed, then 1560de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe * lets verify it. 1561de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe */ 1562de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe for (i = 0; i < s->no_comps; i++) 1563de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe if (io_u->offset == s->offsets[i]) 1564de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe return 0; 1565de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe 1566de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe /* 1567de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe * Not found, we have to stop 1568de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe */ 1569de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe return 1; 1570de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe} 1571