verify.c revision d7ee2a7d431c2cabdf56d04ca14805cad72cf985
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" 13e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe#include "smalloc.h" 140d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe#include "trim.h" 15637ef8d9f7645135cf4829894d1e3983cd7a042eJens Axboe#include "lib/rand.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 317d9fb455aadc0c0363489591775496f27f4a560aJens Axboevoid fill_pattern(struct thread_data *td, void *p, unsigned int len, struct io_u *io_u, unsigned long seed, int use_seed) 3290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe{ 3390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe switch (td->o.verify_pattern_bytes) { 3490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe case 0: 35bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill random bytes len=%u\n", len); 367d9fb455aadc0c0363489591775496f27f4a560aJens Axboe if (use_seed) 377d9fb455aadc0c0363489591775496f27f4a560aJens Axboe __fill_random_buf(p, len, seed); 387d9fb455aadc0c0363489591775496f27f4a560aJens Axboe else 393545a109a2cfe5ab22969ef453dc049db47f0b68Jens Axboe io_u->rand_seed = fill_random_buf(&td->buf_state, p, len); 4090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe break; 4190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe case 1: 42efda12bde9d13663e5cfe4ddf677bae54075fd92Jens Axboe /* 43efda12bde9d13663e5cfe4ddf677bae54075fd92Jens Axboe * See below write barrier comment 44efda12bde9d13663e5cfe4ddf677bae54075fd92Jens Axboe */ 45efda12bde9d13663e5cfe4ddf677bae54075fd92Jens Axboe#if 0 46efda12bde9d13663e5cfe4ddf677bae54075fd92Jens Axboe read_barrier(); 4710e8a7b30ce2917df9f839d42596c7e3af9a904fRadha Ramachandran if (io_u->buf_filled_len >= len) { 48cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran dprint(FD_VERIFY, "using already filled verify pattern b=0 len=%u\n", len); 49cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran return; 50cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran } 51efda12bde9d13663e5cfe4ddf677bae54075fd92Jens Axboe#endif 52bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill verify pattern b=0 len=%u\n", len); 530e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran memset(p, td->o.verify_pattern[0], len); 54efda12bde9d13663e5cfe4ddf677bae54075fd92Jens Axboe /* 55efda12bde9d13663e5cfe4ddf677bae54075fd92Jens Axboe * We need to ensure that the pattern stores are seen before 56efda12bde9d13663e5cfe4ddf677bae54075fd92Jens Axboe * the fill length store, or we could observe headers that 57efda12bde9d13663e5cfe4ddf677bae54075fd92Jens Axboe * aren't valid to the extent notified by the fill length 58efda12bde9d13663e5cfe4ddf677bae54075fd92Jens Axboe */ 59efda12bde9d13663e5cfe4ddf677bae54075fd92Jens Axboe write_barrier(); 60cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran io_u->buf_filled_len = len; 6190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe break; 620e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran default: { 630e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran unsigned int i = 0, size = 0; 6490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe unsigned char *b = p; 6590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe 66efda12bde9d13663e5cfe4ddf677bae54075fd92Jens Axboe#if 0 67efda12bde9d13663e5cfe4ddf677bae54075fd92Jens Axboe read_barrier(); 6810e8a7b30ce2917df9f839d42596c7e3af9a904fRadha Ramachandran if (io_u->buf_filled_len >= len) { 69cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran dprint(FD_VERIFY, "using already filled verify pattern b=%d len=%u\n", 70cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran td->o.verify_pattern_bytes, len); 71cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran return; 72cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran } 73efda12bde9d13663e5cfe4ddf677bae54075fd92Jens Axboe#endif 74bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill verify pattern b=%d len=%u\n", 75bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe td->o.verify_pattern_bytes, len); 76bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 7790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe while (i < len) { 780e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran size = td->o.verify_pattern_bytes; 790e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran if (size > (len - i)) 800e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran size = len - i; 810e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran memcpy(b+i, td->o.verify_pattern, size); 820e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran i += size; 8390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe } 84efda12bde9d13663e5cfe4ddf677bae54075fd92Jens Axboe write_barrier(); 85cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran io_u->buf_filled_len = len; 8690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe break; 8790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe } 8890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe } 8990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe} 9090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe 91cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboestatic unsigned int get_hdr_inc(struct thread_data *td, struct io_u *io_u) 92cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe{ 93cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe unsigned int hdr_inc; 94cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe 95cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe hdr_inc = io_u->buflen; 96cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe if (td->o.verify_interval) 97cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe hdr_inc = td->o.verify_interval; 98cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe 99cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe return hdr_inc; 100cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe} 101cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe 102c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboestatic void fill_pattern_headers(struct thread_data *td, struct io_u *io_u, 103c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe unsigned long seed, int use_seed) 104c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe{ 105c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe unsigned int hdr_inc, header_num; 106c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe struct verify_header *hdr; 107c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe void *p = io_u->buf; 108c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe 109c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe fill_pattern(td, p, io_u->buflen, io_u, seed, use_seed); 110c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe 111cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe hdr_inc = get_hdr_inc(td, io_u); 112c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe header_num = 0; 113c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe for (; p < io_u->buf + io_u->buflen; p += hdr_inc) { 114c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe hdr = p; 115c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe populate_hdr(td, io_u, hdr, header_num, hdr_inc); 116c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe header_num++; 117c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe } 118c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe} 119c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe 1204764aec9fe5988281bdc114c13ac771fb16713ccJens Axboestatic void memswp(void *buf1, void *buf2, unsigned int len) 121546a9142511875524850ac92776184fd9fb7196eShawn Lewis{ 122dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis char swap[200]; 123dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis 124dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis assert(len <= sizeof(swap)); 12590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe 126546a9142511875524850ac92776184fd9fb7196eShawn Lewis memcpy(&swap, buf1, len); 127546a9142511875524850ac92776184fd9fb7196eShawn Lewis memcpy(buf1, buf2, len); 128546a9142511875524850ac92776184fd9fb7196eShawn Lewis memcpy(buf2, &swap, len); 129546a9142511875524850ac92776184fd9fb7196eShawn Lewis} 130546a9142511875524850ac92776184fd9fb7196eShawn Lewis 131e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void hexdump(void *buffer, int len) 132e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 133e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe unsigned char *p = buffer; 134e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe int i; 135e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 136e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe for (i = 0; i < len; i++) 137bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_err("%02x", p[i]); 138bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_err("\n"); 139e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 140e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 141d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe/* 1428767783245faac99a7e1c330a1d6536e579c8402Jens Axboe * Prepare for seperation of verify_header and checksum header 1438767783245faac99a7e1c330a1d6536e579c8402Jens Axboe */ 144546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic inline unsigned int __hdr_size(int verify_type) 1458767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{ 14603e20d687566753b90383571e5e152c5142bdffdBruce Cran unsigned int len = 0; 1478767783245faac99a7e1c330a1d6536e579c8402Jens Axboe 148546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe switch (verify_type) { 149546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_NONE: 150546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_NULL: 151546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = 0; 152546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 153546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_MD5: 154546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_md5); 155546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 156546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC64: 157546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc64); 158546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 159bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe case VERIFY_CRC32C: 160546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC32: 1613845591fadea480177223e28c9d1c03642d34f0eJens Axboe case VERIFY_CRC32C_INTEL: 162546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc32); 163546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 164546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC16: 165546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc16); 166546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 167546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC7: 168546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc7); 169546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 170546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_SHA256: 171546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_sha256); 172546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 173546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_SHA512: 174546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_sha512); 175546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 1767437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis case VERIFY_META: 1777437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis len = sizeof(struct vhdr_meta); 1787437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis break; 1797c353ceb3257b132f4c98326046b42201e070731Jens Axboe case VERIFY_SHA1: 1807c353ceb3257b132f4c98326046b42201e070731Jens Axboe len = sizeof(struct vhdr_sha1); 1817c353ceb3257b132f4c98326046b42201e070731Jens Axboe break; 18292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe case VERIFY_PATTERN: 18392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe len = 0; 18492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe break; 185546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe default: 186546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe log_err("fio: unknown verify header!\n"); 187546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe assert(0); 188546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe } 189546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 190546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe return len + sizeof(struct verify_header); 1918767783245faac99a7e1c330a1d6536e579c8402Jens Axboe} 1928767783245faac99a7e1c330a1d6536e579c8402Jens Axboe 1938767783245faac99a7e1c330a1d6536e579c8402Jens Axboestatic inline unsigned int hdr_size(struct verify_header *hdr) 1948767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{ 195546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe return __hdr_size(hdr->verify_type); 196546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe} 197546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 198546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic void *hdr_priv(struct verify_header *hdr) 199546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe{ 200546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe void *priv = hdr; 201546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 202546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe return priv + sizeof(struct verify_header); 2038767783245faac99a7e1c330a1d6536e579c8402Jens Axboe} 2048767783245faac99a7e1c330a1d6536e579c8402Jens Axboe 2058767783245faac99a7e1c330a1d6536e579c8402Jens Axboe/* 206936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * Verify container, pass info to verify handlers and allow them to 207936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * pass info back in case of error 208936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe */ 209936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestruct vcont { 210936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe /* 211936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * Input 212936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe */ 213936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe struct io_u *io_u; 214936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe unsigned int hdr_num; 2157d9fb455aadc0c0363489591775496f27f4a560aJens Axboe struct thread_data *td; 216936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe 217936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe /* 218936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * Output, only valid in case of error 219936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe */ 220bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe const char *name; 221bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe void *good_crc; 222bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe void *bad_crc; 223936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe unsigned int crc_len; 224936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe}; 225936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe 226c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboestatic void dump_buf(char *buf, unsigned int len, unsigned long long offset, 227c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe const char *type, struct fio_file *f) 2287d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{ 2296f260b317f4cec3027f79b8b329dd3f98c3906acJens Axboe char *ptr, fname[256]; 2307d9fb455aadc0c0363489591775496f27f4a560aJens Axboe int ret, fd; 2317d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 2326f260b317f4cec3027f79b8b329dd3f98c3906acJens Axboe ptr = strdup(f->file_name); 2336f260b317f4cec3027f79b8b329dd3f98c3906acJens Axboe strcpy(fname, basename(ptr)); 234c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe 235c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe sprintf(fname + strlen(fname), ".%llu.%s", offset, type); 2367d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 2377d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fd = open(fname, O_CREAT | O_TRUNC | O_WRONLY, 0644); 2387d9fb455aadc0c0363489591775496f27f4a560aJens Axboe if (fd < 0) { 2397d9fb455aadc0c0363489591775496f27f4a560aJens Axboe perror("open verify buf file"); 2407d9fb455aadc0c0363489591775496f27f4a560aJens Axboe return; 2417d9fb455aadc0c0363489591775496f27f4a560aJens Axboe } 2427d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 2437d9fb455aadc0c0363489591775496f27f4a560aJens Axboe while (len) { 2447d9fb455aadc0c0363489591775496f27f4a560aJens Axboe ret = write(fd, buf, len); 2457d9fb455aadc0c0363489591775496f27f4a560aJens Axboe if (!ret) 2467d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 2477d9fb455aadc0c0363489591775496f27f4a560aJens Axboe else if (ret < 0) { 2487d9fb455aadc0c0363489591775496f27f4a560aJens Axboe perror("write verify buf file"); 2497d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 2507d9fb455aadc0c0363489591775496f27f4a560aJens Axboe } 2517d9fb455aadc0c0363489591775496f27f4a560aJens Axboe len -= ret; 2527d9fb455aadc0c0363489591775496f27f4a560aJens Axboe buf += ret; 2537d9fb455aadc0c0363489591775496f27f4a560aJens Axboe } 2547d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 2557d9fb455aadc0c0363489591775496f27f4a560aJens Axboe close(fd); 256c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe log_err(" %s data dumped as %s\n", type, fname); 2576f260b317f4cec3027f79b8b329dd3f98c3906acJens Axboe free(ptr); 2587d9fb455aadc0c0363489591775496f27f4a560aJens Axboe} 2597d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 260c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe/* 261c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * Dump the contents of the read block and re-generate the correct data 262c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * and dump that too. 263c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe */ 2647d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void dump_verify_buffers(struct verify_header *hdr, struct vcont *vc) 2657d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{ 2667d9fb455aadc0c0363489591775496f27f4a560aJens Axboe struct thread_data *td = vc->td; 2677d9fb455aadc0c0363489591775496f27f4a560aJens Axboe struct io_u *io_u = vc->io_u; 2687d9fb455aadc0c0363489591775496f27f4a560aJens Axboe unsigned long hdr_offset; 2697d9fb455aadc0c0363489591775496f27f4a560aJens Axboe struct io_u dummy; 270c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe void *buf; 2717d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 2720dce9bc9b21a8d91aa55a29258dfaeffc57bd466Steven Lang if (!td->o.verify_dump) 2730dce9bc9b21a8d91aa55a29258dfaeffc57bd466Steven Lang return; 2740dce9bc9b21a8d91aa55a29258dfaeffc57bd466Steven Lang 275c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe /* 276c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * Dump the contents we just read off disk 277c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe */ 2787d9fb455aadc0c0363489591775496f27f4a560aJens Axboe hdr_offset = vc->hdr_num * hdr->len; 2797d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 280c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe dump_buf(io_u->buf + hdr_offset, hdr->len, io_u->offset + hdr_offset, 281c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe "received", vc->io_u->file); 2827d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 283c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe /* 284c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * Allocate a new buf and re-generate the original data 285c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe */ 286c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe buf = malloc(io_u->buflen); 2877d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dummy = *io_u; 288c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe dummy.buf = buf; 2894aae38a645f3315ca2f8cc57a7ec4110ba7d8319Jens Axboe dummy.rand_seed = hdr->rand_seed; 290cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe dummy.buf_filled_len = 0; 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 unsigned int hweight8(unsigned int w) 32792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe{ 32892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe unsigned int res = w - ((w >> 1) & 0x55); 32992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe 33092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe res = (res & 0x33) + ((res >> 2) & 0x33); 33192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe return (res + (res >> 4)) & 0x0F; 33292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe} 33392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe 33492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboestatic int verify_io_u_pattern(struct verify_header *hdr, struct vcont *vc) 33592bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe{ 33692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe struct thread_data *td = vc->td; 33792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe struct io_u *io_u = vc->io_u; 33892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe char *buf, *pattern; 3392b13e716c0921356c0930522718e00b8df34293aJens Axboe unsigned int header_size = __hdr_size(td->o.verify); 34092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe unsigned int len, mod, i; 34192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe 34292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe pattern = td->o.verify_pattern; 3432b13e716c0921356c0930522718e00b8df34293aJens Axboe buf = (void *) hdr + header_size; 3442b13e716c0921356c0930522718e00b8df34293aJens Axboe len = get_hdr_inc(td, io_u) - header_size; 3452b13e716c0921356c0930522718e00b8df34293aJens Axboe mod = header_size % td->o.verify_pattern_bytes; 34692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe 34792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe for (i = 0; i < len; i++) { 34892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe if (buf[i] != pattern[mod]) { 34992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe unsigned int bits; 35092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe 35192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe bits = hweight8(buf[i] ^ pattern[mod]); 35292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe log_err("fio: got pattern %x, wanted %x. Bad bits %d\n", 35392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe buf[i], pattern[mod], bits); 35492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe log_err("fio: bad pattern block offset %u\n", i); 35592bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe dump_verify_buffers(hdr, vc); 35692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe return EILSEQ; 35792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe } 35892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe mod++; 35992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe if (mod == td->o.verify_pattern_bytes) 36092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe mod = 0; 36192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe } 36292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe 36392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe return 0; 36492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe} 36592bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe 36692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboestatic int verify_io_u_meta(struct verify_header *hdr, struct vcont *vc) 3677437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{ 36892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe struct thread_data *td = vc->td; 3697437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis struct vhdr_meta *vh = hdr_priv(hdr); 370936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe struct io_u *io_u = vc->io_u; 37192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe int ret = EILSEQ; 3727437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 373bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "meta verify io_u %p, len %u\n", io_u, hdr->len); 374bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 375bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (vh->offset == io_u->offset + vc->hdr_num * td->o.verify_interval) 37692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe ret = 0; 37792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe 37892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe if (td->o.verify_pattern_bytes) 37992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe ret |= verify_io_u_pattern(hdr, vc); 38092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe 38192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe if (!ret) 382bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 3837437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 384bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "meta"; 385bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 38692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe return ret; 3877437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis} 3887437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 389936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha512(struct verify_header *hdr, struct vcont *vc) 390cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 391936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 392546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha512 *vh = hdr_priv(hdr); 393cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe uint8_t sha512[128]; 394cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe struct sha512_ctx sha512_ctx = { 395cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe .buf = sha512, 396cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 397cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 398936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "sha512 verify io_u %p, len %u\n", vc->io_u, hdr->len); 399bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 400cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha512_init(&sha512_ctx); 4018767783245faac99a7e1c330a1d6536e579c8402Jens Axboe sha512_update(&sha512_ctx, p, hdr->len - hdr_size(hdr)); 402cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 403bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (!memcmp(vh->sha512, sha512_ctx.buf, sizeof(sha512))) 404bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 405cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 406bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "sha512"; 407bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = vh->sha512; 408bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = sha512_ctx.buf; 409bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = sizeof(vh->sha512); 410bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 411bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 412cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 413cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 414936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha256(struct verify_header *hdr, struct vcont *vc) 415cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 416936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 417546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha256 *vh = hdr_priv(hdr); 418bc77f56f79f6ae155e9eb26263ed686ef28b47ecJens Axboe uint8_t sha256[64]; 419cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe struct sha256_ctx sha256_ctx = { 420cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe .buf = sha256, 421cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 422cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 423936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "sha256 verify io_u %p, len %u\n", vc->io_u, hdr->len); 424bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 425cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha256_init(&sha256_ctx); 4268767783245faac99a7e1c330a1d6536e579c8402Jens Axboe sha256_update(&sha256_ctx, p, hdr->len - hdr_size(hdr)); 427cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 428bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (!memcmp(vh->sha256, sha256_ctx.buf, sizeof(sha256))) 429bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 430cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 431bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "sha256"; 432bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = vh->sha256; 433bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = sha256_ctx.buf; 434bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = sizeof(vh->sha256); 435bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 436bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 437cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 438cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 439936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha1(struct verify_header *hdr, struct vcont *vc) 4407c353ceb3257b132f4c98326046b42201e070731Jens Axboe{ 441936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 4427c353ceb3257b132f4c98326046b42201e070731Jens Axboe struct vhdr_sha1 *vh = hdr_priv(hdr); 4437c353ceb3257b132f4c98326046b42201e070731Jens Axboe uint32_t sha1[5]; 4447c353ceb3257b132f4c98326046b42201e070731Jens Axboe struct sha1_ctx sha1_ctx = { 4457c353ceb3257b132f4c98326046b42201e070731Jens Axboe .H = sha1, 4467c353ceb3257b132f4c98326046b42201e070731Jens Axboe }; 4477c353ceb3257b132f4c98326046b42201e070731Jens Axboe 448936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "sha1 verify io_u %p, len %u\n", vc->io_u, hdr->len); 4497c353ceb3257b132f4c98326046b42201e070731Jens Axboe 4507c353ceb3257b132f4c98326046b42201e070731Jens Axboe sha1_init(&sha1_ctx); 4517c353ceb3257b132f4c98326046b42201e070731Jens Axboe sha1_update(&sha1_ctx, p, hdr->len - hdr_size(hdr)); 4527c353ceb3257b132f4c98326046b42201e070731Jens Axboe 453bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (!memcmp(vh->sha1, sha1_ctx.H, sizeof(sha1))) 454bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 4557c353ceb3257b132f4c98326046b42201e070731Jens Axboe 456bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "sha1"; 457bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = vh->sha1; 458bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = sha1_ctx.H; 459bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = sizeof(vh->sha1); 460bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 461bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 4627c353ceb3257b132f4c98326046b42201e070731Jens Axboe} 4637c353ceb3257b132f4c98326046b42201e070731Jens Axboe 464936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc7(struct verify_header *hdr, struct vcont *vc) 4651e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{ 466936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 467546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc7 *vh = hdr_priv(hdr); 4681e154bdbf14a1d352117aea057035235b66f0381Jens Axboe unsigned char c; 4691e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 470936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "crc7 verify io_u %p, len %u\n", vc->io_u, hdr->len); 471bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 4728767783245faac99a7e1c330a1d6536e579c8402Jens Axboe c = crc7(p, hdr->len - hdr_size(hdr)); 4731e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 474bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (c == vh->crc7) 475bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 4761e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 477bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "crc7"; 478bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = &vh->crc7; 479bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = &c; 480bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = 1; 481bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 482bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 4831e154bdbf14a1d352117aea057035235b66f0381Jens Axboe} 4841e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 485936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc16(struct verify_header *hdr, struct vcont *vc) 486969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{ 487936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 488546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc16 *vh = hdr_priv(hdr); 489969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe unsigned short c; 490969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 491936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "crc16 verify io_u %p, len %u\n", vc->io_u, hdr->len); 492bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 4938767783245faac99a7e1c330a1d6536e579c8402Jens Axboe c = crc16(p, hdr->len - hdr_size(hdr)); 494969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 495bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (c == vh->crc16) 496bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 497969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 498bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "crc16"; 499bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = &vh->crc16; 500bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = &c; 501bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = 2; 502bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 503bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 504969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe} 505969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 506936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc64(struct verify_header *hdr, struct vcont *vc) 507d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{ 508936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 509546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc64 *vh = hdr_priv(hdr); 510d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe unsigned long long c; 511d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 512936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "crc64 verify io_u %p, len %u\n", vc->io_u, hdr->len); 513bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 5148767783245faac99a7e1c330a1d6536e579c8402Jens Axboe c = crc64(p, hdr->len - hdr_size(hdr)); 515d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 516bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (c == vh->crc64) 517bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 518d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 519bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "crc64"; 520bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = &vh->crc64; 521bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = &c; 522bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = 8; 523bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 524bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 525d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe} 526d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 527936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc32(struct verify_header *hdr, struct vcont *vc) 528e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 529936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 530546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 531546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe uint32_t c; 532e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 533936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "crc32 verify io_u %p, len %u\n", vc->io_u, hdr->len); 534bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 5358767783245faac99a7e1c330a1d6536e579c8402Jens Axboe c = crc32(p, hdr->len - hdr_size(hdr)); 536e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 537bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (c == vh->crc32) 538bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 539e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 540bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "crc32"; 541bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = &vh->crc32; 542bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = &c; 543bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = 4; 544bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 545bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 546e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 547e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 548936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc32c(struct verify_header *hdr, struct vcont *vc) 549bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{ 550936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 551bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 552bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe uint32_t c; 553bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 554936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "crc32c verify io_u %p, len %u\n", vc->io_u, hdr->len); 555bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 5563845591fadea480177223e28c9d1c03642d34f0eJens Axboe if (hdr->verify_type == VERIFY_CRC32C_INTEL) 5573845591fadea480177223e28c9d1c03642d34f0eJens Axboe c = crc32c_intel(p, hdr->len - hdr_size(hdr)); 5583845591fadea480177223e28c9d1c03642d34f0eJens Axboe else 5593845591fadea480177223e28c9d1c03642d34f0eJens Axboe c = crc32c(p, hdr->len - hdr_size(hdr)); 560bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 561bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (c == vh->crc32) 562bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 563bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 564bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "crc32c"; 565bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = &vh->crc32; 566bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = &c; 567bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = 4; 568bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 569bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 570bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe} 571bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 572936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_md5(struct verify_header *hdr, struct vcont *vc) 573e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 574936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 575546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_md5 *vh = hdr_priv(hdr); 5768c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe uint32_t hash[MD5_HASH_WORDS]; 5778c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe struct md5_ctx md5_ctx = { 5788c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe .hash = hash, 5798c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe }; 580e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 581936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "md5 verify io_u %p, len %u\n", vc->io_u, hdr->len); 582bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 58361f821f16cf27d8742e09b3a137c933cd0085e9bJens Axboe md5_init(&md5_ctx); 5848767783245faac99a7e1c330a1d6536e579c8402Jens Axboe md5_update(&md5_ctx, p, hdr->len - hdr_size(hdr)); 585e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 586bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (!memcmp(vh->md5_digest, md5_ctx.hash, sizeof(hash))) 587bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 588e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 589bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "md5"; 590bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = vh->md5_digest; 591bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = md5_ctx.hash; 592bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = sizeof(hash); 593bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 594bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 595e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 596e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 597e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe/* 598e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe * Push IO verification to a separate thread 599e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe */ 600e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_io_u_async(struct thread_data *td, struct io_u *io_u) 601e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{ 602e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (io_u->file) 603e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe put_file_log(td, io_u->file); 604e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 605e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_lock(&td->io_u_lock); 606d7ee2a7d431c2cabdf56d04ca14805cad72cf985Steven Lang 6070c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran if (io_u->flags & IO_U_F_IN_CUR_DEPTH) { 6080c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran td->cur_depth--; 6090c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran io_u->flags &= ~IO_U_F_IN_CUR_DEPTH; 6100c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran } 611e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe flist_del(&io_u->list); 612e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe flist_add_tail(&io_u->list, &td->verify_list); 6132ecc1b57721e3cb72bbf558bc169c97037fe3d0aJens Axboe io_u->flags |= IO_U_F_FREE_DEF; 614e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 615e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 616e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_signal(&td->verify_cond); 617e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe return 0; 618e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe} 619e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 6200d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboestatic int verify_trimmed_io_u(struct thread_data *td, struct io_u *io_u) 6210d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe{ 6220d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe static char zero_buf[1024]; 6230d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe unsigned int this_len, len; 6240d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe int ret = 0; 6250d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe void *p; 6260d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 6270d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe if (!td->o.trim_zero) 6280d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe return 0; 6290d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 6300d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe len = io_u->buflen; 6310d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe p = io_u->buf; 6320d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe do { 6330d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe this_len = sizeof(zero_buf); 6340d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe if (this_len > len) 6350d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe this_len = len; 6360d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe if (memcmp(p, zero_buf, this_len)) { 6370d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe ret = EILSEQ; 6380d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe break; 6390d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe } 6400d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe len -= this_len; 6410d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe p += this_len; 6420d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe } while (len); 6430d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 6440d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe if (!ret) 6450d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe return 0; 6460d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 647a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe log_err("trim: verify failed at file %s offset %llu, length %lu" 648a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe ", block offset %lu\n", 649a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe io_u->file->file_name, io_u->offset, io_u->buflen, 6502f68124f26e54233db41b462a257dabc48e5c32bJens Axboe (unsigned long) (p - io_u->buf)); 6510d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe return ret; 6520d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe} 6530d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 65436690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboeint verify_io_u(struct thread_data *td, struct io_u *io_u) 655e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 6563f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis struct verify_header *hdr; 6572b13e716c0921356c0930522718e00b8df34293aJens Axboe unsigned int header_size, hdr_inc, hdr_num = 0; 65895646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe void *p; 659e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe int ret; 660e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 6611dcc049824b840df1ee0ef5d019fffa4037e1bb0Shawn Lewis if (td->o.verify == VERIFY_NULL || io_u->ddir != DDIR_READ) 66236690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe return 0; 6630d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe if (io_u->flags & IO_U_F_TRIMMED) { 6640d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe ret = verify_trimmed_io_u(td, io_u); 6650d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe goto done; 6660d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe } 66736690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe 668cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe hdr_inc = get_hdr_inc(td, io_u); 669e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 670a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe ret = 0; 6715ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe for (p = io_u->buf; p < io_u->buf + io_u->buflen; 6725ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe p += hdr_inc, hdr_num++) { 673bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe struct vcont vc = { 674bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe .io_u = io_u, 675bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe .hdr_num = hdr_num, 6767d9fb455aadc0c0363489591775496f27f4a560aJens Axboe .td = td, 677bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe }; 678936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe 679f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe if (ret && td->o.verify_fatal) 680a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe break; 681f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe 6822b13e716c0921356c0930522718e00b8df34293aJens Axboe header_size = __hdr_size(td->o.verify); 683a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe if (td->o.verify_offset) 6842b13e716c0921356c0930522718e00b8df34293aJens Axboe memswp(p, p + td->o.verify_offset, header_size); 68595646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe hdr = p; 686e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 6873f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe if (hdr->fio_magic != FIO_HDR_MAGIC) { 688c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe log_err("verify: bad magic header %x, wanted %x at file %s offset %llu, length %u\n", 689c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe hdr->fio_magic, FIO_HDR_MAGIC, 690c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe io_u->file->file_name, 691c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe io_u->offset + hdr_num * hdr->len, hdr->len); 6929fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 6933f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe } 6943f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe 6953f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis switch (hdr->verify_type) { 6963f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_MD5: 697936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_md5(hdr, &vc); 6983f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 6993f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC64: 700936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_crc64(hdr, &vc); 7013f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 702bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe case VERIFY_CRC32C: 7033845591fadea480177223e28c9d1c03642d34f0eJens Axboe case VERIFY_CRC32C_INTEL: 704936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_crc32c(hdr, &vc); 705bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe break; 7063f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC32: 707936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_crc32(hdr, &vc); 7083f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 7093f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC16: 710936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_crc16(hdr, &vc); 7113f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 7123f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC7: 713936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_crc7(hdr, &vc); 7143f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 715cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe case VERIFY_SHA256: 716936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_sha256(hdr, &vc); 717cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe break; 718cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe case VERIFY_SHA512: 719936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_sha512(hdr, &vc); 720cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe break; 7217437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis case VERIFY_META: 72292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe ret = verify_io_u_meta(hdr, &vc); 7237437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis break; 7247c353ceb3257b132f4c98326046b42201e070731Jens Axboe case VERIFY_SHA1: 725936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_sha1(hdr, &vc); 7267c353ceb3257b132f4c98326046b42201e070731Jens Axboe break; 72792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe case VERIFY_PATTERN: 72892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe ret = verify_io_u_pattern(hdr, &vc); 72992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe break; 7303f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis default: 7313f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("Bad verify type %u\n", hdr->verify_type); 732d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe ret = EINVAL; 7333f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis } 7343f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis } 735a7dfe862c2e3fe72b8db6a6e67302048d3731c6dJens Axboe 7360d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboedone: 737f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe if (ret && td->o.verify_fatal) 738f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe td->terminate = 1; 739f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe 740a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe return ret; 741e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 742e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 7437437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic void fill_meta(struct verify_header *hdr, struct thread_data *td, 7445ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe struct io_u *io_u, unsigned int header_num) 7457437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{ 7467437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis struct vhdr_meta *vh = hdr_priv(hdr); 7477437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 7487437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->thread = td->thread_number; 7497437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 7507437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->time_sec = io_u->start_time.tv_sec; 7517437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->time_usec = io_u->start_time.tv_usec; 7527437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 7537437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->numberio = td->io_issues[DDIR_WRITE]; 7547437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 7557437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->offset = io_u->offset + header_num * td->o.verify_interval; 7567437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis} 7577437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 758cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha512(struct verify_header *hdr, void *p, unsigned int len) 759cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 760546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha512 *vh = hdr_priv(hdr); 761cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe struct sha512_ctx sha512_ctx = { 762546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe .buf = vh->sha512, 763cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 764cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 765cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha512_init(&sha512_ctx); 766cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha512_update(&sha512_ctx, p, len); 767cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 768cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 769cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha256(struct verify_header *hdr, void *p, unsigned int len) 770cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 771546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha256 *vh = hdr_priv(hdr); 772cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe struct sha256_ctx sha256_ctx = { 773546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe .buf = vh->sha256, 774cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 775cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 776cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha256_init(&sha256_ctx); 777cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha256_update(&sha256_ctx, p, len); 778cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 779cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 7807c353ceb3257b132f4c98326046b42201e070731Jens Axboestatic void fill_sha1(struct verify_header *hdr, void *p, unsigned int len) 7817c353ceb3257b132f4c98326046b42201e070731Jens Axboe{ 7827c353ceb3257b132f4c98326046b42201e070731Jens Axboe struct vhdr_sha1 *vh = hdr_priv(hdr); 7837c353ceb3257b132f4c98326046b42201e070731Jens Axboe struct sha1_ctx sha1_ctx = { 7847c353ceb3257b132f4c98326046b42201e070731Jens Axboe .H = vh->sha1, 7857c353ceb3257b132f4c98326046b42201e070731Jens Axboe }; 7867c353ceb3257b132f4c98326046b42201e070731Jens Axboe 7877c353ceb3257b132f4c98326046b42201e070731Jens Axboe sha1_init(&sha1_ctx); 7887c353ceb3257b132f4c98326046b42201e070731Jens Axboe sha1_update(&sha1_ctx, p, len); 7897c353ceb3257b132f4c98326046b42201e070731Jens Axboe} 7907c353ceb3257b132f4c98326046b42201e070731Jens Axboe 7911e154bdbf14a1d352117aea057035235b66f0381Jens Axboestatic void fill_crc7(struct verify_header *hdr, void *p, unsigned int len) 7921e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{ 793546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc7 *vh = hdr_priv(hdr); 794546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 795546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe vh->crc7 = crc7(p, len); 7961e154bdbf14a1d352117aea057035235b66f0381Jens Axboe} 7971e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 798969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboestatic void fill_crc16(struct verify_header *hdr, void *p, unsigned int len) 799969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{ 800546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc16 *vh = hdr_priv(hdr); 801546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 802546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe vh->crc16 = crc16(p, len); 803969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe} 804969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 805e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_crc32(struct verify_header *hdr, void *p, unsigned int len) 806e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 807546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 808546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 809546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe vh->crc32 = crc32(p, len); 810e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 811e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 812bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboestatic void fill_crc32c(struct verify_header *hdr, void *p, unsigned int len) 813bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{ 814bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 815bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 8163845591fadea480177223e28c9d1c03642d34f0eJens Axboe if (hdr->verify_type == VERIFY_CRC32C_INTEL) 8173845591fadea480177223e28c9d1c03642d34f0eJens Axboe vh->crc32 = crc32c_intel(p, len); 8183845591fadea480177223e28c9d1c03642d34f0eJens Axboe else 8193845591fadea480177223e28c9d1c03642d34f0eJens Axboe vh->crc32 = crc32c(p, len); 820bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe} 821bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 822d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboestatic void fill_crc64(struct verify_header *hdr, void *p, unsigned int len) 823d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{ 824546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc64 *vh = hdr_priv(hdr); 825546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 826546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe vh->crc64 = crc64(p, len); 827d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe} 828d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 829e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_md5(struct verify_header *hdr, void *p, unsigned int len) 830e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 831546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_md5 *vh = hdr_priv(hdr); 8328c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe struct md5_ctx md5_ctx = { 833546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe .hash = (uint32_t *) vh->md5_digest, 8348c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe }; 835e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 83661f821f16cf27d8742e09b3a137c933cd0085e9bJens Axboe md5_init(&md5_ctx); 837e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe md5_update(&md5_ctx, p, len); 838e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 839e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 8407d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void populate_hdr(struct thread_data *td, struct io_u *io_u, 8417d9fb455aadc0c0363489591775496f27f4a560aJens Axboe struct verify_header *hdr, unsigned int header_num, 8427d9fb455aadc0c0363489591775496f27f4a560aJens Axboe unsigned int header_len) 8437d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{ 8447d9fb455aadc0c0363489591775496f27f4a560aJens Axboe unsigned int data_len; 8457d9fb455aadc0c0363489591775496f27f4a560aJens Axboe void *data, *p; 8467d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 8477d9fb455aadc0c0363489591775496f27f4a560aJens Axboe p = (void *) hdr; 8487d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 8497d9fb455aadc0c0363489591775496f27f4a560aJens Axboe hdr->fio_magic = FIO_HDR_MAGIC; 8507d9fb455aadc0c0363489591775496f27f4a560aJens Axboe hdr->len = header_len; 8517d9fb455aadc0c0363489591775496f27f4a560aJens Axboe hdr->verify_type = td->o.verify; 8527d9fb455aadc0c0363489591775496f27f4a560aJens Axboe hdr->rand_seed = io_u->rand_seed; 8537d9fb455aadc0c0363489591775496f27f4a560aJens Axboe data_len = header_len - hdr_size(hdr); 8547d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 8557d9fb455aadc0c0363489591775496f27f4a560aJens Axboe data = p + hdr_size(hdr); 8567d9fb455aadc0c0363489591775496f27f4a560aJens Axboe switch (td->o.verify) { 8577d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_MD5: 8587d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill md5 io_u %p, len %u\n", 8597d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 8607d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_md5(hdr, data, data_len); 8617d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 8627d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_CRC64: 8637d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill crc64 io_u %p, len %u\n", 8647d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 8657d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_crc64(hdr, data, data_len); 8667d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 8677d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_CRC32C: 8687d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_CRC32C_INTEL: 8697d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill crc32c io_u %p, len %u\n", 8707d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 8717d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_crc32c(hdr, data, data_len); 8727d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 8737d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_CRC32: 8747d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill crc32 io_u %p, len %u\n", 8757d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 8767d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_crc32(hdr, data, data_len); 8777d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 8787d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_CRC16: 8797d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill crc16 io_u %p, len %u\n", 8807d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 8817d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_crc16(hdr, data, data_len); 8827d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 8837d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_CRC7: 8847d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill crc7 io_u %p, len %u\n", 8857d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 8867d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_crc7(hdr, data, data_len); 8877d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 8887d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_SHA256: 8897d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill sha256 io_u %p, len %u\n", 8907d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 8917d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_sha256(hdr, data, data_len); 8927d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 8937d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_SHA512: 8947d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill sha512 io_u %p, len %u\n", 8957d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 8967d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_sha512(hdr, data, data_len); 8977d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 8987d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_META: 8997d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill meta io_u %p, len %u\n", 9007d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 9017d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_meta(hdr, td, io_u, header_num); 9027d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 9037d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_SHA1: 9047d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill sha1 io_u %p, len %u\n", 9057d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 9067d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_sha1(hdr, data, data_len); 9077d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 90892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe case VERIFY_PATTERN: 90992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe /* nothing to do here */ 91092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe break; 9117d9fb455aadc0c0363489591775496f27f4a560aJens Axboe default: 9127d9fb455aadc0c0363489591775496f27f4a560aJens Axboe log_err("fio: bad verify type: %d\n", td->o.verify); 9137d9fb455aadc0c0363489591775496f27f4a560aJens Axboe assert(0); 9147d9fb455aadc0c0363489591775496f27f4a560aJens Axboe } 9157d9fb455aadc0c0363489591775496f27f4a560aJens Axboe if (td->o.verify_offset) 9167d9fb455aadc0c0363489591775496f27f4a560aJens Axboe memswp(p, p + td->o.verify_offset, hdr_size(hdr)); 9177d9fb455aadc0c0363489591775496f27f4a560aJens Axboe} 9187d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 919e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe/* 920e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * fill body of io_u->buf with random data and add a header with the 921c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * checksum of choice 922e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe */ 923e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboevoid populate_verify_io_u(struct thread_data *td, struct io_u *io_u) 924e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 9259cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe if (td->o.verify == VERIFY_NULL) 9269cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe return; 9279cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe 928c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe fill_pattern_headers(td, io_u, 0, 0); 929e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 930e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 931e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboeint get_next_verify(struct thread_data *td, struct io_u *io_u) 932e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 9338de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe struct io_piece *ipo = NULL; 934e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 935d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe /* 936d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe * this io_u is from a requeue, we already filled the offsets 937d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe */ 938d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe if (io_u->file) 939d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe return 0; 940d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe 9418de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe if (!RB_EMPTY_ROOT(&td->io_hist_tree)) { 9428de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe struct rb_node *n = rb_first(&td->io_hist_tree); 943e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 9448de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe ipo = rb_entry(n, struct io_piece, rb_node); 9454b87898e8d76aaf05baec83077a11311c1447397Jens Axboe rb_erase(n, &td->io_hist_tree); 946a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe assert(ipo->flags & IP_F_ONRB); 947a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe ipo->flags &= ~IP_F_ONRB; 94801743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe } else if (!flist_empty(&td->io_hist_list)) { 94901743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe ipo = flist_entry(td->io_hist_list.next, struct io_piece, list); 95001743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe flist_del(&ipo->list); 951a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe assert(ipo->flags & IP_F_ONLIST); 952a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe ipo->flags &= ~IP_F_ONLIST; 9538de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe } 954e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 9558de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe if (ipo) { 9560d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe td->io_hist_len--; 9570d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 958e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe io_u->offset = ipo->offset; 959e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe io_u->buflen = ipo->len; 96036167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe io_u->file = ipo->file; 96197af62cec418cd722fb43c6010d6430534e12353Jens Axboe 9620d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe if (ipo->flags & IP_F_TRIMMED) 9630d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe io_u->flags |= IO_U_F_TRIMMED; 9640d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 965d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (!fio_file_open(io_u->file)) { 96697af62cec418cd722fb43c6010d6430534e12353Jens Axboe int r = td_io_open_file(td, io_u->file); 96797af62cec418cd722fb43c6010d6430534e12353Jens Axboe 968bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe if (r) { 969bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "failed file %s open\n", 970bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u->file->file_name); 97197af62cec418cd722fb43c6010d6430534e12353Jens Axboe return 1; 972bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe } 97397af62cec418cd722fb43c6010d6430534e12353Jens Axboe } 97497af62cec418cd722fb43c6010d6430534e12353Jens Axboe 97597af62cec418cd722fb43c6010d6430534e12353Jens Axboe get_file(ipo->file); 976d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe assert(fio_file_open(io_u->file)); 977e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe io_u->ddir = DDIR_READ; 97836167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe io_u->xfer_buf = io_u->buf; 97936167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe io_u->xfer_buflen = io_u->buflen; 9800d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 9810d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe remove_trim_entry(td, ipo); 982e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe free(ipo); 983bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "get_next_verify: ret io_u %p\n", io_u); 984e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe return 0; 985e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe } 986e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 987bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "get_next_verify: empty\n"); 988e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe return 1; 989e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 990e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 991e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboestatic void *verify_async_thread(void *data) 992e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{ 993e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe struct thread_data *td = data; 994e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe struct io_u *io_u; 995e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe int ret = 0; 996e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 997e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (td->o.verify_cpumask_set && 998e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe fio_setaffinity(td->pid, td->o.verify_cpumask)) { 999e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe log_err("fio: failed setting verify thread affinity\n"); 1000e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe goto done; 1001e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 1002e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1003e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe do { 1004e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe FLIST_HEAD(list); 1005e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe 1006e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe read_barrier(); 1007e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (td->verify_thread_exit) 1008e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe break; 1009e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1010e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_lock(&td->io_u_lock); 1011e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1012e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe while (flist_empty(&td->verify_list) && 1013e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe !td->verify_thread_exit) { 1014b36e298b5bdfc31ffc9a4c14e94a9c5c748888b0Jens Axboe ret = pthread_cond_wait(&td->verify_cond, 1015b36e298b5bdfc31ffc9a4c14e94a9c5c748888b0Jens Axboe &td->io_u_lock); 1016e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (ret) { 1017e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 1018e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe break; 1019e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 1020e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 1021e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1022e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe flist_splice_init(&td->verify_list, &list); 1023e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 1024e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe 1025e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe if (flist_empty(&list)) 1026e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe continue; 1027e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1028e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe while (!flist_empty(&list)) { 1029e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe io_u = flist_entry(list.next, struct io_u, list); 1030e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe flist_del_init(&io_u->list); 1031e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1032d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe ret = verify_io_u(td, io_u); 1033e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe put_io_u(td, io_u); 1034d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe if (!ret) 1035d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe continue; 1036d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe if (td->o.continue_on_error && 1037d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe td_non_fatal_error(ret)) { 1038d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe update_error_count(td, ret); 1039d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe td_clear_error(td); 1040d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe ret = 0; 1041d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe } 1042e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe } 1043e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } while (!ret); 1044e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1045d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe if (ret) { 1046d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe td_verror(td, ret, "async_verify"); 1047f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe if (td->o.verify_fatal) 1048f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe td->terminate = 1; 1049d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe } 1050d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe 1051e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboedone: 1052e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_lock(&td->io_u_lock); 1053e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->nr_verify_threads--; 1054e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 1055e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1056e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_signal(&td->free_cond); 1057e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe return NULL; 1058e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe} 1059e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1060e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_async_init(struct thread_data *td) 1061e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{ 1062e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe int i, ret; 1063304a47c7d94f407cc72a87025679a67f02288447bart Van Assche pthread_attr_t attr; 1064304a47c7d94f407cc72a87025679a67f02288447bart Van Assche 1065304a47c7d94f407cc72a87025679a67f02288447bart Van Assche pthread_attr_init(&attr); 1066304a47c7d94f407cc72a87025679a67f02288447bart Van Assche pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN); 1067e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1068e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_thread_exit = 0; 1069e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1070e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_threads = malloc(sizeof(pthread_t) * td->o.verify_async); 1071e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe for (i = 0; i < td->o.verify_async; i++) { 1072304a47c7d94f407cc72a87025679a67f02288447bart Van Assche ret = pthread_create(&td->verify_threads[i], &attr, 1073e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe verify_async_thread, td); 1074e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (ret) { 1075e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe log_err("fio: async verify creation failed: %s\n", 1076e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe strerror(ret)); 1077e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe break; 1078e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 1079e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe ret = pthread_detach(td->verify_threads[i]); 1080e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (ret) { 1081e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe log_err("fio: async verify thread detach failed: %s\n", 1082e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe strerror(ret)); 1083e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe break; 1084e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 1085e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->nr_verify_threads++; 1086e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 1087e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1088304a47c7d94f407cc72a87025679a67f02288447bart Van Assche pthread_attr_destroy(&attr); 1089304a47c7d94f407cc72a87025679a67f02288447bart Van Assche 1090e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (i != td->o.verify_async) { 1091e40823b10920f679d84f3f2222e319c168b1e7daJens Axboe log_err("fio: only %d verify threads started, exiting\n", i); 1092e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_thread_exit = 1; 1093e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe write_barrier(); 1094e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_broadcast(&td->verify_cond); 1095e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe return 1; 1096e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 1097e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1098e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe return 0; 1099e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe} 1100e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1101e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboevoid verify_async_exit(struct thread_data *td) 1102e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{ 1103e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_thread_exit = 1; 1104e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe write_barrier(); 1105e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_broadcast(&td->verify_cond); 1106e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1107e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_lock(&td->io_u_lock); 1108e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1109e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe while (td->nr_verify_threads) 1110e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_wait(&td->free_cond, &td->io_u_lock); 1111e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1112e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 1113e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe free(td->verify_threads); 1114e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_threads = NULL; 1115e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe} 1116