verify.c revision 2ecc1b57721e3cb72bbf558bc169c97037fe3d0a
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> 9e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 10e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe#include "fio.h" 114f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe#include "verify.h" 12e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe#include "smalloc.h" 13e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 14eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/md5.h" 15eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc64.h" 16eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc32.h" 17bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe#include "crc/crc32c.h" 18eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc16.h" 19eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc7.h" 20eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/sha256.h" 21eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/sha512.h" 227c353ceb3257b132f4c98326046b42201e070731Jens Axboe#include "crc/sha1.h" 23cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 2490059d65bde4804e4da07401ad6902c1d956b592Jens Axboestatic void fill_random_bytes(struct thread_data *td, void *p, unsigned int len) 25e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 26e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe unsigned int todo; 274c5946c6606abc87ba7e2bfc57a5030d19b6d4d5Jens Axboe int r; 28e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 29e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe while (len) { 304c5946c6606abc87ba7e2bfc57a5030d19b6d4d5Jens Axboe r = os_random_long(&td->verify_state); 31e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 32e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe /* 33e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * lrand48_r seems to be broken and only fill the bottom 34e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * 32-bits, even on 64-bit archs with 64-bit longs 35e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe */ 36e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe todo = sizeof(r); 37e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe if (todo > len) 38e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe todo = len; 39e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 40e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe memcpy(p, &r, todo); 41e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 42e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe len -= todo; 43e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe p += todo; 44e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe } 45e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 46e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 4790059d65bde4804e4da07401ad6902c1d956b592Jens Axboestatic void fill_pattern(struct thread_data *td, void *p, unsigned int len) 4890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe{ 4990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe switch (td->o.verify_pattern_bytes) { 5090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe case 0: 51bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill random bytes len=%u\n", len); 5290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe fill_random_bytes(td, p, len); 5390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe break; 5490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe case 1: 55bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill verify pattern b=0 len=%u\n", len); 560e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran memset(p, td->o.verify_pattern[0], len); 5790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe break; 580e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran default: { 590e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran unsigned int i = 0, size = 0; 6090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe unsigned char *b = p; 6190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe 62bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill verify pattern b=%d len=%u\n", 63bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe td->o.verify_pattern_bytes, len); 64bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 6590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe while (i < len) { 660e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran size = td->o.verify_pattern_bytes; 670e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran if (size > (len - i)) 680e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran size = len - i; 690e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran memcpy(b+i, td->o.verify_pattern, size); 700e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran i += size; 7190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe } 7290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe break; 7390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe } 7490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe } 7590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe} 7690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe 774764aec9fe5988281bdc114c13ac771fb16713ccJens Axboestatic void memswp(void *buf1, void *buf2, unsigned int len) 78546a9142511875524850ac92776184fd9fb7196eShawn Lewis{ 79dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis char swap[200]; 80dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis 81dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis assert(len <= sizeof(swap)); 8290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe 83546a9142511875524850ac92776184fd9fb7196eShawn Lewis memcpy(&swap, buf1, len); 84546a9142511875524850ac92776184fd9fb7196eShawn Lewis memcpy(buf1, buf2, len); 85546a9142511875524850ac92776184fd9fb7196eShawn Lewis memcpy(buf2, &swap, len); 86546a9142511875524850ac92776184fd9fb7196eShawn Lewis} 87546a9142511875524850ac92776184fd9fb7196eShawn Lewis 88e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void hexdump(void *buffer, int len) 89e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 90e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe unsigned char *p = buffer; 91e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe int i; 92e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 93e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe for (i = 0; i < len; i++) 946d86144dd10b05e8b82e9b895c35dd778e5e71abJens Axboe log_info("%02x", p[i]); 956d86144dd10b05e8b82e9b895c35dd778e5e71abJens Axboe log_info("\n"); 96e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 97e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 98d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe/* 998767783245faac99a7e1c330a1d6536e579c8402Jens Axboe * Prepare for seperation of verify_header and checksum header 1008767783245faac99a7e1c330a1d6536e579c8402Jens Axboe */ 101546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic inline unsigned int __hdr_size(int verify_type) 1028767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{ 1035921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe unsigned int len = len; 1048767783245faac99a7e1c330a1d6536e579c8402Jens Axboe 105546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe switch (verify_type) { 106546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_NONE: 107546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_NULL: 108546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = 0; 109546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 110546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_MD5: 111546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_md5); 112546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 113546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC64: 114546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc64); 115546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 116bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe case VERIFY_CRC32C: 117546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC32: 1183845591fadea480177223e28c9d1c03642d34f0eJens Axboe case VERIFY_CRC32C_INTEL: 119546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc32); 120546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 121546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC16: 122546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc16); 123546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 124546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC7: 125546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc7); 126546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 127546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_SHA256: 128546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_sha256); 129546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 130546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_SHA512: 131546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_sha512); 132546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 1337437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis case VERIFY_META: 1347437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis len = sizeof(struct vhdr_meta); 1357437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis break; 1367c353ceb3257b132f4c98326046b42201e070731Jens Axboe case VERIFY_SHA1: 1377c353ceb3257b132f4c98326046b42201e070731Jens Axboe len = sizeof(struct vhdr_sha1); 1387c353ceb3257b132f4c98326046b42201e070731Jens Axboe break; 139546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe default: 140546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe log_err("fio: unknown verify header!\n"); 141546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe assert(0); 142546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe } 143546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 144546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe return len + sizeof(struct verify_header); 1458767783245faac99a7e1c330a1d6536e579c8402Jens Axboe} 1468767783245faac99a7e1c330a1d6536e579c8402Jens Axboe 1478767783245faac99a7e1c330a1d6536e579c8402Jens Axboestatic inline unsigned int hdr_size(struct verify_header *hdr) 1488767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{ 149546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe return __hdr_size(hdr->verify_type); 150546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe} 151546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 152546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic void *hdr_priv(struct verify_header *hdr) 153546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe{ 154546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe void *priv = hdr; 155546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 156546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe return priv + sizeof(struct verify_header); 1578767783245faac99a7e1c330a1d6536e579c8402Jens Axboe} 1588767783245faac99a7e1c330a1d6536e579c8402Jens Axboe 1598767783245faac99a7e1c330a1d6536e579c8402Jens Axboe/* 160d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe * Return data area 'header_num' 161d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe */ 162d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboestatic inline void *io_u_verify_off(struct verify_header *hdr, 1635ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe struct io_u *io_u, unsigned char header_num) 164d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe{ 1658767783245faac99a7e1c330a1d6536e579c8402Jens Axboe return io_u->buf + header_num * hdr->len + hdr_size(hdr); 166d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe} 167d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe 1687437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic int verify_io_u_meta(struct verify_header *hdr, struct thread_data *td, 1695ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe struct io_u *io_u, unsigned int header_num) 1707437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{ 1717437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis struct vhdr_meta *vh = hdr_priv(hdr); 1727437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 173bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "meta verify io_u %p, len %u\n", io_u, hdr->len); 174bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 1757437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis if (vh->offset != io_u->offset + header_num * td->o.verify_interval) { 1767437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis log_err("meta: verify failed at %llu/%u\n", 1775ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe io_u->offset + header_num * hdr->len, hdr->len); 1789fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 1797437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis } 1807437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 1817437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis return 0; 1827437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis} 1837437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 184cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic int verify_io_u_sha512(struct verify_header *hdr, struct io_u *io_u, 185cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe unsigned int header_num) 186cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 187cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe void *p = io_u_verify_off(hdr, io_u, header_num); 188546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha512 *vh = hdr_priv(hdr); 189cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe uint8_t sha512[128]; 190cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe struct sha512_ctx sha512_ctx = { 191cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe .buf = sha512, 192cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 193cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 194bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "sha512 verify io_u %p, len %u\n", io_u, hdr->len); 195bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 196cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha512_init(&sha512_ctx); 1978767783245faac99a7e1c330a1d6536e579c8402Jens Axboe sha512_update(&sha512_ctx, p, hdr->len - hdr_size(hdr)); 198cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 199546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (memcmp(vh->sha512, sha512_ctx.buf, sizeof(sha512))) { 200cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe log_err("sha512: verify failed at %llu/%u\n", 2015ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe io_u->offset + header_num * hdr->len, hdr->len); 202546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe hexdump(vh->sha512, sizeof(vh->sha512)); 203cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe hexdump(sha512_ctx.buf, sizeof(sha512)); 2049fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 205cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe } 206cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 207cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe return 0; 208cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 209cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 210cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic int verify_io_u_sha256(struct verify_header *hdr, struct io_u *io_u, 211cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe unsigned int header_num) 212cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 213cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe void *p = io_u_verify_off(hdr, io_u, header_num); 214546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha256 *vh = hdr_priv(hdr); 215cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe uint8_t sha256[128]; 216cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe struct sha256_ctx sha256_ctx = { 217cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe .buf = sha256, 218cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 219cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 220bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "sha256 verify io_u %p, len %u\n", io_u, hdr->len); 221bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 222cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha256_init(&sha256_ctx); 2238767783245faac99a7e1c330a1d6536e579c8402Jens Axboe sha256_update(&sha256_ctx, p, hdr->len - hdr_size(hdr)); 224cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 225546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (memcmp(vh->sha256, sha256_ctx.buf, sizeof(sha256))) { 226cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe log_err("sha256: verify failed at %llu/%u\n", 2275ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe io_u->offset + header_num * hdr->len, hdr->len); 228546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe hexdump(vh->sha256, sizeof(vh->sha256)); 229cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe hexdump(sha256_ctx.buf, sizeof(sha256)); 2309fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 231cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe } 232cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 233cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe return 0; 234cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 235cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 2367c353ceb3257b132f4c98326046b42201e070731Jens Axboestatic int verify_io_u_sha1(struct verify_header *hdr, struct io_u *io_u, 2377c353ceb3257b132f4c98326046b42201e070731Jens Axboe unsigned int header_num) 2387c353ceb3257b132f4c98326046b42201e070731Jens Axboe{ 2397c353ceb3257b132f4c98326046b42201e070731Jens Axboe void *p = io_u_verify_off(hdr, io_u, header_num); 2407c353ceb3257b132f4c98326046b42201e070731Jens Axboe struct vhdr_sha1 *vh = hdr_priv(hdr); 2417c353ceb3257b132f4c98326046b42201e070731Jens Axboe uint32_t sha1[5]; 2427c353ceb3257b132f4c98326046b42201e070731Jens Axboe struct sha1_ctx sha1_ctx = { 2437c353ceb3257b132f4c98326046b42201e070731Jens Axboe .H = sha1, 2447c353ceb3257b132f4c98326046b42201e070731Jens Axboe }; 2457c353ceb3257b132f4c98326046b42201e070731Jens Axboe 2467c353ceb3257b132f4c98326046b42201e070731Jens Axboe dprint(FD_VERIFY, "sha1 verify io_u %p, len %u\n", io_u, hdr->len); 2477c353ceb3257b132f4c98326046b42201e070731Jens Axboe 2487c353ceb3257b132f4c98326046b42201e070731Jens Axboe sha1_init(&sha1_ctx); 2497c353ceb3257b132f4c98326046b42201e070731Jens Axboe sha1_update(&sha1_ctx, p, hdr->len - hdr_size(hdr)); 2507c353ceb3257b132f4c98326046b42201e070731Jens Axboe 2517c353ceb3257b132f4c98326046b42201e070731Jens Axboe if (memcmp(vh->sha1, sha1_ctx.H, sizeof(sha1))) { 2527c353ceb3257b132f4c98326046b42201e070731Jens Axboe log_err("sha1: verify failed at %llu/%u\n", 2537c353ceb3257b132f4c98326046b42201e070731Jens Axboe io_u->offset + header_num * hdr->len, hdr->len); 2547c353ceb3257b132f4c98326046b42201e070731Jens Axboe hexdump(vh->sha1, sizeof(vh->sha1)); 2557c353ceb3257b132f4c98326046b42201e070731Jens Axboe hexdump(sha1_ctx.H, sizeof(sha1)); 2567c353ceb3257b132f4c98326046b42201e070731Jens Axboe return EILSEQ; 2577c353ceb3257b132f4c98326046b42201e070731Jens Axboe } 2587c353ceb3257b132f4c98326046b42201e070731Jens Axboe 2597c353ceb3257b132f4c98326046b42201e070731Jens Axboe return 0; 2607c353ceb3257b132f4c98326046b42201e070731Jens Axboe} 2617c353ceb3257b132f4c98326046b42201e070731Jens Axboe 2623f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_crc7(struct verify_header *hdr, struct io_u *io_u, 2635ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe unsigned char header_num) 2641e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{ 265d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe void *p = io_u_verify_off(hdr, io_u, header_num); 266546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc7 *vh = hdr_priv(hdr); 2671e154bdbf14a1d352117aea057035235b66f0381Jens Axboe unsigned char c; 2681e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 269bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "crc7 verify io_u %p, len %u\n", io_u, hdr->len); 270bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 2718767783245faac99a7e1c330a1d6536e579c8402Jens Axboe c = crc7(p, hdr->len - hdr_size(hdr)); 2721e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 273546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (c != vh->crc7) { 2743f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("crc7: verify failed at %llu/%u\n", 2755ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe io_u->offset + header_num * hdr->len, hdr->len); 276546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe log_err("crc7: wanted %x, got %x\n", vh->crc7, c); 2779fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 2781e154bdbf14a1d352117aea057035235b66f0381Jens Axboe } 2791e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 2801e154bdbf14a1d352117aea057035235b66f0381Jens Axboe return 0; 2811e154bdbf14a1d352117aea057035235b66f0381Jens Axboe} 2821e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 2833f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_crc16(struct verify_header *hdr, struct io_u *io_u, 2845ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe unsigned int header_num) 285969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{ 286d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe void *p = io_u_verify_off(hdr, io_u, header_num); 287546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc16 *vh = hdr_priv(hdr); 288969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe unsigned short c; 289969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 290bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "crc16 verify io_u %p, len %u\n", io_u, hdr->len); 291bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 2928767783245faac99a7e1c330a1d6536e579c8402Jens Axboe c = crc16(p, hdr->len - hdr_size(hdr)); 293969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 294546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (c != vh->crc16) { 2953f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("crc16: verify failed at %llu/%u\n", 2965ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe io_u->offset + header_num * hdr->len, hdr->len); 297546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe log_err("crc16: wanted %x, got %x\n", vh->crc16, c); 2989fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 299969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe } 300969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 301969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe return 0; 302969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe} 303969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 3043f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_crc64(struct verify_header *hdr, struct io_u *io_u, 3055ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe unsigned int header_num) 306d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{ 307d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe void *p = io_u_verify_off(hdr, io_u, header_num); 308546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc64 *vh = hdr_priv(hdr); 309d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe unsigned long long c; 310d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 311bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "crc64 verify io_u %p, len %u\n", io_u, hdr->len); 312bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 3138767783245faac99a7e1c330a1d6536e579c8402Jens Axboe c = crc64(p, hdr->len - hdr_size(hdr)); 314d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 315546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (c != vh->crc64) { 3163f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("crc64: verify failed at %llu/%u\n", 3173f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis io_u->offset + header_num * hdr->len, 3183f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis hdr->len); 3195ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe log_err("crc64: wanted %llx, got %llx\n", 3205ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe (unsigned long long) vh->crc64, c); 3219fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 322d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe } 323d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 324d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe return 0; 325d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe} 326d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 3273f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_crc32(struct verify_header *hdr, struct io_u *io_u, 3285ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe unsigned int header_num) 329e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 330d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe void *p = io_u_verify_off(hdr, io_u, header_num); 331546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 332546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe uint32_t c; 333e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 334bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "crc32 verify io_u %p, len %u\n", io_u, hdr->len); 335bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 3368767783245faac99a7e1c330a1d6536e579c8402Jens Axboe c = crc32(p, hdr->len - hdr_size(hdr)); 337e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 338546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (c != vh->crc32) { 3393f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("crc32: verify failed at %llu/%u\n", 3405ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe io_u->offset + header_num * hdr->len, hdr->len); 341546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe log_err("crc32: wanted %x, got %x\n", vh->crc32, c); 3429fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 343e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe } 344e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 345e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe return 0; 346e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 347e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 348bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboestatic int verify_io_u_crc32c(struct verify_header *hdr, struct io_u *io_u, 349bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe unsigned int header_num) 350bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{ 351bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe void *p = io_u_verify_off(hdr, io_u, header_num); 352bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 353bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe uint32_t c; 354bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 355bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe dprint(FD_VERIFY, "crc32c verify io_u %p, len %u\n", io_u, hdr->len); 356bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 3573845591fadea480177223e28c9d1c03642d34f0eJens Axboe if (hdr->verify_type == VERIFY_CRC32C_INTEL) 3583845591fadea480177223e28c9d1c03642d34f0eJens Axboe c = crc32c_intel(p, hdr->len - hdr_size(hdr)); 3593845591fadea480177223e28c9d1c03642d34f0eJens Axboe else 3603845591fadea480177223e28c9d1c03642d34f0eJens Axboe c = crc32c(p, hdr->len - hdr_size(hdr)); 361bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 362bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe if (c != vh->crc32) { 363bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe log_err("crc32c: verify failed at %llu/%u\n", 364bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe io_u->offset + header_num * hdr->len, hdr->len); 365bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe log_err("crc32c: wanted %x, got %x\n", vh->crc32, c); 3669fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 367bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe } 368bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 369bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe return 0; 370bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe} 371bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 3723f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_md5(struct verify_header *hdr, struct io_u *io_u, 3735ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe unsigned int header_num) 374e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 375d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe void *p = io_u_verify_off(hdr, io_u, header_num); 376546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_md5 *vh = hdr_priv(hdr); 3778c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe uint32_t hash[MD5_HASH_WORDS]; 3788c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe struct md5_ctx md5_ctx = { 3798c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe .hash = hash, 3808c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe }; 381e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 382bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "md5 verify io_u %p, len %u\n", io_u, hdr->len); 383bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 38461f821f16cf27d8742e09b3a137c933cd0085e9bJens Axboe md5_init(&md5_ctx); 3858767783245faac99a7e1c330a1d6536e579c8402Jens Axboe md5_update(&md5_ctx, p, hdr->len - hdr_size(hdr)); 386e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 387546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (memcmp(vh->md5_digest, md5_ctx.hash, sizeof(hash))) { 3883f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("md5: verify failed at %llu/%u\n", 3895ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe io_u->offset + header_num * hdr->len, hdr->len); 390546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe hexdump(vh->md5_digest, sizeof(vh->md5_digest)); 3918c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe hexdump(md5_ctx.hash, sizeof(hash)); 3929fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 393e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe } 394e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 395e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe return 0; 396e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 397e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 3983f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboestatic unsigned int hweight8(unsigned int w) 3993f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe{ 4003f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe unsigned int res = w - ((w >> 1) & 0x55); 4013f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe 4023f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe res = (res & 0x33) + ((res >> 2) & 0x33); 4033f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe return (res + (res >> 4)) & 0x0F; 4043f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe} 4053f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe 4060e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandranint verify_io_u_pattern(char *pattern, unsigned long pattern_size, 4075ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe char *buf, unsigned int len, unsigned int mod) 408a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis{ 409a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis unsigned int i; 410a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis 411a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis for (i = 0; i < len; i++) { 4120e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran if (buf[i] != pattern[mod]) { 4133f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe unsigned int bits; 4143f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe 4150e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran bits = hweight8(buf[i] ^ pattern[mod]); 4163f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe log_err("fio: got pattern %x, wanted %x. Bad bits %d\n", 4170e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran buf[i], pattern[mod], bits); 4183f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe log_err("fio: bad pattern block offset %u\n", i); 4199fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 4203f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe } 421a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis mod++; 422a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis if (mod == pattern_size) 423a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis mod = 0; 424a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis } 425a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis 426a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis return 0; 427a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis} 428a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis 429e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe/* 430e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe * Push IO verification to a separate thread 431e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe */ 432e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_io_u_async(struct thread_data *td, struct io_u *io_u) 433e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{ 434e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (io_u->file) 435e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe put_file_log(td, io_u->file); 436e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 437e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe io_u->file = NULL; 438e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 439e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_lock(&td->io_u_lock); 4400c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran 4410c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran if (io_u->flags & IO_U_F_IN_CUR_DEPTH) { 4420c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran td->cur_depth--; 4430c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran io_u->flags &= ~IO_U_F_IN_CUR_DEPTH; 4440c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran } 445e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe flist_del(&io_u->list); 446e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe flist_add_tail(&io_u->list, &td->verify_list); 4472ecc1b57721e3cb72bbf558bc169c97037fe3d0aJens Axboe io_u->flags |= IO_U_F_FREE_DEF; 448e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 449e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 450e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_signal(&td->verify_cond); 451e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe return 0; 452e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe} 453e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 45436690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboeint verify_io_u(struct thread_data *td, struct io_u *io_u) 455e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 4563f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis struct verify_header *hdr; 457a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis unsigned int hdr_size, hdr_inc, hdr_num = 0; 45895646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe void *p; 459e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe int ret; 460e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 4611dcc049824b840df1ee0ef5d019fffa4037e1bb0Shawn Lewis if (td->o.verify == VERIFY_NULL || io_u->ddir != DDIR_READ) 46236690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe return 0; 46336690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe 4643f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis hdr_inc = io_u->buflen; 465a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe if (td->o.verify_interval) 466a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe hdr_inc = td->o.verify_interval; 467e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 468a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe ret = 0; 4695ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe for (p = io_u->buf; p < io_u->buf + io_u->buflen; 4705ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe p += hdr_inc, hdr_num++) { 471a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe if (ret && td->o.verify_fatal) { 472a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe td->terminate = 1; 473a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe break; 474a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe } 475a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis hdr_size = __hdr_size(td->o.verify); 476a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe if (td->o.verify_offset) 477a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis memswp(p, p + td->o.verify_offset, hdr_size); 47895646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe hdr = p; 479e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 4803f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe if (hdr->fio_magic != FIO_HDR_MAGIC) { 4813f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe log_err("Bad verify header %x\n", hdr->fio_magic); 4829fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 4833f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe } 4843f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe 485e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis if (td->o.verify_pattern_bytes) { 486bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "pattern verify io_u %p, len %u\n", 487bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 488e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis ret = verify_io_u_pattern(td->o.verify_pattern, 4890e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran td->o.verify_pattern_bytes, 4900e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran p + hdr_size, 4910e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran hdr_inc - hdr_size, 4920e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran hdr_size % td->o.verify_pattern_bytes); 493e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran /* 494e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran * Also verify the meta data, if applicable 495e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran */ 496e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran if (hdr->verify_type == VERIFY_META) 497e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran ret |= verify_io_u_meta(hdr, td, io_u, hdr_num); 498e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran 499e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis if (ret) 500e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis log_err("fio: verify failed at %llu/%u\n", 501e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis io_u->offset + hdr_num * hdr->len, 502e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis hdr->len); 503e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis continue; 504e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis } 505e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis 5063f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis switch (hdr->verify_type) { 5073f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_MD5: 5083f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis ret = verify_io_u_md5(hdr, io_u, hdr_num); 5093f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 5103f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC64: 5113f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis ret = verify_io_u_crc64(hdr, io_u, hdr_num); 5123f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 513bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe case VERIFY_CRC32C: 5143845591fadea480177223e28c9d1c03642d34f0eJens Axboe case VERIFY_CRC32C_INTEL: 515bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe ret = verify_io_u_crc32c(hdr, io_u, hdr_num); 516bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe break; 5173f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC32: 5183f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis ret = verify_io_u_crc32(hdr, io_u, hdr_num); 5193f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 5203f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC16: 5213f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis ret = verify_io_u_crc16(hdr, io_u, hdr_num); 5223f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 5233f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC7: 5243f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis ret = verify_io_u_crc7(hdr, io_u, hdr_num); 5253f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 526cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe case VERIFY_SHA256: 527cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe ret = verify_io_u_sha256(hdr, io_u, hdr_num); 528cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe break; 529cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe case VERIFY_SHA512: 530cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe ret = verify_io_u_sha512(hdr, io_u, hdr_num); 531cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe break; 5327437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis case VERIFY_META: 5337437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis ret = verify_io_u_meta(hdr, td, io_u, hdr_num); 5347437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis break; 5357c353ceb3257b132f4c98326046b42201e070731Jens Axboe case VERIFY_SHA1: 5367c353ceb3257b132f4c98326046b42201e070731Jens Axboe ret = verify_io_u_sha1(hdr, io_u, hdr_num); 5377c353ceb3257b132f4c98326046b42201e070731Jens Axboe break; 5383f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis default: 5393f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("Bad verify type %u\n", hdr->verify_type); 540d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe ret = EINVAL; 5413f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis } 5423f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis } 543a7dfe862c2e3fe72b8db6a6e67302048d3731c6dJens Axboe 544a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe return ret; 545e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 546e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 5477437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic void fill_meta(struct verify_header *hdr, struct thread_data *td, 5485ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe struct io_u *io_u, unsigned int header_num) 5497437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{ 5507437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis struct vhdr_meta *vh = hdr_priv(hdr); 5517437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 5527437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->thread = td->thread_number; 5537437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 5547437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->time_sec = io_u->start_time.tv_sec; 5557437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->time_usec = io_u->start_time.tv_usec; 5567437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 5577437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->numberio = td->io_issues[DDIR_WRITE]; 5587437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 5597437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->offset = io_u->offset + header_num * td->o.verify_interval; 5607437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis} 5617437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 562cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha512(struct verify_header *hdr, void *p, unsigned int len) 563cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 564546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha512 *vh = hdr_priv(hdr); 565cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe struct sha512_ctx sha512_ctx = { 566546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe .buf = vh->sha512, 567cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 568cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 569cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha512_init(&sha512_ctx); 570cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha512_update(&sha512_ctx, p, len); 571cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 572cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 573cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha256(struct verify_header *hdr, void *p, unsigned int len) 574cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 575546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha256 *vh = hdr_priv(hdr); 576cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe struct sha256_ctx sha256_ctx = { 577546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe .buf = vh->sha256, 578cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 579cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 580cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha256_init(&sha256_ctx); 581cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha256_update(&sha256_ctx, p, len); 582cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 583cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 5847c353ceb3257b132f4c98326046b42201e070731Jens Axboestatic void fill_sha1(struct verify_header *hdr, void *p, unsigned int len) 5857c353ceb3257b132f4c98326046b42201e070731Jens Axboe{ 5867c353ceb3257b132f4c98326046b42201e070731Jens Axboe struct vhdr_sha1 *vh = hdr_priv(hdr); 5877c353ceb3257b132f4c98326046b42201e070731Jens Axboe struct sha1_ctx sha1_ctx = { 5887c353ceb3257b132f4c98326046b42201e070731Jens Axboe .H = vh->sha1, 5897c353ceb3257b132f4c98326046b42201e070731Jens Axboe }; 5907c353ceb3257b132f4c98326046b42201e070731Jens Axboe 5917c353ceb3257b132f4c98326046b42201e070731Jens Axboe sha1_init(&sha1_ctx); 5927c353ceb3257b132f4c98326046b42201e070731Jens Axboe sha1_update(&sha1_ctx, p, len); 5937c353ceb3257b132f4c98326046b42201e070731Jens Axboe} 5947c353ceb3257b132f4c98326046b42201e070731Jens Axboe 5951e154bdbf14a1d352117aea057035235b66f0381Jens Axboestatic void fill_crc7(struct verify_header *hdr, void *p, unsigned int len) 5961e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{ 597546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc7 *vh = hdr_priv(hdr); 598546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 599546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe vh->crc7 = crc7(p, len); 6001e154bdbf14a1d352117aea057035235b66f0381Jens Axboe} 6011e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 602969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboestatic void fill_crc16(struct verify_header *hdr, void *p, unsigned int len) 603969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{ 604546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc16 *vh = hdr_priv(hdr); 605546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 606546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe vh->crc16 = crc16(p, len); 607969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe} 608969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 609e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_crc32(struct verify_header *hdr, void *p, unsigned int len) 610e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 611546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 612546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 613546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe vh->crc32 = crc32(p, len); 614e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 615e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 616bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboestatic void fill_crc32c(struct verify_header *hdr, void *p, unsigned int len) 617bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{ 618bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 619bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 6203845591fadea480177223e28c9d1c03642d34f0eJens Axboe if (hdr->verify_type == VERIFY_CRC32C_INTEL) 6213845591fadea480177223e28c9d1c03642d34f0eJens Axboe vh->crc32 = crc32c_intel(p, len); 6223845591fadea480177223e28c9d1c03642d34f0eJens Axboe else 6233845591fadea480177223e28c9d1c03642d34f0eJens Axboe vh->crc32 = crc32c(p, len); 624bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe} 625bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 626d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboestatic void fill_crc64(struct verify_header *hdr, void *p, unsigned int len) 627d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{ 628546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc64 *vh = hdr_priv(hdr); 629546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 630546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe vh->crc64 = crc64(p, len); 631d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe} 632d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 633e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_md5(struct verify_header *hdr, void *p, unsigned int len) 634e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 635546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_md5 *vh = hdr_priv(hdr); 6368c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe struct md5_ctx md5_ctx = { 637546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe .hash = (uint32_t *) vh->md5_digest, 6388c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe }; 639e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 64061f821f16cf27d8742e09b3a137c933cd0085e9bJens Axboe md5_init(&md5_ctx); 641e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe md5_update(&md5_ctx, p, len); 642e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 643e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 644e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe/* 645e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * fill body of io_u->buf with random data and add a header with the 646e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * crc32 or md5 sum of that data. 647e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe */ 648e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboevoid populate_verify_io_u(struct thread_data *td, struct io_u *io_u) 649e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 650baefa9beacca430b8e3275c07d2f46ef14654468Jens Axboe struct verify_header *hdr; 65195646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe void *p = io_u->buf, *data; 6527437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis unsigned int hdr_inc, data_len, header_num = 0; 653e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 6549cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe if (td->o.verify == VERIFY_NULL) 6559cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe return; 6569cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe 65790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe fill_pattern(td, p, io_u->buflen); 658546a9142511875524850ac92776184fd9fb7196eShawn Lewis 659546a9142511875524850ac92776184fd9fb7196eShawn Lewis hdr_inc = io_u->buflen; 660a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe if (td->o.verify_interval) 661a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe hdr_inc = td->o.verify_interval; 662baefa9beacca430b8e3275c07d2f46ef14654468Jens Axboe 6635ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe for (; p < io_u->buf + io_u->buflen; p += hdr_inc) { 66495646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe hdr = p; 6653f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis 6663f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis hdr->fio_magic = FIO_HDR_MAGIC; 6673f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis hdr->verify_type = td->o.verify; 668546a9142511875524850ac92776184fd9fb7196eShawn Lewis hdr->len = hdr_inc; 6698767783245faac99a7e1c330a1d6536e579c8402Jens Axboe data_len = hdr_inc - hdr_size(hdr); 6703f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis 6718767783245faac99a7e1c330a1d6536e579c8402Jens Axboe data = p + hdr_size(hdr); 6723f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis switch (td->o.verify) { 6733f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_MD5: 674bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill md5 io_u %p, len %u\n", 675bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 6763f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis fill_md5(hdr, data, data_len); 6773f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 6783f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC64: 679bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill crc64 io_u %p, len %u\n", 680bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 6813f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis fill_crc64(hdr, data, data_len); 6823f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 683bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe case VERIFY_CRC32C: 6843845591fadea480177223e28c9d1c03642d34f0eJens Axboe case VERIFY_CRC32C_INTEL: 685bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe dprint(FD_VERIFY, "fill crc32c io_u %p, len %u\n", 686bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe io_u, hdr->len); 687bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe fill_crc32c(hdr, data, data_len); 688bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe break; 6893f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC32: 690bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill crc32 io_u %p, len %u\n", 691bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 6923f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis fill_crc32(hdr, data, data_len); 6933f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 6943f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC16: 695bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill crc16 io_u %p, len %u\n", 696bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 6973f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis fill_crc16(hdr, data, data_len); 6983f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 6993f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC7: 700bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill crc7 io_u %p, len %u\n", 701bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 7023f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis fill_crc7(hdr, data, data_len); 7033f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 704cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe case VERIFY_SHA256: 705bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill sha256 io_u %p, len %u\n", 706bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 707cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe fill_sha256(hdr, data, data_len); 708cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe break; 709cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe case VERIFY_SHA512: 710bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill sha512 io_u %p, len %u\n", 711bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 712cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe fill_sha512(hdr, data, data_len); 713cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe break; 7147437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis case VERIFY_META: 715bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill meta io_u %p, len %u\n", 716bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 7177437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis fill_meta(hdr, td, io_u, header_num); 7187437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis break; 7197c353ceb3257b132f4c98326046b42201e070731Jens Axboe case VERIFY_SHA1: 7207c353ceb3257b132f4c98326046b42201e070731Jens Axboe dprint(FD_VERIFY, "fill sha1 io_u %p, len %u\n", 7217c353ceb3257b132f4c98326046b42201e070731Jens Axboe io_u, hdr->len); 7227c353ceb3257b132f4c98326046b42201e070731Jens Axboe fill_sha1(hdr, data, data_len); 7237c353ceb3257b132f4c98326046b42201e070731Jens Axboe break; 7243f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis default: 7253f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("fio: bad verify type: %d\n", td->o.verify); 7263f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis assert(0); 7273f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis } 728a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe if (td->o.verify_offset) 7298767783245faac99a7e1c330a1d6536e579c8402Jens Axboe memswp(p, p + td->o.verify_offset, hdr_size(hdr)); 7307437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis header_num++; 731e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe } 732e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 733e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 734e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboeint get_next_verify(struct thread_data *td, struct io_u *io_u) 735e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 7368de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe struct io_piece *ipo = NULL; 737e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 738d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe /* 739d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe * this io_u is from a requeue, we already filled the offsets 740d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe */ 741d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe if (io_u->file) 742d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe return 0; 743d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe 7448de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe if (!RB_EMPTY_ROOT(&td->io_hist_tree)) { 7458de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe struct rb_node *n = rb_first(&td->io_hist_tree); 746e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 7478de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe ipo = rb_entry(n, struct io_piece, rb_node); 7484b87898e8d76aaf05baec83077a11311c1447397Jens Axboe rb_erase(n, &td->io_hist_tree); 74901743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe } else if (!flist_empty(&td->io_hist_list)) { 75001743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe ipo = flist_entry(td->io_hist_list.next, struct io_piece, list); 75101743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe flist_del(&ipo->list); 7528de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe } 753e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 7548de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe if (ipo) { 755e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe io_u->offset = ipo->offset; 756e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe io_u->buflen = ipo->len; 75736167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe io_u->file = ipo->file; 75897af62cec418cd722fb43c6010d6430534e12353Jens Axboe 759d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (!fio_file_open(io_u->file)) { 76097af62cec418cd722fb43c6010d6430534e12353Jens Axboe int r = td_io_open_file(td, io_u->file); 76197af62cec418cd722fb43c6010d6430534e12353Jens Axboe 762bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe if (r) { 763bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "failed file %s open\n", 764bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u->file->file_name); 76597af62cec418cd722fb43c6010d6430534e12353Jens Axboe return 1; 766bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe } 76797af62cec418cd722fb43c6010d6430534e12353Jens Axboe } 76897af62cec418cd722fb43c6010d6430534e12353Jens Axboe 76997af62cec418cd722fb43c6010d6430534e12353Jens Axboe get_file(ipo->file); 770d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe assert(fio_file_open(io_u->file)); 771e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe io_u->ddir = DDIR_READ; 77236167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe io_u->xfer_buf = io_u->buf; 77336167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe io_u->xfer_buflen = io_u->buflen; 774e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe free(ipo); 775bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "get_next_verify: ret io_u %p\n", io_u); 776e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe return 0; 777e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe } 778e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 779bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "get_next_verify: empty\n"); 780e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe return 1; 781e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 782e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 783e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboestatic void *verify_async_thread(void *data) 784e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{ 785e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe struct thread_data *td = data; 786e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe struct io_u *io_u; 787e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe int ret = 0; 788e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 789e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (td->o.verify_cpumask_set && 790e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe fio_setaffinity(td->pid, td->o.verify_cpumask)) { 791e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe log_err("fio: failed setting verify thread affinity\n"); 792e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe goto done; 793e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 794e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 795e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe do { 796e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe FLIST_HEAD(list); 797e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe 798e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe read_barrier(); 799e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (td->verify_thread_exit) 800e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe break; 801e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 802e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_lock(&td->io_u_lock); 803e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 804e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe while (flist_empty(&td->verify_list) && 805e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe !td->verify_thread_exit) { 806b36e298b5bdfc31ffc9a4c14e94a9c5c748888b0Jens Axboe ret = pthread_cond_wait(&td->verify_cond, 807b36e298b5bdfc31ffc9a4c14e94a9c5c748888b0Jens Axboe &td->io_u_lock); 808e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (ret) { 809e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 810e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe break; 811e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 812e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 813e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 814e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe flist_splice_init(&td->verify_list, &list); 815e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 816e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe 817e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe if (flist_empty(&list)) 818e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe continue; 819e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 820e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe while (!flist_empty(&list)) { 821e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe io_u = flist_entry(list.next, struct io_u, list); 822e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe flist_del_init(&io_u->list); 823e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 824d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe ret = verify_io_u(td, io_u); 825e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe put_io_u(td, io_u); 826d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe if (!ret) 827d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe continue; 828d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe if (td->o.continue_on_error && 829d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe td_non_fatal_error(ret)) { 830d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe update_error_count(td, ret); 831d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe td_clear_error(td); 832d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe ret = 0; 833d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe } 834e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe } 835e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } while (!ret); 836e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 837d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe if (ret) { 838d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe td_verror(td, ret, "async_verify"); 839d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe td->terminate = 1; 840d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe } 841d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe 842e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboedone: 843e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_lock(&td->io_u_lock); 844e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->nr_verify_threads--; 845e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 846e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 847e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_signal(&td->free_cond); 848e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe return NULL; 849e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe} 850e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 851e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_async_init(struct thread_data *td) 852e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{ 853e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe int i, ret; 854e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 855e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_thread_exit = 0; 856e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 857e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_threads = malloc(sizeof(pthread_t) * td->o.verify_async); 858e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe for (i = 0; i < td->o.verify_async; i++) { 859e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe ret = pthread_create(&td->verify_threads[i], NULL, 860e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe verify_async_thread, td); 861e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (ret) { 862e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe log_err("fio: async verify creation failed: %s\n", 863e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe strerror(ret)); 864e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe break; 865e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 866e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe ret = pthread_detach(td->verify_threads[i]); 867e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (ret) { 868e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe log_err("fio: async verify thread detach failed: %s\n", 869e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe strerror(ret)); 870e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe break; 871e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 872e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->nr_verify_threads++; 873e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 874e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 875e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (i != td->o.verify_async) { 876e40823b10920f679d84f3f2222e319c168b1e7daJens Axboe log_err("fio: only %d verify threads started, exiting\n", i); 877e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_thread_exit = 1; 878e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe write_barrier(); 879e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_broadcast(&td->verify_cond); 880e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe return 1; 881e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 882e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 883e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe return 0; 884e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe} 885e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 886e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboevoid verify_async_exit(struct thread_data *td) 887e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{ 888e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_thread_exit = 1; 889e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe write_barrier(); 890e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_broadcast(&td->verify_cond); 891e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 892e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_lock(&td->io_u_lock); 893e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 894e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe while (td->nr_verify_threads) 895e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_wait(&td->free_cond, &td->io_u_lock); 896e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 897e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 898e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe free(td->verify_threads); 899e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_threads = NULL; 900e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe} 901