verify.c revision dc5bfbb227f1af83adf0b686d147b7ae2107c144
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 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: 4210e8a7b30ce2917df9f839d42596c7e3af9a904fRadha Ramachandran if (io_u->buf_filled_len >= len) { 43cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran dprint(FD_VERIFY, "using already filled verify pattern b=0 len=%u\n", len); 44cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran return; 45cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran } 46bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill verify pattern b=0 len=%u\n", len); 470e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran memset(p, td->o.verify_pattern[0], len); 48cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran io_u->buf_filled_len = len; 4990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe break; 500e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran default: { 510e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran unsigned int i = 0, size = 0; 5290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe unsigned char *b = p; 5390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe 5410e8a7b30ce2917df9f839d42596c7e3af9a904fRadha Ramachandran if (io_u->buf_filled_len >= len) { 55cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran dprint(FD_VERIFY, "using already filled verify pattern b=%d len=%u\n", 56cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran td->o.verify_pattern_bytes, len); 57cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran return; 58cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran } 5981f0366c7adcd5d70de5c1b144eafd366933f78eJens Axboe 60bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill verify pattern b=%d len=%u\n", 61bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe td->o.verify_pattern_bytes, len); 62bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 6390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe while (i < len) { 640e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran size = td->o.verify_pattern_bytes; 650e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran if (size > (len - i)) 660e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran size = len - i; 670e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran memcpy(b+i, td->o.verify_pattern, size); 680e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran i += size; 6990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe } 70cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran io_u->buf_filled_len = len; 7190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe break; 7290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe } 7390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe } 7490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe} 7590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe 76cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboestatic unsigned int get_hdr_inc(struct thread_data *td, struct io_u *io_u) 77cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe{ 78cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe unsigned int hdr_inc; 79cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe 80cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe hdr_inc = io_u->buflen; 818a99fdf63e1350fc2c35794e1c1f779885905b29Jens Axboe if (td->o.verify_interval && td->o.verify_interval <= io_u->buflen) 82cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe hdr_inc = td->o.verify_interval; 83cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe 84cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe return hdr_inc; 85cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe} 86cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe 87c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboestatic void fill_pattern_headers(struct thread_data *td, struct io_u *io_u, 88c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe unsigned long seed, int use_seed) 89c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe{ 90c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe unsigned int hdr_inc, header_num; 91c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe struct verify_header *hdr; 92c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe void *p = io_u->buf; 93c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe 94c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe fill_pattern(td, p, io_u->buflen, io_u, seed, use_seed); 95c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe 96cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe hdr_inc = get_hdr_inc(td, io_u); 97c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe header_num = 0; 98c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe for (; p < io_u->buf + io_u->buflen; p += hdr_inc) { 99c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe hdr = p; 100c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe populate_hdr(td, io_u, hdr, header_num, hdr_inc); 101c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe header_num++; 102c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe } 103c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe} 104c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe 1054764aec9fe5988281bdc114c13ac771fb16713ccJens Axboestatic void memswp(void *buf1, void *buf2, unsigned int len) 106546a9142511875524850ac92776184fd9fb7196eShawn Lewis{ 107dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis char swap[200]; 108dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis 109dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis assert(len <= sizeof(swap)); 11090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe 111546a9142511875524850ac92776184fd9fb7196eShawn Lewis memcpy(&swap, buf1, len); 112546a9142511875524850ac92776184fd9fb7196eShawn Lewis memcpy(buf1, buf2, len); 113546a9142511875524850ac92776184fd9fb7196eShawn Lewis memcpy(buf2, &swap, len); 114546a9142511875524850ac92776184fd9fb7196eShawn Lewis} 115546a9142511875524850ac92776184fd9fb7196eShawn Lewis 116e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void hexdump(void *buffer, int len) 117e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 118e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe unsigned char *p = buffer; 119e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe int i; 120e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 121e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe for (i = 0; i < len; i++) 122bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_err("%02x", p[i]); 123bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_err("\n"); 124e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 125e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 126d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe/* 1278767783245faac99a7e1c330a1d6536e579c8402Jens Axboe * Prepare for seperation of verify_header and checksum header 1288767783245faac99a7e1c330a1d6536e579c8402Jens Axboe */ 129546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic inline unsigned int __hdr_size(int verify_type) 1308767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{ 13103e20d687566753b90383571e5e152c5142bdffdBruce Cran unsigned int len = 0; 1328767783245faac99a7e1c330a1d6536e579c8402Jens Axboe 133546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe switch (verify_type) { 134546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_NONE: 135546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_NULL: 136546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = 0; 137546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 138546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_MD5: 139546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_md5); 140546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 141546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC64: 142546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc64); 143546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 144bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe case VERIFY_CRC32C: 145546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC32: 1463845591fadea480177223e28c9d1c03642d34f0eJens Axboe case VERIFY_CRC32C_INTEL: 147546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc32); 148546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 149546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC16: 150546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc16); 151546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 152546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC7: 153546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc7); 154546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 155546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_SHA256: 156546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_sha256); 157546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 158546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_SHA512: 159546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_sha512); 160546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 1617437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis case VERIFY_META: 1627437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis len = sizeof(struct vhdr_meta); 1637437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis break; 1647c353ceb3257b132f4c98326046b42201e070731Jens Axboe case VERIFY_SHA1: 1657c353ceb3257b132f4c98326046b42201e070731Jens Axboe len = sizeof(struct vhdr_sha1); 1667c353ceb3257b132f4c98326046b42201e070731Jens Axboe break; 16792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe case VERIFY_PATTERN: 16892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe len = 0; 16992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe break; 170546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe default: 171546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe log_err("fio: unknown verify header!\n"); 172546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe assert(0); 173546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe } 174546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 175546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe return len + sizeof(struct verify_header); 1768767783245faac99a7e1c330a1d6536e579c8402Jens Axboe} 1778767783245faac99a7e1c330a1d6536e579c8402Jens Axboe 1788767783245faac99a7e1c330a1d6536e579c8402Jens Axboestatic inline unsigned int hdr_size(struct verify_header *hdr) 1798767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{ 180546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe return __hdr_size(hdr->verify_type); 181546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe} 182546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 183546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic void *hdr_priv(struct verify_header *hdr) 184546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe{ 185546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe void *priv = hdr; 186546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 187546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe return priv + sizeof(struct verify_header); 1888767783245faac99a7e1c330a1d6536e579c8402Jens Axboe} 1898767783245faac99a7e1c330a1d6536e579c8402Jens Axboe 1908767783245faac99a7e1c330a1d6536e579c8402Jens Axboe/* 191936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * Verify container, pass info to verify handlers and allow them to 192936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * pass info back in case of error 193936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe */ 194936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestruct vcont { 195936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe /* 196936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * Input 197936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe */ 198936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe struct io_u *io_u; 199936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe unsigned int hdr_num; 2007d9fb455aadc0c0363489591775496f27f4a560aJens Axboe struct thread_data *td; 201936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe 202936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe /* 203936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * Output, only valid in case of error 204936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe */ 205bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe const char *name; 206bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe void *good_crc; 207bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe void *bad_crc; 208936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe unsigned int crc_len; 209936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe}; 210936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe 211c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboestatic void dump_buf(char *buf, unsigned int len, unsigned long long offset, 212c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe const char *type, struct fio_file *f) 2137d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{ 2146f260b317f4cec3027f79b8b329dd3f98c3906acJens Axboe char *ptr, fname[256]; 2157d9fb455aadc0c0363489591775496f27f4a560aJens Axboe int ret, fd; 2167d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 2176f260b317f4cec3027f79b8b329dd3f98c3906acJens Axboe ptr = strdup(f->file_name); 2186f260b317f4cec3027f79b8b329dd3f98c3906acJens Axboe strcpy(fname, basename(ptr)); 219c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe 220c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe sprintf(fname + strlen(fname), ".%llu.%s", offset, type); 2217d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 2227d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fd = open(fname, O_CREAT | O_TRUNC | O_WRONLY, 0644); 2237d9fb455aadc0c0363489591775496f27f4a560aJens Axboe if (fd < 0) { 2247d9fb455aadc0c0363489591775496f27f4a560aJens Axboe perror("open verify buf file"); 2257d9fb455aadc0c0363489591775496f27f4a560aJens Axboe return; 2267d9fb455aadc0c0363489591775496f27f4a560aJens Axboe } 2277d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 2287d9fb455aadc0c0363489591775496f27f4a560aJens Axboe while (len) { 2297d9fb455aadc0c0363489591775496f27f4a560aJens Axboe ret = write(fd, buf, len); 2307d9fb455aadc0c0363489591775496f27f4a560aJens Axboe if (!ret) 2317d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 2327d9fb455aadc0c0363489591775496f27f4a560aJens Axboe else if (ret < 0) { 2337d9fb455aadc0c0363489591775496f27f4a560aJens Axboe perror("write verify buf file"); 2347d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 2357d9fb455aadc0c0363489591775496f27f4a560aJens Axboe } 2367d9fb455aadc0c0363489591775496f27f4a560aJens Axboe len -= ret; 2377d9fb455aadc0c0363489591775496f27f4a560aJens Axboe buf += ret; 2387d9fb455aadc0c0363489591775496f27f4a560aJens Axboe } 2397d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 2407d9fb455aadc0c0363489591775496f27f4a560aJens Axboe close(fd); 241c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe log_err(" %s data dumped as %s\n", type, fname); 2426f260b317f4cec3027f79b8b329dd3f98c3906acJens Axboe free(ptr); 2437d9fb455aadc0c0363489591775496f27f4a560aJens Axboe} 2447d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 245c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe/* 246c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * Dump the contents of the read block and re-generate the correct data 247c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * and dump that too. 248c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe */ 2497d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void dump_verify_buffers(struct verify_header *hdr, struct vcont *vc) 2507d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{ 2517d9fb455aadc0c0363489591775496f27f4a560aJens Axboe struct thread_data *td = vc->td; 2527d9fb455aadc0c0363489591775496f27f4a560aJens Axboe struct io_u *io_u = vc->io_u; 2537d9fb455aadc0c0363489591775496f27f4a560aJens Axboe unsigned long hdr_offset; 2547d9fb455aadc0c0363489591775496f27f4a560aJens Axboe struct io_u dummy; 255c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe void *buf; 2567d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 2570dce9bc9b21a8d91aa55a29258dfaeffc57bd466Steven Lang if (!td->o.verify_dump) 2580dce9bc9b21a8d91aa55a29258dfaeffc57bd466Steven Lang return; 2590dce9bc9b21a8d91aa55a29258dfaeffc57bd466Steven Lang 260c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe /* 261c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * Dump the contents we just read off disk 262c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe */ 2637d9fb455aadc0c0363489591775496f27f4a560aJens Axboe hdr_offset = vc->hdr_num * hdr->len; 2647d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 265c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe dump_buf(io_u->buf + hdr_offset, hdr->len, io_u->offset + hdr_offset, 266c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe "received", vc->io_u->file); 2677d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 268c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe /* 269c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * Allocate a new buf and re-generate the original data 270c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe */ 271c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe buf = malloc(io_u->buflen); 2727d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dummy = *io_u; 273c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe dummy.buf = buf; 2744aae38a645f3315ca2f8cc57a7ec4110ba7d8319Jens Axboe dummy.rand_seed = hdr->rand_seed; 275cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe dummy.buf_filled_len = 0; 2767d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 277c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe fill_pattern_headers(td, &dummy, hdr->rand_seed, 1); 2787d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 279c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe dump_buf(buf + hdr_offset, hdr->len, io_u->offset + hdr_offset, 280c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe "expected", vc->io_u->file); 2817d9fb455aadc0c0363489591775496f27f4a560aJens Axboe free(buf); 2827d9fb455aadc0c0363489591775496f27f4a560aJens Axboe} 2837d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 284bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboestatic void log_verify_failure(struct verify_header *hdr, struct vcont *vc) 285bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe{ 286bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe unsigned long long offset; 287bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe 288bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe offset = vc->io_u->offset; 289bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe offset += vc->hdr_num * hdr->len; 29032c17adf7f75da1f0957d4691633fea60259910fJens Axboe log_err("%.8s: verify failed at file %s offset %llu, length %u\n", 29132c17adf7f75da1f0957d4691633fea60259910fJens Axboe vc->name, vc->io_u->file->file_name, offset, hdr->len); 292bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe 293bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (vc->good_crc && vc->bad_crc) { 294bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_err(" Expected CRC: "); 295bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe hexdump(vc->good_crc, vc->crc_len); 296bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_err(" Received CRC: "); 297bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe hexdump(vc->bad_crc, vc->crc_len); 298bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe } 2997d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 3007d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dump_verify_buffers(hdr, vc); 301bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe} 302bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe 303936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe/* 304d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe * Return data area 'header_num' 305d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe */ 306936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic inline void *io_u_verify_off(struct verify_header *hdr, struct vcont *vc) 307d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe{ 308936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe return vc->io_u->buf + vc->hdr_num * hdr->len + hdr_size(hdr); 309d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe} 310d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe 31192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboestatic int verify_io_u_pattern(struct verify_header *hdr, struct vcont *vc) 31292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe{ 31392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe struct thread_data *td = vc->td; 31492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe struct io_u *io_u = vc->io_u; 31592bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe char *buf, *pattern; 3162b13e716c0921356c0930522718e00b8df34293aJens Axboe unsigned int header_size = __hdr_size(td->o.verify); 3179a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang unsigned int len, mod, i, size, pattern_size; 31892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe 31992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe pattern = td->o.verify_pattern; 3209a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang pattern_size = td->o.verify_pattern_bytes; 3219a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang if (pattern_size <= 1) 3229a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang pattern_size = MAX_PATTERN_SIZE; 3232b13e716c0921356c0930522718e00b8df34293aJens Axboe buf = (void *) hdr + header_size; 3242b13e716c0921356c0930522718e00b8df34293aJens Axboe len = get_hdr_inc(td, io_u) - header_size; 3259a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang mod = header_size % pattern_size; 3269a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang 3279a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang for (i = 0; i < len; i += size) { 3289a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang size = pattern_size - mod; 3299a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang if (size > (len - i)) 3309a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang size = len - i; 3319a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang if (memcmp(buf + i, pattern + mod, size)) 332e4ad68b1364aebfe949e2d6a649c7b1001ebca07Jens Axboe /* Let the slow compare find the first mismatch byte. */ 3339a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang break; 3349a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang mod = 0; 3359a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang } 33692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe 3379a2a86d0f6f1425a6da666459ccd379e356a30d0Steven Lang for (; i < len; i++) { 33892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe if (buf[i] != pattern[mod]) { 33992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe unsigned int bits; 34092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe 34192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe bits = hweight8(buf[i] ^ pattern[mod]); 34292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe log_err("fio: got pattern %x, wanted %x. Bad bits %d\n", 34392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe buf[i], pattern[mod], bits); 34492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe log_err("fio: bad pattern block offset %u\n", i); 34592bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe dump_verify_buffers(hdr, vc); 34692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe return EILSEQ; 34792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe } 34892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe mod++; 34992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe if (mod == td->o.verify_pattern_bytes) 35092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe mod = 0; 35192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe } 35292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe 35392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe return 0; 35492bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe} 35592bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe 35692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboestatic int verify_io_u_meta(struct verify_header *hdr, struct vcont *vc) 3577437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{ 35892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe struct thread_data *td = vc->td; 3597437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis struct vhdr_meta *vh = hdr_priv(hdr); 360936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe struct io_u *io_u = vc->io_u; 36192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe int ret = EILSEQ; 3627437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 363bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "meta verify io_u %p, len %u\n", io_u, hdr->len); 364bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 365bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (vh->offset == io_u->offset + vc->hdr_num * td->o.verify_interval) 36692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe ret = 0; 36792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe 36892bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe if (td->o.verify_pattern_bytes) 36992bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe ret |= verify_io_u_pattern(hdr, vc); 37092bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe 37192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe if (!ret) 372bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 3737437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 374bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "meta"; 375bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 37692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe return ret; 3777437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis} 3787437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 379936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha512(struct verify_header *hdr, struct vcont *vc) 380cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 381936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 382546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha512 *vh = hdr_priv(hdr); 383cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe uint8_t sha512[128]; 38425dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe struct fio_sha512_ctx sha512_ctx = { 385cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe .buf = sha512, 386cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 387cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 388936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "sha512 verify io_u %p, len %u\n", vc->io_u, hdr->len); 389bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 39025dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha512_init(&sha512_ctx); 39125dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha512_update(&sha512_ctx, p, hdr->len - hdr_size(hdr)); 392cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 393bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (!memcmp(vh->sha512, sha512_ctx.buf, sizeof(sha512))) 394bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 395cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 396bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "sha512"; 397bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = vh->sha512; 398bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = sha512_ctx.buf; 399bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = sizeof(vh->sha512); 400bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 401bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 402cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 403cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 404936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha256(struct verify_header *hdr, struct vcont *vc) 405cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 406936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 407546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha256 *vh = hdr_priv(hdr); 408bc77f56f79f6ae155e9eb26263ed686ef28b47ecJens Axboe uint8_t sha256[64]; 40925dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe struct fio_sha256_ctx sha256_ctx = { 410cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe .buf = sha256, 411cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 412cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 413936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "sha256 verify io_u %p, len %u\n", vc->io_u, hdr->len); 414bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 41525dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha256_init(&sha256_ctx); 41625dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha256_update(&sha256_ctx, p, hdr->len - hdr_size(hdr)); 417cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 418bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (!memcmp(vh->sha256, sha256_ctx.buf, sizeof(sha256))) 419bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 420cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 421bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "sha256"; 422bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = vh->sha256; 423bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = sha256_ctx.buf; 424bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = sizeof(vh->sha256); 425bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 426bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 427cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 428cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 429936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha1(struct verify_header *hdr, struct vcont *vc) 4307c353ceb3257b132f4c98326046b42201e070731Jens Axboe{ 431936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 4327c353ceb3257b132f4c98326046b42201e070731Jens Axboe struct vhdr_sha1 *vh = hdr_priv(hdr); 4337c353ceb3257b132f4c98326046b42201e070731Jens Axboe uint32_t sha1[5]; 43425dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe struct fio_sha1_ctx sha1_ctx = { 4357c353ceb3257b132f4c98326046b42201e070731Jens Axboe .H = sha1, 4367c353ceb3257b132f4c98326046b42201e070731Jens Axboe }; 4377c353ceb3257b132f4c98326046b42201e070731Jens Axboe 438936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "sha1 verify io_u %p, len %u\n", vc->io_u, hdr->len); 4397c353ceb3257b132f4c98326046b42201e070731Jens Axboe 44025dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha1_init(&sha1_ctx); 44125dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha1_update(&sha1_ctx, p, hdr->len - hdr_size(hdr)); 4427c353ceb3257b132f4c98326046b42201e070731Jens Axboe 443bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (!memcmp(vh->sha1, sha1_ctx.H, sizeof(sha1))) 444bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 4457c353ceb3257b132f4c98326046b42201e070731Jens Axboe 446bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "sha1"; 447bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = vh->sha1; 448bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = sha1_ctx.H; 449bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = sizeof(vh->sha1); 450bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 451bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 4527c353ceb3257b132f4c98326046b42201e070731Jens Axboe} 4537c353ceb3257b132f4c98326046b42201e070731Jens Axboe 454936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc7(struct verify_header *hdr, struct vcont *vc) 4551e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{ 456936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 457546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc7 *vh = hdr_priv(hdr); 4581e154bdbf14a1d352117aea057035235b66f0381Jens Axboe unsigned char c; 4591e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 460936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "crc7 verify io_u %p, len %u\n", vc->io_u, hdr->len); 461bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 46225dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe c = fio_crc7(p, hdr->len - hdr_size(hdr)); 4631e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 464bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (c == vh->crc7) 465bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 4661e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 467bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "crc7"; 468bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = &vh->crc7; 469bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = &c; 470bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = 1; 471bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 472bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 4731e154bdbf14a1d352117aea057035235b66f0381Jens Axboe} 4741e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 475936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc16(struct verify_header *hdr, struct vcont *vc) 476969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{ 477936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 478546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc16 *vh = hdr_priv(hdr); 479969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe unsigned short c; 480969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 481936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "crc16 verify io_u %p, len %u\n", vc->io_u, hdr->len); 482bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 48325dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe c = fio_crc16(p, hdr->len - hdr_size(hdr)); 484969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 485bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (c == vh->crc16) 486bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 487969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 488bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "crc16"; 489bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = &vh->crc16; 490bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = &c; 491bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = 2; 492bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 493bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 494969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe} 495969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 496936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc64(struct verify_header *hdr, struct vcont *vc) 497d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{ 498936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 499546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc64 *vh = hdr_priv(hdr); 500d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe unsigned long long c; 501d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 502936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "crc64 verify io_u %p, len %u\n", vc->io_u, hdr->len); 503bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 50425dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe c = fio_crc64(p, hdr->len - hdr_size(hdr)); 505d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 506bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (c == vh->crc64) 507bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 508d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 509bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "crc64"; 510bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = &vh->crc64; 511bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = &c; 512bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = 8; 513bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 514bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 515d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe} 516d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 517936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc32(struct verify_header *hdr, struct vcont *vc) 518e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 519936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 520546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 521546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe uint32_t c; 522e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 523936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "crc32 verify io_u %p, len %u\n", vc->io_u, hdr->len); 524bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 52525dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe c = fio_crc32(p, hdr->len - hdr_size(hdr)); 526e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 527bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (c == vh->crc32) 528bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 529e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 530bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "crc32"; 531bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = &vh->crc32; 532bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = &c; 533bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = 4; 534bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 535bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 536e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 537e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 538936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc32c(struct verify_header *hdr, struct vcont *vc) 539bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{ 540936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 541bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 542bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe uint32_t c; 543bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 544936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "crc32c verify io_u %p, len %u\n", vc->io_u, hdr->len); 545bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 54625dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe c = fio_crc32c(p, hdr->len - hdr_size(hdr)); 547bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 548bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (c == vh->crc32) 549bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 550bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 551bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "crc32c"; 552bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = &vh->crc32; 553bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = &c; 554bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = 4; 555bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 556bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 557bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe} 558bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 559936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_md5(struct verify_header *hdr, struct vcont *vc) 560e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 561936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 562546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_md5 *vh = hdr_priv(hdr); 5638c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe uint32_t hash[MD5_HASH_WORDS]; 56425dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe struct fio_md5_ctx md5_ctx = { 5658c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe .hash = hash, 5668c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe }; 567e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 568936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "md5 verify io_u %p, len %u\n", vc->io_u, hdr->len); 569bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 57025dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_md5_init(&md5_ctx); 57125dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_md5_update(&md5_ctx, p, hdr->len - hdr_size(hdr)); 572e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 573bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (!memcmp(vh->md5_digest, md5_ctx.hash, sizeof(hash))) 574bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 575e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 576bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "md5"; 577bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = vh->md5_digest; 578bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = md5_ctx.hash; 579bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = sizeof(hash); 580bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 581bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 582e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 583e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 584e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe/* 585e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe * Push IO verification to a separate thread 586e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe */ 587e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_io_u_async(struct thread_data *td, struct io_u *io_u) 588e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{ 589e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (io_u->file) 590e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe put_file_log(td, io_u->file); 591e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 592e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_lock(&td->io_u_lock); 593d7ee2a7d431c2cabdf56d04ca14805cad72cf985Steven Lang 5940c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran if (io_u->flags & IO_U_F_IN_CUR_DEPTH) { 5950c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran td->cur_depth--; 5960c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran io_u->flags &= ~IO_U_F_IN_CUR_DEPTH; 5970c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran } 598e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe flist_del(&io_u->list); 599e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe flist_add_tail(&io_u->list, &td->verify_list); 6002ecc1b57721e3cb72bbf558bc169c97037fe3d0aJens Axboe io_u->flags |= IO_U_F_FREE_DEF; 601e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 602e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 603e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_signal(&td->verify_cond); 604e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe return 0; 605e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe} 606e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 6070d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboestatic int verify_trimmed_io_u(struct thread_data *td, struct io_u *io_u) 6080d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe{ 6090d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe static char zero_buf[1024]; 6100d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe unsigned int this_len, len; 6110d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe int ret = 0; 6120d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe void *p; 6130d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 6140d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe if (!td->o.trim_zero) 6150d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe return 0; 6160d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 6170d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe len = io_u->buflen; 6180d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe p = io_u->buf; 6190d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe do { 6200d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe this_len = sizeof(zero_buf); 6210d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe if (this_len > len) 6220d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe this_len = len; 6230d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe if (memcmp(p, zero_buf, this_len)) { 6240d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe ret = EILSEQ; 6250d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe break; 6260d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe } 6270d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe len -= this_len; 6280d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe p += this_len; 6290d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe } while (len); 6300d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 6310d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe if (!ret) 6320d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe return 0; 6330d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 634a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe log_err("trim: verify failed at file %s offset %llu, length %lu" 635a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe ", block offset %lu\n", 636a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe io_u->file->file_name, io_u->offset, io_u->buflen, 6372f68124f26e54233db41b462a257dabc48e5c32bJens Axboe (unsigned long) (p - io_u->buf)); 6380d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe return ret; 6390d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe} 6400d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 6410ae2c6e1d4727515e35e682eae6776fe55fa0275Jens Axboestatic int verify_header(struct io_u *io_u, struct verify_header *hdr) 642f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe{ 643f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe void *p = hdr; 644f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe uint32_t crc; 645f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe 646ae38c0dcd570265aef09aa132ce27278d8909a1dJens Axboe if (hdr->magic != FIO_HDR_MAGIC) 647ae38c0dcd570265aef09aa132ce27278d8909a1dJens Axboe return 0; 6480ae2c6e1d4727515e35e682eae6776fe55fa0275Jens Axboe if (hdr->len > io_u->buflen) { 6490ae2c6e1d4727515e35e682eae6776fe55fa0275Jens Axboe log_err("fio: verify header exceeds buffer length (%u > %lu)\n", hdr->len, io_u->buflen); 6500ae2c6e1d4727515e35e682eae6776fe55fa0275Jens Axboe return 0; 6510ae2c6e1d4727515e35e682eae6776fe55fa0275Jens Axboe } 652ae38c0dcd570265aef09aa132ce27278d8909a1dJens Axboe 65325dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe crc = fio_crc32c(p, offsetof(struct verify_header, crc32)); 654f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe if (crc == hdr->crc32) 655f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe return 1; 656f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe 657f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe log_err("fio: verify header crc %x, calculated %x\n", hdr->crc32, crc); 658f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe return 0; 659f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe} 660f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe 66136690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboeint verify_io_u(struct thread_data *td, struct io_u *io_u) 662e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 6633f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis struct verify_header *hdr; 6642b13e716c0921356c0930522718e00b8df34293aJens Axboe unsigned int header_size, hdr_inc, hdr_num = 0; 66595646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe void *p; 666e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe int ret; 667e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 6681dcc049824b840df1ee0ef5d019fffa4037e1bb0Shawn Lewis if (td->o.verify == VERIFY_NULL || io_u->ddir != DDIR_READ) 66936690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe return 0; 6700d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe if (io_u->flags & IO_U_F_TRIMMED) { 6710d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe ret = verify_trimmed_io_u(td, io_u); 6720d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe goto done; 6730d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe } 67436690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe 675cfbcd0dc2fcbf0f9bfe92ff8f4ab17f21e46d21eJens Axboe hdr_inc = get_hdr_inc(td, io_u); 676e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 677a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe ret = 0; 6785ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe for (p = io_u->buf; p < io_u->buf + io_u->buflen; 6795ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe p += hdr_inc, hdr_num++) { 680bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe struct vcont vc = { 681bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe .io_u = io_u, 682bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe .hdr_num = hdr_num, 6837d9fb455aadc0c0363489591775496f27f4a560aJens Axboe .td = td, 684bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe }; 685f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe unsigned int verify_type; 686936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe 687f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe if (ret && td->o.verify_fatal) 688a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe break; 689f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe 6902b13e716c0921356c0930522718e00b8df34293aJens Axboe header_size = __hdr_size(td->o.verify); 691a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe if (td->o.verify_offset) 6922b13e716c0921356c0930522718e00b8df34293aJens Axboe memswp(p, p + td->o.verify_offset, header_size); 69395646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe hdr = p; 694e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 6950ae2c6e1d4727515e35e682eae6776fe55fa0275Jens Axboe if (!verify_header(io_u, hdr)) { 696ae38c0dcd570265aef09aa132ce27278d8909a1dJens Axboe log_err("verify: bad magic header %x, wanted %x at " 697ae38c0dcd570265aef09aa132ce27278d8909a1dJens Axboe "file %s offset %llu, length %u\n", 698d3a173a927084660c365d6aa162016ebb0746946Jens Axboe hdr->magic, FIO_HDR_MAGIC, 699c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe io_u->file->file_name, 700c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe io_u->offset + hdr_num * hdr->len, hdr->len); 7019fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 7023f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe } 7033f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe 704f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe if (td->o.verify != VERIFY_NONE) 705f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe verify_type = td->o.verify; 706f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe else 707f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe verify_type = hdr->verify_type; 708f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe 709f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe switch (verify_type) { 7103f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_MD5: 711936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_md5(hdr, &vc); 7123f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 7133f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC64: 714936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_crc64(hdr, &vc); 7153f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 716bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe case VERIFY_CRC32C: 7173845591fadea480177223e28c9d1c03642d34f0eJens Axboe case VERIFY_CRC32C_INTEL: 718936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_crc32c(hdr, &vc); 719bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe break; 7203f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC32: 721936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_crc32(hdr, &vc); 7223f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 7233f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC16: 724936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_crc16(hdr, &vc); 7253f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 7263f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC7: 727936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_crc7(hdr, &vc); 7283f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 729cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe case VERIFY_SHA256: 730936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_sha256(hdr, &vc); 731cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe break; 732cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe case VERIFY_SHA512: 733936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_sha512(hdr, &vc); 734cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe break; 7357437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis case VERIFY_META: 73692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe ret = verify_io_u_meta(hdr, &vc); 7377437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis break; 7387c353ceb3257b132f4c98326046b42201e070731Jens Axboe case VERIFY_SHA1: 739936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_sha1(hdr, &vc); 7407c353ceb3257b132f4c98326046b42201e070731Jens Axboe break; 74192bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe case VERIFY_PATTERN: 74292bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe ret = verify_io_u_pattern(hdr, &vc); 74392bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe break; 7443f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis default: 7453f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("Bad verify type %u\n", hdr->verify_type); 746d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe ret = EINVAL; 7473f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis } 748f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe 749f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe if (ret && verify_type != hdr->verify_type) 750f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe log_err("fio: verify type mismatch (%u media, %u given)\n", 751f00b210f73a8562c2cc64d73aee04875d25162b0Jens Axboe hdr->verify_type, verify_type); 7523f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis } 753a7dfe862c2e3fe72b8db6a6e67302048d3731c6dJens Axboe 7540d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboedone: 755f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe if (ret && td->o.verify_fatal) 756f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe td->terminate = 1; 757f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe 758a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe return ret; 759e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 760e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 7617437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic void fill_meta(struct verify_header *hdr, struct thread_data *td, 7625ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe struct io_u *io_u, unsigned int header_num) 7637437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{ 7647437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis struct vhdr_meta *vh = hdr_priv(hdr); 7657437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 7667437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->thread = td->thread_number; 7677437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 7687437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->time_sec = io_u->start_time.tv_sec; 7697437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->time_usec = io_u->start_time.tv_usec; 7707437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 7717437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->numberio = td->io_issues[DDIR_WRITE]; 7727437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 7737437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->offset = io_u->offset + header_num * td->o.verify_interval; 7747437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis} 7757437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 776cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha512(struct verify_header *hdr, void *p, unsigned int len) 777cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 778546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha512 *vh = hdr_priv(hdr); 77925dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe struct fio_sha512_ctx sha512_ctx = { 780546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe .buf = vh->sha512, 781cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 782cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 78325dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha512_init(&sha512_ctx); 78425dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha512_update(&sha512_ctx, p, len); 785cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 786cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 787cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha256(struct verify_header *hdr, void *p, unsigned int len) 788cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 789546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha256 *vh = hdr_priv(hdr); 79025dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe struct fio_sha256_ctx sha256_ctx = { 791546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe .buf = vh->sha256, 792cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 793cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 79425dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha256_init(&sha256_ctx); 79525dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha256_update(&sha256_ctx, p, len); 796cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 797cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 7987c353ceb3257b132f4c98326046b42201e070731Jens Axboestatic void fill_sha1(struct verify_header *hdr, void *p, unsigned int len) 7997c353ceb3257b132f4c98326046b42201e070731Jens Axboe{ 8007c353ceb3257b132f4c98326046b42201e070731Jens Axboe struct vhdr_sha1 *vh = hdr_priv(hdr); 80125dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe struct fio_sha1_ctx sha1_ctx = { 8027c353ceb3257b132f4c98326046b42201e070731Jens Axboe .H = vh->sha1, 8037c353ceb3257b132f4c98326046b42201e070731Jens Axboe }; 8047c353ceb3257b132f4c98326046b42201e070731Jens Axboe 80525dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha1_init(&sha1_ctx); 80625dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_sha1_update(&sha1_ctx, p, len); 8077c353ceb3257b132f4c98326046b42201e070731Jens Axboe} 8087c353ceb3257b132f4c98326046b42201e070731Jens Axboe 8091e154bdbf14a1d352117aea057035235b66f0381Jens Axboestatic void fill_crc7(struct verify_header *hdr, void *p, unsigned int len) 8101e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{ 811546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc7 *vh = hdr_priv(hdr); 812546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 81325dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe vh->crc7 = fio_crc7(p, len); 8141e154bdbf14a1d352117aea057035235b66f0381Jens Axboe} 8151e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 816969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboestatic void fill_crc16(struct verify_header *hdr, void *p, unsigned int len) 817969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{ 818546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc16 *vh = hdr_priv(hdr); 819546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 82025dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe vh->crc16 = fio_crc16(p, len); 821969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe} 822969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 823e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_crc32(struct verify_header *hdr, void *p, unsigned int len) 824e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 825546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 826546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 82725dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe vh->crc32 = fio_crc32(p, len); 828e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 829e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 830bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboestatic void fill_crc32c(struct verify_header *hdr, void *p, unsigned int len) 831bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{ 832bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 833bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 83425dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe vh->crc32 = fio_crc32c(p, len); 835bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe} 836bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 837d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboestatic void fill_crc64(struct verify_header *hdr, void *p, unsigned int len) 838d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{ 839546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc64 *vh = hdr_priv(hdr); 840546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 84125dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe vh->crc64 = fio_crc64(p, len); 842d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe} 843d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 844e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_md5(struct verify_header *hdr, void *p, unsigned int len) 845e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 846546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_md5 *vh = hdr_priv(hdr); 84725dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe struct fio_md5_ctx md5_ctx = { 848546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe .hash = (uint32_t *) vh->md5_digest, 8498c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe }; 850e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 85125dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_md5_init(&md5_ctx); 85225dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe fio_md5_update(&md5_ctx, p, len); 853e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 854e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 8557d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void populate_hdr(struct thread_data *td, struct io_u *io_u, 8567d9fb455aadc0c0363489591775496f27f4a560aJens Axboe struct verify_header *hdr, unsigned int header_num, 8577d9fb455aadc0c0363489591775496f27f4a560aJens Axboe unsigned int header_len) 8587d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{ 8597d9fb455aadc0c0363489591775496f27f4a560aJens Axboe unsigned int data_len; 8607d9fb455aadc0c0363489591775496f27f4a560aJens Axboe void *data, *p; 8617d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 8627d9fb455aadc0c0363489591775496f27f4a560aJens Axboe p = (void *) hdr; 8637d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 864d3a173a927084660c365d6aa162016ebb0746946Jens Axboe hdr->magic = FIO_HDR_MAGIC; 8657d9fb455aadc0c0363489591775496f27f4a560aJens Axboe hdr->verify_type = td->o.verify; 866d3a173a927084660c365d6aa162016ebb0746946Jens Axboe hdr->len = header_len; 8677d9fb455aadc0c0363489591775496f27f4a560aJens Axboe hdr->rand_seed = io_u->rand_seed; 86825dfa848abbb6c35b4d45fabd5a8e82cb77fb285Jens Axboe hdr->crc32 = fio_crc32c(p, offsetof(struct verify_header, crc32)); 869f65d1c2663ac6007eac1a2063fe25b4275d013e4Jens Axboe 8707d9fb455aadc0c0363489591775496f27f4a560aJens Axboe data_len = header_len - hdr_size(hdr); 8717d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 8727d9fb455aadc0c0363489591775496f27f4a560aJens Axboe data = p + hdr_size(hdr); 8737d9fb455aadc0c0363489591775496f27f4a560aJens Axboe switch (td->o.verify) { 8747d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_MD5: 8757d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill md5 io_u %p, len %u\n", 8767d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 8777d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_md5(hdr, data, data_len); 8787d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 8797d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_CRC64: 8807d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill crc64 io_u %p, len %u\n", 8817d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 8827d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_crc64(hdr, data, data_len); 8837d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 8847d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_CRC32C: 8857d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_CRC32C_INTEL: 8867d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill crc32c io_u %p, len %u\n", 8877d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 8887d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_crc32c(hdr, data, data_len); 8897d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 8907d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_CRC32: 8917d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill crc32 io_u %p, len %u\n", 8927d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 8937d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_crc32(hdr, data, data_len); 8947d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 8957d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_CRC16: 8967d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill crc16 io_u %p, len %u\n", 8977d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 8987d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_crc16(hdr, data, data_len); 8997d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 9007d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_CRC7: 9017d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill crc7 io_u %p, len %u\n", 9027d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 9037d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_crc7(hdr, data, data_len); 9047d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 9057d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_SHA256: 9067d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill sha256 io_u %p, len %u\n", 9077d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 9087d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_sha256(hdr, data, data_len); 9097d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 9107d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_SHA512: 9117d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill sha512 io_u %p, len %u\n", 9127d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 9137d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_sha512(hdr, data, data_len); 9147d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 9157d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_META: 9167d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill meta io_u %p, len %u\n", 9177d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 9187d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_meta(hdr, td, io_u, header_num); 9197d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 9207d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_SHA1: 9217d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill sha1 io_u %p, len %u\n", 9227d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 9237d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_sha1(hdr, data, data_len); 9247d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 92592bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe case VERIFY_PATTERN: 92692bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe /* nothing to do here */ 92792bf48d530ab09bae4058df711c4723c73da51b9Jens Axboe break; 9287d9fb455aadc0c0363489591775496f27f4a560aJens Axboe default: 9297d9fb455aadc0c0363489591775496f27f4a560aJens Axboe log_err("fio: bad verify type: %d\n", td->o.verify); 9307d9fb455aadc0c0363489591775496f27f4a560aJens Axboe assert(0); 9317d9fb455aadc0c0363489591775496f27f4a560aJens Axboe } 9327d9fb455aadc0c0363489591775496f27f4a560aJens Axboe if (td->o.verify_offset) 9337d9fb455aadc0c0363489591775496f27f4a560aJens Axboe memswp(p, p + td->o.verify_offset, hdr_size(hdr)); 9347d9fb455aadc0c0363489591775496f27f4a560aJens Axboe} 9357d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 936e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe/* 937e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * fill body of io_u->buf with random data and add a header with the 938c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe * checksum of choice 939e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe */ 940e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboevoid populate_verify_io_u(struct thread_data *td, struct io_u *io_u) 941e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 9429cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe if (td->o.verify == VERIFY_NULL) 9439cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe return; 9449cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe 945c50ca7bd6d5b84e24e9ddcdb1765fb4070804503Jens Axboe fill_pattern_headers(td, io_u, 0, 0); 946e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 947e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 948e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboeint get_next_verify(struct thread_data *td, struct io_u *io_u) 949e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 9508de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe struct io_piece *ipo = NULL; 951e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 952d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe /* 953d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe * this io_u is from a requeue, we already filled the offsets 954d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe */ 955d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe if (io_u->file) 956d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe return 0; 957d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe 9588de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe if (!RB_EMPTY_ROOT(&td->io_hist_tree)) { 9598de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe struct rb_node *n = rb_first(&td->io_hist_tree); 960e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 9618de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe ipo = rb_entry(n, struct io_piece, rb_node); 9624b87898e8d76aaf05baec83077a11311c1447397Jens Axboe rb_erase(n, &td->io_hist_tree); 963a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe assert(ipo->flags & IP_F_ONRB); 964a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe ipo->flags &= ~IP_F_ONRB; 96501743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe } else if (!flist_empty(&td->io_hist_list)) { 96601743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe ipo = flist_entry(td->io_hist_list.next, struct io_piece, list); 96701743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe flist_del(&ipo->list); 968a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe assert(ipo->flags & IP_F_ONLIST); 969a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe ipo->flags &= ~IP_F_ONLIST; 9708de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe } 971e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 9728de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe if (ipo) { 9730d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe td->io_hist_len--; 9740d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 975e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe io_u->offset = ipo->offset; 976e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe io_u->buflen = ipo->len; 97736167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe io_u->file = ipo->file; 97882af2a7ca1a543b41c003de69d5e3c36860f47d5Jens Axboe io_u->flags |= IO_U_F_VER_LIST; 97997af62cec418cd722fb43c6010d6430534e12353Jens Axboe 9800d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe if (ipo->flags & IP_F_TRIMMED) 9810d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe io_u->flags |= IO_U_F_TRIMMED; 9820d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 983d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (!fio_file_open(io_u->file)) { 98497af62cec418cd722fb43c6010d6430534e12353Jens Axboe int r = td_io_open_file(td, io_u->file); 98597af62cec418cd722fb43c6010d6430534e12353Jens Axboe 986bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe if (r) { 987bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "failed file %s open\n", 988bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u->file->file_name); 98997af62cec418cd722fb43c6010d6430534e12353Jens Axboe return 1; 990bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe } 99197af62cec418cd722fb43c6010d6430534e12353Jens Axboe } 99297af62cec418cd722fb43c6010d6430534e12353Jens Axboe 99397af62cec418cd722fb43c6010d6430534e12353Jens Axboe get_file(ipo->file); 994d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe assert(fio_file_open(io_u->file)); 995e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe io_u->ddir = DDIR_READ; 99636167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe io_u->xfer_buf = io_u->buf; 99736167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe io_u->xfer_buflen = io_u->buflen; 9980d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 9990d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe remove_trim_entry(td, ipo); 1000e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe free(ipo); 1001bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "get_next_verify: ret io_u %p\n", io_u); 1002e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe return 0; 1003e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe } 1004e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 1005bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "get_next_verify: empty\n"); 1006e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe return 1; 1007e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 1008e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1009dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboevoid fio_verify_init(struct thread_data *td) 1010dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe{ 1011dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe if (td->o.verify == VERIFY_CRC32C_INTEL || 1012dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe td->o.verify == VERIFY_CRC32C) { 1013dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe crc32c_intel_probe(); 1014dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe } 1015dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe} 1016dc5bfbb227f1af83adf0b686d147b7ae2107c144Jens Axboe 1017e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboestatic void *verify_async_thread(void *data) 1018e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{ 1019e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe struct thread_data *td = data; 1020e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe struct io_u *io_u; 1021e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe int ret = 0; 1022e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1023e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (td->o.verify_cpumask_set && 1024e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe fio_setaffinity(td->pid, td->o.verify_cpumask)) { 1025e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe log_err("fio: failed setting verify thread affinity\n"); 1026e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe goto done; 1027e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 1028e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1029e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe do { 1030e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe FLIST_HEAD(list); 1031e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe 1032e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe read_barrier(); 1033e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (td->verify_thread_exit) 1034e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe break; 1035e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1036e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_lock(&td->io_u_lock); 1037e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1038e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe while (flist_empty(&td->verify_list) && 1039e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe !td->verify_thread_exit) { 1040b36e298b5bdfc31ffc9a4c14e94a9c5c748888b0Jens Axboe ret = pthread_cond_wait(&td->verify_cond, 1041b36e298b5bdfc31ffc9a4c14e94a9c5c748888b0Jens Axboe &td->io_u_lock); 1042e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (ret) { 1043e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 1044e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe break; 1045e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 1046e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 1047e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1048e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe flist_splice_init(&td->verify_list, &list); 1049e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 1050e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe 1051e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe if (flist_empty(&list)) 1052e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe continue; 1053e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1054e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe while (!flist_empty(&list)) { 1055e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe io_u = flist_entry(list.next, struct io_u, list); 1056e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe flist_del_init(&io_u->list); 1057e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1058d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe ret = verify_io_u(td, io_u); 1059e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe put_io_u(td, io_u); 1060d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe if (!ret) 1061d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe continue; 10628b28bd41375930664a0ff9ff9b101a88ac416ac5Dmitry Monakhov if (td_non_fatal_error(td, ERROR_TYPE_VERIFY_BIT, ret)) { 1063d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe update_error_count(td, ret); 1064d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe td_clear_error(td); 1065d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe ret = 0; 1066d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe } 1067e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe } 1068e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } while (!ret); 1069e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1070d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe if (ret) { 1071d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe td_verror(td, ret, "async_verify"); 1072f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe if (td->o.verify_fatal) 1073f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe td->terminate = 1; 1074d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe } 1075d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe 1076e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboedone: 1077e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_lock(&td->io_u_lock); 1078e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->nr_verify_threads--; 1079e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 1080e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1081e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_signal(&td->free_cond); 1082e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe return NULL; 1083e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe} 1084e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1085e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_async_init(struct thread_data *td) 1086e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{ 1087e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe int i, ret; 1088304a47c7d94f407cc72a87025679a67f02288447bart Van Assche pthread_attr_t attr; 1089304a47c7d94f407cc72a87025679a67f02288447bart Van Assche 1090304a47c7d94f407cc72a87025679a67f02288447bart Van Assche pthread_attr_init(&attr); 1091304a47c7d94f407cc72a87025679a67f02288447bart Van Assche pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN); 1092e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1093e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_thread_exit = 0; 1094e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1095e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_threads = malloc(sizeof(pthread_t) * td->o.verify_async); 1096e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe for (i = 0; i < td->o.verify_async; i++) { 1097304a47c7d94f407cc72a87025679a67f02288447bart Van Assche ret = pthread_create(&td->verify_threads[i], &attr, 1098e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe verify_async_thread, td); 1099e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (ret) { 1100e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe log_err("fio: async verify creation failed: %s\n", 1101e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe strerror(ret)); 1102e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe break; 1103e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 1104e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe ret = pthread_detach(td->verify_threads[i]); 1105e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (ret) { 1106e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe log_err("fio: async verify thread detach failed: %s\n", 1107e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe strerror(ret)); 1108e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe break; 1109e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 1110e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->nr_verify_threads++; 1111e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 1112e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1113304a47c7d94f407cc72a87025679a67f02288447bart Van Assche pthread_attr_destroy(&attr); 1114304a47c7d94f407cc72a87025679a67f02288447bart Van Assche 1115e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (i != td->o.verify_async) { 1116e40823b10920f679d84f3f2222e319c168b1e7daJens Axboe log_err("fio: only %d verify threads started, exiting\n", i); 1117e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_thread_exit = 1; 1118e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe write_barrier(); 1119e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_broadcast(&td->verify_cond); 1120e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe return 1; 1121e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 1122e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1123e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe return 0; 1124e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe} 1125e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1126e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboevoid verify_async_exit(struct thread_data *td) 1127e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{ 1128e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_thread_exit = 1; 1129e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe write_barrier(); 1130e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_broadcast(&td->verify_cond); 1131e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1132e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_lock(&td->io_u_lock); 1133e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1134e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe while (td->nr_verify_threads) 1135e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_wait(&td->free_cond, &td->io_u_lock); 1136e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1137e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 1138e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe free(td->verify_threads); 1139e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_threads = NULL; 1140e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe} 1141