verify.c revision f940128526dbe468a1951cce10c2fe5dbd23875f
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" 26cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 277d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void populate_hdr(struct thread_data *td, struct io_u *io_u, 287d9fb455aadc0c0363489591775496f27f4a560aJens Axboe struct verify_header *hdr, unsigned int header_num, 297d9fb455aadc0c0363489591775496f27f4a560aJens Axboe unsigned int header_len); 307d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 31ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboestatic void fill_pattern(struct thread_data *td, void *p, unsigned int len, 32ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe char *pattern, unsigned int pattern_bytes) 3390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe{ 34ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe switch (pattern_bytes) { 3590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe case 0: 36ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe assert(0); 3790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe break; 3890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe case 1: 39bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill verify pattern b=0 len=%u\n", len); 40ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe memset(p, pattern[0], len); 4190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe break; 420e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran default: { 430e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran unsigned int i = 0, size = 0; 4490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe unsigned char *b = p; 4590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe 46bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill verify pattern b=%d len=%u\n", 47ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe pattern_bytes, len); 48bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 4990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe while (i < len) { 50ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe size = pattern_bytes; 510e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran if (size > (len - i)) 520e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran size = len - i; 53ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe memcpy(b+i, pattern, size); 540e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran i += size; 5590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe } 5690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe break; 5790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe } 5890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe } 5990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe} 6090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe 61ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboevoid fill_buffer_pattern(struct thread_data *td, void *p, unsigned int len) 62ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe{ 63ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe fill_pattern(td, p, len, td->o.buffer_pattern, td->o.buffer_pattern_bytes); 64ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe} 65ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe 66ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboevoid fill_verify_pattern(struct thread_data *td, void *p, unsigned int len, 67ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe struct io_u *io_u, unsigned long seed, int use_seed) 68ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe{ 69ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe if (!td->o.verify_pattern_bytes) { 70ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe dprint(FD_VERIFY, "fill random bytes len=%u\n", len); 71ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe 72ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe if (use_seed) 73ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe __fill_random_buf(p, len, seed); 74ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe else 75c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat io_u->rand_seed = fill_random_buf(&td->__verify_state, p, len); 76ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe return; 77ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe } 78c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat 79ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe if (io_u->buf_filled_len >= len) { 80ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe dprint(FD_VERIFY, "using already filled verify pattern b=%d len=%u\n", 81ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe td->o.verify_pattern_bytes, len); 82ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe return; 83ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe } 84ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe 85ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe fill_pattern(td, p, len, td->o.verify_pattern, td->o.verify_pattern_bytes); 86ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe 87ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe io_u->buf_filled_len = len; 88ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe} 89ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe 90cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboestatic unsigned int get_hdr_inc(struct thread_data *td, struct io_u *io_u) 91cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe{ 92cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe unsigned int hdr_inc; 93cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe 94cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe hdr_inc = io_u->buflen; 958a99fdf63e1350fc2c35794e1c1f779885905b29Jens Axboe if (td->o.verify_interval && td->o.verify_interval <= io_u->buflen) 96cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe hdr_inc = td->o.verify_interval; 97cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe 98cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe return hdr_inc; 99cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe} 100cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe 101c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboestatic void fill_pattern_headers(struct thread_data *td, struct io_u *io_u, 102c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe unsigned long seed, int use_seed) 103c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe{ 104c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe unsigned int hdr_inc, header_num; 105c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe struct verify_header *hdr; 106c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe void *p = io_u->buf; 107c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe 108ce35b1ece06ce27ebff111e47c2a6610c311a92bJens Axboe fill_verify_pattern(td, p, io_u->buflen, io_u, seed, use_seed); 109c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe 110cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe hdr_inc = get_hdr_inc(td, io_u); 111c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe header_num = 0; 112c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe for (; p < io_u->buf + io_u->buflen; p += hdr_inc) { 113c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe hdr = p; 114c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe populate_hdr(td, io_u, hdr, header_num, hdr_inc); 115c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe header_num++; 116c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe } 117c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe} 118c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe 1194764aec9fe5988281bdc114c13ac771fb16713ccJens Axboestatic void memswp(void *buf1, void *buf2, unsigned int len) 120546a9142511875524850ac92776184fd9fb7196eShawn Lewis{ 121dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis char swap[200]; 122dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis 123dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis assert(len <= sizeof(swap)); 12490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe 125546a9142511875524850ac92776184fd9fb7196eShawn Lewis memcpy(&swap, buf1, len); 126546a9142511875524850ac92776184fd9fb7196eShawn Lewis memcpy(buf1, buf2, len); 127546a9142511875524850ac92776184fd9fb7196eShawn Lewis memcpy(buf2, &swap, len); 128546a9142511875524850ac92776184fd9fb7196eShawn Lewis} 129546a9142511875524850ac92776184fd9fb7196eShawn Lewis 130e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void hexdump(void *buffer, int len) 131e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 132e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe unsigned char *p = buffer; 133e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe int i; 134e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 135e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe for (i = 0; i < len; i++) 136bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_err("%02x", p[i]); 137bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_err("\n"); 138e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 139e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 140d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe/* 141de8f6de97438d5664cd8765e60102b9109a273e2Anatol Pomozov * Prepare for separation of verify_header and checksum header 1428767783245faac99a7e1c330a1d6536e579c8402Jens Axboe */ 143546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic inline unsigned int __hdr_size(int verify_type) 1448767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{ 14503e20d687566753b90383571e5e152c5142bdffdBruce Cran unsigned int len = 0; 1468767783245faac99a7e1c330a1d6536e579c8402Jens Axboe 147546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe switch (verify_type) { 148546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_NONE: 149546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_NULL: 150546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = 0; 151546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 152546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_MD5: 153546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_md5); 154546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 155546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC64: 156546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc64); 157546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 158bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe case VERIFY_CRC32C: 159546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC32: 1603845591fadea480177223e28c9d1c03642d34f0eJens Axboe case VERIFY_CRC32C_INTEL: 161546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc32); 162546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 163546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC16: 164546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc16); 165546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 166546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC7: 167546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc7); 168546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 169546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_SHA256: 170546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_sha256); 171546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 172546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_SHA512: 173546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_sha512); 174546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 1757437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis case VERIFY_META: 1767437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis len = sizeof(struct vhdr_meta); 1777437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis break; 1787c353ceb3257b132f4c98326046b42201e070731Jens Axboe case VERIFY_SHA1: 1797c353ceb3257b132f4c98326046b42201e070731Jens Axboe len = sizeof(struct vhdr_sha1); 1807c353ceb3257b132f4c98326046b42201e070731Jens Axboe break; 18192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe case VERIFY_PATTERN: 18292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe len = 0; 18392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe break; 184546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe default: 185546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe log_err("fio: unknown verify header!\n"); 186546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe assert(0); 187546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe } 188546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 189546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe return len + sizeof(struct verify_header); 1908767783245faac99a7e1c330a1d6536e579c8402Jens Axboe} 1918767783245faac99a7e1c330a1d6536e579c8402Jens Axboe 1928767783245faac99a7e1c330a1d6536e579c8402Jens Axboestatic inline unsigned int hdr_size(struct verify_header *hdr) 1938767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{ 194546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe return __hdr_size(hdr->verify_type); 195546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe} 196546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 197546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic void *hdr_priv(struct verify_header *hdr) 198546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe{ 199546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe void *priv = hdr; 200546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 201546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe return priv + sizeof(struct verify_header); 2028767783245faac99a7e1c330a1d6536e579c8402Jens Axboe} 2038767783245faac99a7e1c330a1d6536e579c8402Jens Axboe 2048767783245faac99a7e1c330a1d6536e579c8402Jens Axboe/* 205936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * Verify container, pass info to verify handlers and allow them to 206936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * pass info back in case of error 207936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe */ 208936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestruct vcont { 209936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe /* 210936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * Input 211936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe */ 212936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe struct io_u *io_u; 213936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe unsigned int hdr_num; 2147d9fb455aadc0c0363489591775496f27f4a560aJens Axboe struct thread_data *td; 215936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe 216936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe /* 217936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * Output, only valid in case of error 218936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe */ 219bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe const char *name; 220bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe void *good_crc; 221bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe void *bad_crc; 222936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe unsigned int crc_len; 223936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe}; 224936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe 225c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboestatic void dump_buf(char *buf, unsigned int len, unsigned long long offset, 226c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe const char *type, struct fio_file *f) 2277d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{ 2286f260b317f4cec3027f79b8b329dd3f98c3906acJens Axboe char *ptr, fname[256]; 2297d9fb455aadc0c0363489591775496f27f4a560aJens Axboe int ret, fd; 2307d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 2316f260b317f4cec3027f79b8b329dd3f98c3906acJens Axboe ptr = strdup(f->file_name); 2326f260b317f4cec3027f79b8b329dd3f98c3906acJens Axboe strcpy(fname, basename(ptr)); 233c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe 234c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe sprintf(fname + strlen(fname), ".%llu.%s", offset, type); 2357d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 2367d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fd = open(fname, O_CREAT | O_TRUNC | O_WRONLY, 0644); 2377d9fb455aadc0c0363489591775496f27f4a560aJens Axboe if (fd < 0) { 2387d9fb455aadc0c0363489591775496f27f4a560aJens Axboe perror("open verify buf file"); 2397d9fb455aadc0c0363489591775496f27f4a560aJens Axboe return; 2407d9fb455aadc0c0363489591775496f27f4a560aJens Axboe } 2417d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 2427d9fb455aadc0c0363489591775496f27f4a560aJens Axboe while (len) { 2437d9fb455aadc0c0363489591775496f27f4a560aJens Axboe ret = write(fd, buf, len); 2447d9fb455aadc0c0363489591775496f27f4a560aJens Axboe if (!ret) 2457d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 2467d9fb455aadc0c0363489591775496f27f4a560aJens Axboe else if (ret < 0) { 2477d9fb455aadc0c0363489591775496f27f4a560aJens Axboe perror("write verify buf file"); 2487d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 2497d9fb455aadc0c0363489591775496f27f4a560aJens Axboe } 2507d9fb455aadc0c0363489591775496f27f4a560aJens Axboe len -= ret; 2517d9fb455aadc0c0363489591775496f27f4a560aJens Axboe buf += ret; 2527d9fb455aadc0c0363489591775496f27f4a560aJens Axboe } 2537d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 2547d9fb455aadc0c0363489591775496f27f4a560aJens Axboe close(fd); 255c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe log_err(" %s data dumped as %s\n", type, fname); 2566f260b317f4cec3027f79b8b329dd3f98c3906acJens Axboe free(ptr); 2577d9fb455aadc0c0363489591775496f27f4a560aJens Axboe} 2587d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 259c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe/* 260c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * Dump the contents of the read block and re-generate the correct data 261c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * and dump that too. 262c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe */ 2637d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void dump_verify_buffers(struct verify_header *hdr, struct vcont *vc) 2647d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{ 2657d9fb455aadc0c0363489591775496f27f4a560aJens Axboe struct thread_data *td = vc->td; 2667d9fb455aadc0c0363489591775496f27f4a560aJens Axboe struct io_u *io_u = vc->io_u; 2677d9fb455aadc0c0363489591775496f27f4a560aJens Axboe unsigned long hdr_offset; 2687d9fb455aadc0c0363489591775496f27f4a560aJens Axboe struct io_u dummy; 269c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe void *buf; 2707d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 2710dce9bc9b21a8d91aa55a29258dfaeffc57bd466Steven Lang if (!td->o.verify_dump) 2720dce9bc9b21a8d91aa55a29258dfaeffc57bd466Steven Lang return; 2730dce9bc9b21a8d91aa55a29258dfaeffc57bd466Steven Lang 274c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe /* 275c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * Dump the contents we just read off disk 276c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe */ 2777d9fb455aadc0c0363489591775496f27f4a560aJens Axboe hdr_offset = vc->hdr_num * hdr->len; 2787d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 279c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe dump_buf(io_u->buf + hdr_offset, hdr->len, io_u->offset + hdr_offset, 280c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe "received", vc->io_u->file); 2817d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 282c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe /* 283c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * Allocate a new buf and re-generate the original data 284c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe */ 285c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe buf = malloc(io_u->buflen); 2867d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dummy = *io_u; 287c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe dummy.buf = buf; 2884aae38a645f3315ca2f8cc57a7ec4110ba7d8319Jens Axboe dummy.rand_seed = hdr->rand_seed; 289cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe dummy.buf_filled_len = 0; 2900d81daf9d164c4bf829f4911e1f7b211c2e661fbJosef Bacik dummy.buflen = io_u->buflen; 2917d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 292c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe fill_pattern_headers(td, &dummy, hdr->rand_seed, 1); 2937d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 294c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe dump_buf(buf + hdr_offset, hdr->len, io_u->offset + hdr_offset, 295c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe "expected", vc->io_u->file); 2967d9fb455aadc0c0363489591775496f27f4a560aJens Axboe free(buf); 2977d9fb455aadc0c0363489591775496f27f4a560aJens Axboe} 2987d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 299bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboestatic void log_verify_failure(struct verify_header *hdr, struct vcont *vc) 300bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe{ 301bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe unsigned long long offset; 302bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe 303bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe offset = vc->io_u->offset; 304bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe offset += vc->hdr_num * hdr->len; 30532c17adf7f75da1f0957d4691633fea60259910fJens Axboe log_err("%.8s: verify failed at file %s offset %llu, length %u\n", 30632c17adf7f75da1f0957d4691633fea60259910fJens Axboe vc->name, vc->io_u->file->file_name, offset, hdr->len); 307bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe 308bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (vc->good_crc && vc->bad_crc) { 309bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_err(" Expected CRC: "); 310bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe hexdump(vc->good_crc, vc->crc_len); 311bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_err(" Received CRC: "); 312bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe hexdump(vc->bad_crc, vc->crc_len); 313bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe } 3147d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 3157d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dump_verify_buffers(hdr, vc); 316bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe} 317bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe 318936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe/* 319d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe * Return data area 'header_num' 320d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe */ 321936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic inline void *io_u_verify_off(struct verify_header *hdr, struct vcont *vc) 322d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe{ 323936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe return vc->io_u->buf + vc->hdr_num * hdr->len + hdr_size(hdr); 324d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe} 325d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe 32692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboestatic int verify_io_u_pattern(struct verify_header *hdr, struct vcont *vc) 32792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe{ 32892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe struct thread_data *td = vc->td; 32992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe struct io_u *io_u = vc->io_u; 33092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe char *buf, *pattern; 3312b13e716c0921356c0930522718e00b8df34293aJens Axboe unsigned int header_size = __hdr_size(td->o.verify); 3329a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang unsigned int len, mod, i, size, pattern_size; 33392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe 33492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe pattern = td->o.verify_pattern; 3359a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang pattern_size = td->o.verify_pattern_bytes; 3369a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang if (pattern_size <= 1) 3379a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang pattern_size = MAX_PATTERN_SIZE; 3382b13e716c0921356c0930522718e00b8df34293aJens Axboe buf = (void *) hdr + header_size; 3392b13e716c0921356c0930522718e00b8df34293aJens Axboe len = get_hdr_inc(td, io_u) - header_size; 3409a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang mod = header_size % pattern_size; 3419a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang 3429a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang for (i = 0; i < len; i += size) { 3439a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang size = pattern_size - mod; 3449a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang if (size > (len - i)) 3459a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang size = len - i; 3469a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang if (memcmp(buf + i, pattern + mod, size)) 347e4ad68b1364aebfe949e2d6a649c7b1001ebca07Jens Axboe /* Let the slow compare find the first mismatch byte. */ 3489a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang break; 3499a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang mod = 0; 3509a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang } 35192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe 3529a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang for (; i < len; i++) { 35392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe if (buf[i] != pattern[mod]) { 35492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe unsigned int bits; 35592bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe 35692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe bits = hweight8(buf[i] ^ pattern[mod]); 35792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe log_err("fio: got pattern %x, wanted %x. Bad bits %d\n", 35892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe buf[i], pattern[mod], bits); 35992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe log_err("fio: bad pattern block offset %u\n", i); 36092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe dump_verify_buffers(hdr, vc); 36192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe return EILSEQ; 36292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe } 36392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe mod++; 36492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe if (mod == td->o.verify_pattern_bytes) 36592bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe mod = 0; 36692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe } 36792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe 36892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe return 0; 36992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe} 37092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe 37192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboestatic int verify_io_u_meta(struct verify_header *hdr, struct vcont *vc) 3727437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{ 37392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe struct thread_data *td = vc->td; 3747437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis struct vhdr_meta *vh = hdr_priv(hdr); 375936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe struct io_u *io_u = vc->io_u; 37692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe int ret = EILSEQ; 3777437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 378bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "meta verify io_u %p, len %u\n", io_u, hdr->len); 379bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 380bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (vh->offset == io_u->offset + vc->hdr_num * td->o.verify_interval) 38192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe ret = 0; 38292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe 38392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe if (td->o.verify_pattern_bytes) 38492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe ret |= verify_io_u_pattern(hdr, vc); 38592bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe 386da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse /* 387da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse * For read-only workloads, the program cannot be certain of the 388da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse * last numberio written to a block. Checking of numberio will be done 389da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse * only for workloads that write data. 390621677626f2551bedfdc4a5fc3b3e5f8492b94faJuan Casse * For verify_only, numberio will be checked in the last iteration when 391621677626f2551bedfdc4a5fc3b3e5f8492b94faJuan Casse * the correct state of numberio, that would have been written to each 392621677626f2551bedfdc4a5fc3b3e5f8492b94faJuan Casse * block in a previous run of fio, has been reached. 393da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse */ 394da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse if (td_write(td) || td_rw(td)) 395621677626f2551bedfdc4a5fc3b3e5f8492b94faJuan Casse if (!td->o.verify_only || td->o.loops == 0) 396621677626f2551bedfdc4a5fc3b3e5f8492b94faJuan Casse if (vh->numberio != io_u->numberio) 397621677626f2551bedfdc4a5fc3b3e5f8492b94faJuan Casse ret = EILSEQ; 398da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse 39992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe if (!ret) 400bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 4017437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 402bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "meta"; 403bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 40492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe return ret; 4057437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis} 4067437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 407936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha512(struct verify_header *hdr, struct vcont *vc) 408cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 409936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 410546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha512 *vh = hdr_priv(hdr); 411cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe uint8_t sha512[128]; 41225dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe struct fio_sha512_ctx sha512_ctx = { 413cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe .buf = sha512, 414cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 415cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 416936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "sha512 verify io_u %p, len %u\n", vc->io_u, hdr->len); 417bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 41825dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha512_init(&sha512_ctx); 41925dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha512_update(&sha512_ctx, p, hdr->len - hdr_size(hdr)); 420cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 421bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (!memcmp(vh->sha512, sha512_ctx.buf, sizeof(sha512))) 422bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 423cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 424bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "sha512"; 425bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = vh->sha512; 426bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = sha512_ctx.buf; 427bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = sizeof(vh->sha512); 428bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 429bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 430cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 431cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 432936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha256(struct verify_header *hdr, struct vcont *vc) 433cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 434936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 435546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha256 *vh = hdr_priv(hdr); 436bc77f56f79f6ae155e9eb26263ed686ef28b47ecJens Axboe uint8_t sha256[64]; 43725dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe struct fio_sha256_ctx sha256_ctx = { 438cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe .buf = sha256, 439cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 440cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 441936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "sha256 verify io_u %p, len %u\n", vc->io_u, hdr->len); 442bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 44325dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha256_init(&sha256_ctx); 44425dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha256_update(&sha256_ctx, p, hdr->len - hdr_size(hdr)); 445cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 446bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (!memcmp(vh->sha256, sha256_ctx.buf, sizeof(sha256))) 447bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 448cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 449bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "sha256"; 450bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = vh->sha256; 451bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = sha256_ctx.buf; 452bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = sizeof(vh->sha256); 453bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 454bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 455cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 456cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 457936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha1(struct verify_header *hdr, struct vcont *vc) 4587c353ceb3257b132f4c98326046b42201e070731Jens Axboe{ 459936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 4607c353ceb3257b132f4c98326046b42201e070731Jens Axboe struct vhdr_sha1 *vh = hdr_priv(hdr); 4617c353ceb3257b132f4c98326046b42201e070731Jens Axboe uint32_t sha1[5]; 46225dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe struct fio_sha1_ctx sha1_ctx = { 4637c353ceb3257b132f4c98326046b42201e070731Jens Axboe .H = sha1, 4647c353ceb3257b132f4c98326046b42201e070731Jens Axboe }; 4657c353ceb3257b132f4c98326046b42201e070731Jens Axboe 466936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "sha1 verify io_u %p, len %u\n", vc->io_u, hdr->len); 4677c353ceb3257b132f4c98326046b42201e070731Jens Axboe 46825dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha1_init(&sha1_ctx); 46925dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha1_update(&sha1_ctx, p, hdr->len - hdr_size(hdr)); 4707c353ceb3257b132f4c98326046b42201e070731Jens Axboe 471bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (!memcmp(vh->sha1, sha1_ctx.H, sizeof(sha1))) 472bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 4737c353ceb3257b132f4c98326046b42201e070731Jens Axboe 474bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "sha1"; 475bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = vh->sha1; 476bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = sha1_ctx.H; 477bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = sizeof(vh->sha1); 478bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 479bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 4807c353ceb3257b132f4c98326046b42201e070731Jens Axboe} 4817c353ceb3257b132f4c98326046b42201e070731Jens Axboe 482936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc7(struct verify_header *hdr, struct vcont *vc) 4831e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{ 484936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 485546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc7 *vh = hdr_priv(hdr); 4861e154bdbf14a1d352117aea057035235b66f0381Jens Axboe unsigned char c; 4871e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 488936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "crc7 verify io_u %p, len %u\n", vc->io_u, hdr->len); 489bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 49025dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe c = fio_crc7(p, hdr->len - hdr_size(hdr)); 4911e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 492bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (c == vh->crc7) 493bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 4941e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 495bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "crc7"; 496bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = &vh->crc7; 497bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = &c; 498bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = 1; 499bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 500bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 5011e154bdbf14a1d352117aea057035235b66f0381Jens Axboe} 5021e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 503936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc16(struct verify_header *hdr, struct vcont *vc) 504969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{ 505936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 506546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc16 *vh = hdr_priv(hdr); 507969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe unsigned short c; 508969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 509936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "crc16 verify io_u %p, len %u\n", vc->io_u, hdr->len); 510bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 51125dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe c = fio_crc16(p, hdr->len - hdr_size(hdr)); 512969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 513bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (c == vh->crc16) 514bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 515969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 516bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "crc16"; 517bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = &vh->crc16; 518bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = &c; 519bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = 2; 520bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 521bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 522969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe} 523969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 524936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc64(struct verify_header *hdr, struct vcont *vc) 525d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{ 526936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 527546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc64 *vh = hdr_priv(hdr); 528d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe unsigned long long c; 529d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 530936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "crc64 verify io_u %p, len %u\n", vc->io_u, hdr->len); 531bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 53225dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe c = fio_crc64(p, hdr->len - hdr_size(hdr)); 533d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 534bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (c == vh->crc64) 535bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 536d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 537bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "crc64"; 538bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = &vh->crc64; 539bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = &c; 540bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = 8; 541bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 542bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 543d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe} 544d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 545936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc32(struct verify_header *hdr, struct vcont *vc) 546e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 547936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 548546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 549546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe uint32_t c; 550e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 551936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "crc32 verify io_u %p, len %u\n", vc->io_u, hdr->len); 552bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 55325dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe c = fio_crc32(p, hdr->len - hdr_size(hdr)); 554e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 555bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (c == vh->crc32) 556bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 557e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 558bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "crc32"; 559bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = &vh->crc32; 560bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = &c; 561bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = 4; 562bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 563bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 564e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 565e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 566936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc32c(struct verify_header *hdr, struct vcont *vc) 567bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{ 568936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 569bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 570bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe uint32_t c; 571bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 572936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "crc32c verify io_u %p, len %u\n", vc->io_u, hdr->len); 573bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 57425dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe c = fio_crc32c(p, hdr->len - hdr_size(hdr)); 575bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 576bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (c == vh->crc32) 577bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 578bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 579bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "crc32c"; 580bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = &vh->crc32; 581bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = &c; 582bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = 4; 583bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 584bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 585bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe} 586bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 587936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_md5(struct verify_header *hdr, struct vcont *vc) 588e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 589936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 590546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_md5 *vh = hdr_priv(hdr); 5918c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe uint32_t hash[MD5_HASH_WORDS]; 59225dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe struct fio_md5_ctx md5_ctx = { 5938c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe .hash = hash, 5948c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe }; 595e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 596936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "md5 verify io_u %p, len %u\n", vc->io_u, hdr->len); 597bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 59825dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_md5_init(&md5_ctx); 59925dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_md5_update(&md5_ctx, p, hdr->len - hdr_size(hdr)); 600e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 601bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (!memcmp(vh->md5_digest, md5_ctx.hash, sizeof(hash))) 602bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 603e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 604bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "md5"; 605bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = vh->md5_digest; 606bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = md5_ctx.hash; 607bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = sizeof(hash); 608bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 609bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 610e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 611e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 612e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe/* 613e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe * Push IO verification to a separate thread 614e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe */ 615e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_io_u_async(struct thread_data *td, struct io_u *io_u) 616e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{ 617e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (io_u->file) 618e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe put_file_log(td, io_u->file); 619e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 620e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_lock(&td->io_u_lock); 621d7ee2a7d431c2cabdf56d04ca14805cad72cf985Steven Lang 6220c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran if (io_u->flags & IO_U_F_IN_CUR_DEPTH) { 6230c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran td->cur_depth--; 6240c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran io_u->flags &= ~IO_U_F_IN_CUR_DEPTH; 6250c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran } 6262ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe flist_add_tail(&io_u->verify_list, &td->verify_list); 6272ecc1b57721e3cb72bbf558bc169c97037fe3d0aJens Axboe io_u->flags |= IO_U_F_FREE_DEF; 628e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 629e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 630e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_signal(&td->verify_cond); 631e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe return 0; 632e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe} 633e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 6340d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboestatic int verify_trimmed_io_u(struct thread_data *td, struct io_u *io_u) 6350d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe{ 6360d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe static char zero_buf[1024]; 6370d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe unsigned int this_len, len; 6380d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe int ret = 0; 6390d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe void *p; 6400d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 6410d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe if (!td->o.trim_zero) 6420d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe return 0; 6430d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 6440d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe len = io_u->buflen; 6450d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe p = io_u->buf; 6460d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe do { 6470d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe this_len = sizeof(zero_buf); 6480d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe if (this_len > len) 6490d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe this_len = len; 6500d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe if (memcmp(p, zero_buf, this_len)) { 6510d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe ret = EILSEQ; 6520d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe break; 6530d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe } 6540d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe len -= this_len; 6550d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe p += this_len; 6560d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe } while (len); 6570d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 6580d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe if (!ret) 6590d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe return 0; 6600d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 661a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe log_err("trim: verify failed at file %s offset %llu, length %lu" 662a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe ", block offset %lu\n", 663a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe io_u->file->file_name, io_u->offset, io_u->buflen, 6642f68124f26e54233db41b462a257dabc48e5c32bJens Axboe (unsigned long) (p - io_u->buf)); 6650d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe return ret; 6660d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe} 6670d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 6680ae2c6e1d4727515e35e682eae6776fe55fa0275Jens Axboestatic int verify_header(struct io_u *io_u, struct verify_header *hdr) 669f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe{ 670f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe void *p = hdr; 671f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe uint32_t crc; 672f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe 673ae38c0dcd570265aef09aa132ce27278d8909a1dJens Axboe if (hdr->magic != FIO_HDR_MAGIC) 674e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse return 1; 675e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse if (hdr->len > io_u->buflen) 676e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse return 2; 677e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse if (hdr->rand_seed != io_u->rand_seed) 678e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse return 3; 679ae38c0dcd570265aef09aa132ce27278d8909a1dJens Axboe 68025dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe crc = fio_crc32c(p, offsetof(struct verify_header, crc32)); 681f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe if (crc == hdr->crc32) 682e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse return 0; 683f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe log_err("fio: verify header crc %x, calculated %x\n", hdr->crc32, crc); 684e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse return 4; 685f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe} 686f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe 68736690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboeint verify_io_u(struct thread_data *td, struct io_u *io_u) 688e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 6893f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis struct verify_header *hdr; 6902b13e716c0921356c0930522718e00b8df34293aJens Axboe unsigned int header_size, hdr_inc, hdr_num = 0; 69195646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe void *p; 692e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe int ret; 693e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 6941dcc049824b840df1ee0ef5d019fffa4037e1bb0Shawn Lewis if (td->o.verify == VERIFY_NULL || io_u->ddir != DDIR_READ) 69536690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe return 0; 6960d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe if (io_u->flags & IO_U_F_TRIMMED) { 6970d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe ret = verify_trimmed_io_u(td, io_u); 6980d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe goto done; 6990d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe } 70036690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe 701cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe hdr_inc = get_hdr_inc(td, io_u); 702e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 703a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe ret = 0; 7045ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe for (p = io_u->buf; p < io_u->buf + io_u->buflen; 7055ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe p += hdr_inc, hdr_num++) { 706bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe struct vcont vc = { 707bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe .io_u = io_u, 708bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe .hdr_num = hdr_num, 7097d9fb455aadc0c0363489591775496f27f4a560aJens Axboe .td = td, 710bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe }; 711f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe unsigned int verify_type; 712936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe 713f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe if (ret && td->o.verify_fatal) 714a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe break; 715f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe 7162b13e716c0921356c0930522718e00b8df34293aJens Axboe header_size = __hdr_size(td->o.verify); 717a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe if (td->o.verify_offset) 7182b13e716c0921356c0930522718e00b8df34293aJens Axboe memswp(p, p + td->o.verify_offset, header_size); 71995646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe hdr = p; 720e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 721c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat /* 722c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat * Make rand_seed check pass when have verifysort or 723c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat * verify_backlog. 724c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat */ 725c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat if (td->o.verifysort || (td->flags & TD_F_VER_BACKLOG)) 726c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat io_u->rand_seed = hdr->rand_seed; 727c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat 728e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse ret = verify_header(io_u, hdr); 729e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse switch (ret) { 730e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse case 0: 731e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse break; 732e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse case 1: 733ae38c0dcd570265aef09aa132ce27278d8909a1dJens Axboe log_err("verify: bad magic header %x, wanted %x at " 734ae38c0dcd570265aef09aa132ce27278d8909a1dJens Axboe "file %s offset %llu, length %u\n", 735d3a173a927084660c365d6aa162016ebb0746946Jens Axboe hdr->magic, FIO_HDR_MAGIC, 736c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe io_u->file->file_name, 737c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe io_u->offset + hdr_num * hdr->len, hdr->len); 7389fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 739e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse break; 740e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse case 2: 741e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse log_err("fio: verify header exceeds buffer length (%u " 742e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse "> %lu)\n", hdr->len, io_u->buflen); 743e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse return EILSEQ; 744e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse break; 745e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse case 3: 746e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse log_err("verify: bad header rand_seed %"PRIu64 747e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse ", wanted %"PRIu64" at file %s offset %llu, " 748e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse "length %u\n", 749e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse hdr->rand_seed, io_u->rand_seed, 750e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse io_u->file->file_name, 751e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse io_u->offset + hdr_num * hdr->len, hdr->len); 752e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse return EILSEQ; 753e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse break; 754e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse case 4: 755e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse return EILSEQ; 756e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse break; 757e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse default: 758e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse log_err("verify: unknown header error at file %s " 759e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse "offset %llu, length %u\n", 760e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse io_u->file->file_name, 761e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse io_u->offset + hdr_num * hdr->len, hdr->len); 762e9e177cce9df45eca77a4a0822a8247e60f2680bJuan Casse return EILSEQ; 7633f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe } 7643f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe 765f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe if (td->o.verify != VERIFY_NONE) 766f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe verify_type = td->o.verify; 767f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe else 768f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe verify_type = hdr->verify_type; 769f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe 770f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe switch (verify_type) { 7713f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_MD5: 772936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_md5(hdr, &vc); 7733f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 7743f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC64: 775936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_crc64(hdr, &vc); 7763f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 777bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe case VERIFY_CRC32C: 7783845591fadea480177223e28c9d1c03642d34f0eJens Axboe case VERIFY_CRC32C_INTEL: 779936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_crc32c(hdr, &vc); 780bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe break; 7813f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC32: 782936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_crc32(hdr, &vc); 7833f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 7843f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC16: 785936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_crc16(hdr, &vc); 7863f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 7873f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC7: 788936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_crc7(hdr, &vc); 7893f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 790cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe case VERIFY_SHA256: 791936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_sha256(hdr, &vc); 792cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe break; 793cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe case VERIFY_SHA512: 794936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_sha512(hdr, &vc); 795cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe break; 7967437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis case VERIFY_META: 79792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe ret = verify_io_u_meta(hdr, &vc); 7987437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis break; 7997c353ceb3257b132f4c98326046b42201e070731Jens Axboe case VERIFY_SHA1: 800936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_sha1(hdr, &vc); 8017c353ceb3257b132f4c98326046b42201e070731Jens Axboe break; 80292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe case VERIFY_PATTERN: 80392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe ret = verify_io_u_pattern(hdr, &vc); 80492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe break; 8053f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis default: 8063f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("Bad verify type %u\n", hdr->verify_type); 807d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe ret = EINVAL; 8083f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis } 809f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe 810f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe if (ret && verify_type != hdr->verify_type) 811f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe log_err("fio: verify type mismatch (%u media, %u given)\n", 812f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe hdr->verify_type, verify_type); 8133f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis } 814a7dfe862c2e3fe72b8db6a6e67302048d3731c6dJens Axboe 8150d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboedone: 816f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe if (ret && td->o.verify_fatal) 817f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe td->terminate = 1; 818f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe 819a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe return ret; 820e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 821e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 8227437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic void fill_meta(struct verify_header *hdr, struct thread_data *td, 8235ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe struct io_u *io_u, unsigned int header_num) 8247437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{ 8257437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis struct vhdr_meta *vh = hdr_priv(hdr); 8267437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 8277437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->thread = td->thread_number; 8287437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 8297437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->time_sec = io_u->start_time.tv_sec; 8307437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->time_usec = io_u->start_time.tv_usec; 8317437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 832da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse vh->numberio = io_u->numberio; 8337437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 8347437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->offset = io_u->offset + header_num * td->o.verify_interval; 8357437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis} 8367437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 837cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha512(struct verify_header *hdr, void *p, unsigned int len) 838cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 839546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha512 *vh = hdr_priv(hdr); 84025dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe struct fio_sha512_ctx sha512_ctx = { 841546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe .buf = vh->sha512, 842cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 843cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 84425dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha512_init(&sha512_ctx); 84525dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha512_update(&sha512_ctx, p, len); 846cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 847cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 848cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha256(struct verify_header *hdr, void *p, unsigned int len) 849cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 850546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha256 *vh = hdr_priv(hdr); 85125dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe struct fio_sha256_ctx sha256_ctx = { 852546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe .buf = vh->sha256, 853cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 854cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 85525dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha256_init(&sha256_ctx); 85625dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha256_update(&sha256_ctx, p, len); 857cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 858cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 8597c353ceb3257b132f4c98326046b42201e070731Jens Axboestatic void fill_sha1(struct verify_header *hdr, void *p, unsigned int len) 8607c353ceb3257b132f4c98326046b42201e070731Jens Axboe{ 8617c353ceb3257b132f4c98326046b42201e070731Jens Axboe struct vhdr_sha1 *vh = hdr_priv(hdr); 86225dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe struct fio_sha1_ctx sha1_ctx = { 8637c353ceb3257b132f4c98326046b42201e070731Jens Axboe .H = vh->sha1, 8647c353ceb3257b132f4c98326046b42201e070731Jens Axboe }; 8657c353ceb3257b132f4c98326046b42201e070731Jens Axboe 86625dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha1_init(&sha1_ctx); 86725dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha1_update(&sha1_ctx, p, len); 8687c353ceb3257b132f4c98326046b42201e070731Jens Axboe} 8697c353ceb3257b132f4c98326046b42201e070731Jens Axboe 8701e154bdbf14a1d352117aea057035235b66f0381Jens Axboestatic void fill_crc7(struct verify_header *hdr, void *p, unsigned int len) 8711e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{ 872546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc7 *vh = hdr_priv(hdr); 873546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 87425dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe vh->crc7 = fio_crc7(p, len); 8751e154bdbf14a1d352117aea057035235b66f0381Jens Axboe} 8761e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 877969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboestatic void fill_crc16(struct verify_header *hdr, void *p, unsigned int len) 878969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{ 879546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc16 *vh = hdr_priv(hdr); 880546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 88125dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe vh->crc16 = fio_crc16(p, len); 882969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe} 883969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 884e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_crc32(struct verify_header *hdr, void *p, unsigned int len) 885e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 886546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 887546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 88825dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe vh->crc32 = fio_crc32(p, len); 889e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 890e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 891bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboestatic void fill_crc32c(struct verify_header *hdr, void *p, unsigned int len) 892bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{ 893bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 894bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 89525dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe vh->crc32 = fio_crc32c(p, len); 896bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe} 897bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 898d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboestatic void fill_crc64(struct verify_header *hdr, void *p, unsigned int len) 899d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{ 900546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc64 *vh = hdr_priv(hdr); 901546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 90225dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe vh->crc64 = fio_crc64(p, len); 903d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe} 904d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 905e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_md5(struct verify_header *hdr, void *p, unsigned int len) 906e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 907546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_md5 *vh = hdr_priv(hdr); 90825dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe struct fio_md5_ctx md5_ctx = { 909546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe .hash = (uint32_t *) vh->md5_digest, 9108c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe }; 911e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 91225dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_md5_init(&md5_ctx); 91325dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_md5_update(&md5_ctx, p, len); 914e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 915e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 9167d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void populate_hdr(struct thread_data *td, struct io_u *io_u, 9177d9fb455aadc0c0363489591775496f27f4a560aJens Axboe struct verify_header *hdr, unsigned int header_num, 9187d9fb455aadc0c0363489591775496f27f4a560aJens Axboe unsigned int header_len) 9197d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{ 9207d9fb455aadc0c0363489591775496f27f4a560aJens Axboe unsigned int data_len; 9217d9fb455aadc0c0363489591775496f27f4a560aJens Axboe void *data, *p; 9227d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 9237d9fb455aadc0c0363489591775496f27f4a560aJens Axboe p = (void *) hdr; 9247d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 925d3a173a927084660c365d6aa162016ebb0746946Jens Axboe hdr->magic = FIO_HDR_MAGIC; 9267d9fb455aadc0c0363489591775496f27f4a560aJens Axboe hdr->verify_type = td->o.verify; 927d3a173a927084660c365d6aa162016ebb0746946Jens Axboe hdr->len = header_len; 9287d9fb455aadc0c0363489591775496f27f4a560aJens Axboe hdr->rand_seed = io_u->rand_seed; 92925dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe hdr->crc32 = fio_crc32c(p, offsetof(struct verify_header, crc32)); 930f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe 9317d9fb455aadc0c0363489591775496f27f4a560aJens Axboe data_len = header_len - hdr_size(hdr); 9327d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 9337d9fb455aadc0c0363489591775496f27f4a560aJens Axboe data = p + hdr_size(hdr); 9347d9fb455aadc0c0363489591775496f27f4a560aJens Axboe switch (td->o.verify) { 9357d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_MD5: 9367d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill md5 io_u %p, len %u\n", 9377d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 9387d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_md5(hdr, data, data_len); 9397d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 9407d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_CRC64: 9417d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill crc64 io_u %p, len %u\n", 9427d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 9437d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_crc64(hdr, data, data_len); 9447d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 9457d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_CRC32C: 9467d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_CRC32C_INTEL: 9477d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill crc32c io_u %p, len %u\n", 9487d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 9497d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_crc32c(hdr, data, data_len); 9507d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 9517d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_CRC32: 9527d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill crc32 io_u %p, len %u\n", 9537d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 9547d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_crc32(hdr, data, data_len); 9557d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 9567d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_CRC16: 9577d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill crc16 io_u %p, len %u\n", 9587d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 9597d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_crc16(hdr, data, data_len); 9607d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 9617d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_CRC7: 9627d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill crc7 io_u %p, len %u\n", 9637d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 9647d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_crc7(hdr, data, data_len); 9657d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 9667d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_SHA256: 9677d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill sha256 io_u %p, len %u\n", 9687d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 9697d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_sha256(hdr, data, data_len); 9707d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 9717d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_SHA512: 9727d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill sha512 io_u %p, len %u\n", 9737d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 9747d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_sha512(hdr, data, data_len); 9757d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 9767d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_META: 9777d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill meta io_u %p, len %u\n", 9787d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 9797d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_meta(hdr, td, io_u, header_num); 9807d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 9817d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_SHA1: 9827d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill sha1 io_u %p, len %u\n", 9837d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 9847d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_sha1(hdr, data, data_len); 9857d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 98692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe case VERIFY_PATTERN: 98792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe /* nothing to do here */ 98892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe break; 9897d9fb455aadc0c0363489591775496f27f4a560aJens Axboe default: 9907d9fb455aadc0c0363489591775496f27f4a560aJens Axboe log_err("fio: bad verify type: %d\n", td->o.verify); 9917d9fb455aadc0c0363489591775496f27f4a560aJens Axboe assert(0); 9927d9fb455aadc0c0363489591775496f27f4a560aJens Axboe } 9937d9fb455aadc0c0363489591775496f27f4a560aJens Axboe if (td->o.verify_offset) 9947d9fb455aadc0c0363489591775496f27f4a560aJens Axboe memswp(p, p + td->o.verify_offset, hdr_size(hdr)); 9957d9fb455aadc0c0363489591775496f27f4a560aJens Axboe} 9967d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 997e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe/* 998e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * fill body of io_u->buf with random data and add a header with the 999c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * checksum of choice 1000e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe */ 1001e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboevoid populate_verify_io_u(struct thread_data *td, struct io_u *io_u) 1002e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 10039cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe if (td->o.verify == VERIFY_NULL) 10049cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe return; 10059cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe 1006da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse io_u->numberio = td->io_issues[io_u->ddir]; 1007da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse 1008c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe fill_pattern_headers(td, io_u, 0, 0); 1009e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 1010e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 1011e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboeint get_next_verify(struct thread_data *td, struct io_u *io_u) 1012e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 10138de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe struct io_piece *ipo = NULL; 1014e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 1015d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe /* 1016d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe * this io_u is from a requeue, we already filled the offsets 1017d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe */ 1018d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe if (io_u->file) 1019d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe return 0; 1020d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe 10218de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe if (!RB_EMPTY_ROOT(&td->io_hist_tree)) { 10228de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe struct rb_node *n = rb_first(&td->io_hist_tree); 1023e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 10248de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe ipo = rb_entry(n, struct io_piece, rb_node); 1025f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe 1026f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe /* 1027f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe * Ensure that the associated IO has completed 1028f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe */ 1029f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe read_barrier(); 1030f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe if (ipo->flags & IP_F_IN_FLIGHT) 1031f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe goto nothing; 1032f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe 10334b87898e8d76aaf05baec83077a11311c1447397Jens Axboe rb_erase(n, &td->io_hist_tree); 1034a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe assert(ipo->flags & IP_F_ONRB); 1035a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe ipo->flags &= ~IP_F_ONRB; 103601743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe } else if (!flist_empty(&td->io_hist_list)) { 103701743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe ipo = flist_entry(td->io_hist_list.next, struct io_piece, list); 1038f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe 1039f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe /* 1040f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe * Ensure that the associated IO has completed 1041f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe */ 1042f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe read_barrier(); 1043f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe if (ipo->flags & IP_F_IN_FLIGHT) 1044f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe goto nothing; 1045f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe 104601743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe flist_del(&ipo->list); 1047a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe assert(ipo->flags & IP_F_ONLIST); 1048a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe ipo->flags &= ~IP_F_ONLIST; 10498de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe } 1050e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 10518de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe if (ipo) { 10520d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe td->io_hist_len--; 10530d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 1054e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe io_u->offset = ipo->offset; 1055e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe io_u->buflen = ipo->len; 1056da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse io_u->numberio = ipo->numberio; 105736167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe io_u->file = ipo->file; 105882af2a7ca1a543b41c003de69d5e3c36860f47d5Jens Axboe io_u->flags |= IO_U_F_VER_LIST; 105997af62cec418cd722fb43c6010d6430534e12353Jens Axboe 10600d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe if (ipo->flags & IP_F_TRIMMED) 10610d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe io_u->flags |= IO_U_F_TRIMMED; 10620d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 1063d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (!fio_file_open(io_u->file)) { 106497af62cec418cd722fb43c6010d6430534e12353Jens Axboe int r = td_io_open_file(td, io_u->file); 106597af62cec418cd722fb43c6010d6430534e12353Jens Axboe 1066bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe if (r) { 1067bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "failed file %s open\n", 1068bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u->file->file_name); 106997af62cec418cd722fb43c6010d6430534e12353Jens Axboe return 1; 1070bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe } 107197af62cec418cd722fb43c6010d6430534e12353Jens Axboe } 107297af62cec418cd722fb43c6010d6430534e12353Jens Axboe 107397af62cec418cd722fb43c6010d6430534e12353Jens Axboe get_file(ipo->file); 1074d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe assert(fio_file_open(io_u->file)); 1075e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe io_u->ddir = DDIR_READ; 107636167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe io_u->xfer_buf = io_u->buf; 107736167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe io_u->xfer_buflen = io_u->buflen; 10780d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 10790d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe remove_trim_entry(td, ipo); 1080e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe free(ipo); 1081bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "get_next_verify: ret io_u %p\n", io_u); 1082c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat 1083c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat if (!td->o.verify_pattern_bytes) { 1084c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat io_u->rand_seed = __rand(&td->__verify_state); 1085c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat if (sizeof(int) != sizeof(long *)) 1086c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat io_u->rand_seed *= __rand(&td->__verify_state); 1087c4b6117b236370b174f3e3d2e299bf8b3733be97Puthikorn Voravootivat } 1088e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe return 0; 1089e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe } 1090e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 1091f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboenothing: 1092bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "get_next_verify: empty\n"); 1093e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe return 1; 1094e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 1095e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1096dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboevoid fio_verify_init(struct thread_data *td) 1097dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe{ 1098dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe if (td->o.verify == VERIFY_CRC32C_INTEL || 1099dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe td->o.verify == VERIFY_CRC32C) { 1100dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe crc32c_intel_probe(); 1101dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe } 1102dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe} 1103dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe 1104e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboestatic void *verify_async_thread(void *data) 1105e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{ 1106e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe struct thread_data *td = data; 1107e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe struct io_u *io_u; 1108e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe int ret = 0; 1109e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1110e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (td->o.verify_cpumask_set && 1111e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe fio_setaffinity(td->pid, td->o.verify_cpumask)) { 1112e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe log_err("fio: failed setting verify thread affinity\n"); 1113e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe goto done; 1114e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 1115e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1116e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe do { 1117e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe FLIST_HEAD(list); 1118e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe 1119e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe read_barrier(); 1120e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (td->verify_thread_exit) 1121e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe break; 1122e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1123e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_lock(&td->io_u_lock); 1124e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1125e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe while (flist_empty(&td->verify_list) && 1126e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe !td->verify_thread_exit) { 1127b36e298b5bdfc31ffc9a4c14e94a9c5c748888b0Jens Axboe ret = pthread_cond_wait(&td->verify_cond, 1128b36e298b5bdfc31ffc9a4c14e94a9c5c748888b0Jens Axboe &td->io_u_lock); 1129e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (ret) { 1130e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 1131e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe break; 1132e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 1133e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 1134e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1135e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe flist_splice_init(&td->verify_list, &list); 1136e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 1137e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe 1138e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe if (flist_empty(&list)) 1139e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe continue; 1140e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1141e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe while (!flist_empty(&list)) { 11422ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe io_u = flist_entry(list.next, struct io_u, verify_list); 11432ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe flist_del(&io_u->verify_list); 1144e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1145d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe ret = verify_io_u(td, io_u); 1146e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe put_io_u(td, io_u); 1147d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe if (!ret) 1148d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe continue; 11498b28bd41375930664a0ff9ff9b101a88ac416ac5Dmitry Monakhov if (td_non_fatal_error(td, ERROR_TYPE_VERIFY_BIT, ret)) { 1150d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe update_error_count(td, ret); 1151d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe td_clear_error(td); 1152d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe ret = 0; 1153d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe } 1154e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe } 1155e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } while (!ret); 1156e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1157d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe if (ret) { 1158d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe td_verror(td, ret, "async_verify"); 1159f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe if (td->o.verify_fatal) 1160f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe td->terminate = 1; 1161d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe } 1162d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe 1163e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboedone: 1164e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_lock(&td->io_u_lock); 1165e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->nr_verify_threads--; 1166e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 1167e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1168e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_signal(&td->free_cond); 1169e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe return NULL; 1170e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe} 1171e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1172e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_async_init(struct thread_data *td) 1173e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{ 1174e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe int i, ret; 1175304a47c7d94f407cc72a87025679a67f02288447bart Van Assche pthread_attr_t attr; 1176304a47c7d94f407cc72a87025679a67f02288447bart Van Assche 1177304a47c7d94f407cc72a87025679a67f02288447bart Van Assche pthread_attr_init(&attr); 1178304a47c7d94f407cc72a87025679a67f02288447bart Van Assche pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN); 1179e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1180e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_thread_exit = 0; 1181e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1182e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_threads = malloc(sizeof(pthread_t) * td->o.verify_async); 1183e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe for (i = 0; i < td->o.verify_async; i++) { 1184304a47c7d94f407cc72a87025679a67f02288447bart Van Assche ret = pthread_create(&td->verify_threads[i], &attr, 1185e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe verify_async_thread, td); 1186e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (ret) { 1187e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe log_err("fio: async verify creation failed: %s\n", 1188e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe strerror(ret)); 1189e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe break; 1190e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 1191e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe ret = pthread_detach(td->verify_threads[i]); 1192e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (ret) { 1193e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe log_err("fio: async verify thread detach failed: %s\n", 1194e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe strerror(ret)); 1195e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe break; 1196e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 1197e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->nr_verify_threads++; 1198e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 1199e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1200304a47c7d94f407cc72a87025679a67f02288447bart Van Assche pthread_attr_destroy(&attr); 1201304a47c7d94f407cc72a87025679a67f02288447bart Van Assche 1202e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (i != td->o.verify_async) { 1203e40823b10920f679d84f3f2222e319c168b1e7daJens Axboe log_err("fio: only %d verify threads started, exiting\n", i); 1204e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_thread_exit = 1; 1205e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe write_barrier(); 1206e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_broadcast(&td->verify_cond); 1207e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe return 1; 1208e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 1209e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1210e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe return 0; 1211e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe} 1212e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1213e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboevoid verify_async_exit(struct thread_data *td) 1214e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{ 1215e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_thread_exit = 1; 1216e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe write_barrier(); 1217e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_broadcast(&td->verify_cond); 1218e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1219e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_lock(&td->io_u_lock); 1220e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1221e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe while (td->nr_verify_threads) 1222e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_wait(&td->free_cond, &td->io_u_lock); 1223e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1224e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 1225e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe free(td->verify_threads); 1226e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_threads = NULL; 1227e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe} 1228