verify.c revision 936216f8cd8ae2261282453d82a2a8232bb4db45
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/* 160936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * Verify container, pass info to verify handlers and allow them to 161936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * pass info back in case of error 162936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe */ 163936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestruct vcont { 164936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe /* 165936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * Input 166936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe */ 167936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe struct io_u *io_u; 168936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe unsigned int hdr_num; 169936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe 170936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe /* 171936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * Output, only valid in case of error 172936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe */ 173936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe unsigned char *good_crc; 174936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe unsigned char *bad_crc; 175936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe unsigned int crc_len; 176936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe}; 177936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe 178936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe/* 179d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe * Return data area 'header_num' 180d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe */ 181936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic inline void *io_u_verify_off(struct verify_header *hdr, struct vcont *vc) 182d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe{ 183936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe return vc->io_u->buf + vc->hdr_num * hdr->len + hdr_size(hdr); 184d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe} 185d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe 1867437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic int verify_io_u_meta(struct verify_header *hdr, struct thread_data *td, 187936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe struct vcont *vc) 1887437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{ 1897437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis struct vhdr_meta *vh = hdr_priv(hdr); 190936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe struct io_u *io_u = vc->io_u; 1917437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 192bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "meta verify io_u %p, len %u\n", io_u, hdr->len); 193bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 194936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe if (vh->offset != io_u->offset + vc->hdr_num * td->o.verify_interval) { 1957437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis log_err("meta: verify failed at %llu/%u\n", 196936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe io_u->offset + vc->hdr_num * hdr->len, hdr->len); 1979fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 1987437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis } 1997437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 2007437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis return 0; 2017437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis} 2027437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 203936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha512(struct verify_header *hdr, struct vcont *vc) 204cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 205936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 206546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha512 *vh = hdr_priv(hdr); 207cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe uint8_t sha512[128]; 208cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe struct sha512_ctx sha512_ctx = { 209cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe .buf = sha512, 210cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 211cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 212936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "sha512 verify io_u %p, len %u\n", vc->io_u, hdr->len); 213bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 214cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha512_init(&sha512_ctx); 2158767783245faac99a7e1c330a1d6536e579c8402Jens Axboe sha512_update(&sha512_ctx, p, hdr->len - hdr_size(hdr)); 216cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 217546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (memcmp(vh->sha512, sha512_ctx.buf, sizeof(sha512))) { 218cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe log_err("sha512: verify failed at %llu/%u\n", 219936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe vc->io_u->offset + vc->hdr_num * hdr->len, hdr->len); 220546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe hexdump(vh->sha512, sizeof(vh->sha512)); 221cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe hexdump(sha512_ctx.buf, sizeof(sha512)); 2229fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 223cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe } 224cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 225cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe return 0; 226cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 227cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 228936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha256(struct verify_header *hdr, struct vcont *vc) 229cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 230936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 231546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha256 *vh = hdr_priv(hdr); 232bc77f56f79f6ae155e9eb26263ed686ef28b47ecJens Axboe uint8_t sha256[64]; 233cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe struct sha256_ctx sha256_ctx = { 234cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe .buf = sha256, 235cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 236cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 237936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "sha256 verify io_u %p, len %u\n", vc->io_u, hdr->len); 238bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 239cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha256_init(&sha256_ctx); 2408767783245faac99a7e1c330a1d6536e579c8402Jens Axboe sha256_update(&sha256_ctx, p, hdr->len - hdr_size(hdr)); 241cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 242546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (memcmp(vh->sha256, sha256_ctx.buf, sizeof(sha256))) { 243cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe log_err("sha256: verify failed at %llu/%u\n", 244936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe vc->io_u->offset + vc->hdr_num * hdr->len, hdr->len); 245546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe hexdump(vh->sha256, sizeof(vh->sha256)); 246cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe hexdump(sha256_ctx.buf, sizeof(sha256)); 2479fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 248cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe } 249cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 250cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe return 0; 251cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 252cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 253936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha1(struct verify_header *hdr, struct vcont *vc) 2547c353ceb3257b132f4c98326046b42201e070731Jens Axboe{ 255936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 2567c353ceb3257b132f4c98326046b42201e070731Jens Axboe struct vhdr_sha1 *vh = hdr_priv(hdr); 2577c353ceb3257b132f4c98326046b42201e070731Jens Axboe uint32_t sha1[5]; 2587c353ceb3257b132f4c98326046b42201e070731Jens Axboe struct sha1_ctx sha1_ctx = { 2597c353ceb3257b132f4c98326046b42201e070731Jens Axboe .H = sha1, 2607c353ceb3257b132f4c98326046b42201e070731Jens Axboe }; 2617c353ceb3257b132f4c98326046b42201e070731Jens Axboe 262936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "sha1 verify io_u %p, len %u\n", vc->io_u, hdr->len); 2637c353ceb3257b132f4c98326046b42201e070731Jens Axboe 2647c353ceb3257b132f4c98326046b42201e070731Jens Axboe sha1_init(&sha1_ctx); 2657c353ceb3257b132f4c98326046b42201e070731Jens Axboe sha1_update(&sha1_ctx, p, hdr->len - hdr_size(hdr)); 2667c353ceb3257b132f4c98326046b42201e070731Jens Axboe 2677c353ceb3257b132f4c98326046b42201e070731Jens Axboe if (memcmp(vh->sha1, sha1_ctx.H, sizeof(sha1))) { 2687c353ceb3257b132f4c98326046b42201e070731Jens Axboe log_err("sha1: verify failed at %llu/%u\n", 269936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe vc->io_u->offset + vc->hdr_num * hdr->len, hdr->len); 2707c353ceb3257b132f4c98326046b42201e070731Jens Axboe hexdump(vh->sha1, sizeof(vh->sha1)); 2717c353ceb3257b132f4c98326046b42201e070731Jens Axboe hexdump(sha1_ctx.H, sizeof(sha1)); 2727c353ceb3257b132f4c98326046b42201e070731Jens Axboe return EILSEQ; 2737c353ceb3257b132f4c98326046b42201e070731Jens Axboe } 2747c353ceb3257b132f4c98326046b42201e070731Jens Axboe 2757c353ceb3257b132f4c98326046b42201e070731Jens Axboe return 0; 2767c353ceb3257b132f4c98326046b42201e070731Jens Axboe} 2777c353ceb3257b132f4c98326046b42201e070731Jens Axboe 278936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc7(struct verify_header *hdr, struct vcont *vc) 2791e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{ 280936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 281546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc7 *vh = hdr_priv(hdr); 2821e154bdbf14a1d352117aea057035235b66f0381Jens Axboe unsigned char c; 2831e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 284936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "crc7 verify io_u %p, len %u\n", vc->io_u, hdr->len); 285bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 2868767783245faac99a7e1c330a1d6536e579c8402Jens Axboe c = crc7(p, hdr->len - hdr_size(hdr)); 2871e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 288546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (c != vh->crc7) { 2893f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("crc7: verify failed at %llu/%u\n", 290936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe vc->io_u->offset + vc->hdr_num * hdr->len, hdr->len); 291546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe log_err("crc7: wanted %x, got %x\n", vh->crc7, c); 2929fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 2931e154bdbf14a1d352117aea057035235b66f0381Jens Axboe } 2941e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 2951e154bdbf14a1d352117aea057035235b66f0381Jens Axboe return 0; 2961e154bdbf14a1d352117aea057035235b66f0381Jens Axboe} 2971e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 298936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc16(struct verify_header *hdr, struct vcont *vc) 299969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{ 300936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 301546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc16 *vh = hdr_priv(hdr); 302969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe unsigned short c; 303969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 304936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "crc16 verify io_u %p, len %u\n", vc->io_u, hdr->len); 305bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 3068767783245faac99a7e1c330a1d6536e579c8402Jens Axboe c = crc16(p, hdr->len - hdr_size(hdr)); 307969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 308546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (c != vh->crc16) { 3093f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("crc16: verify failed at %llu/%u\n", 310936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe vc->io_u->offset + vc->hdr_num * hdr->len, hdr->len); 311546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe log_err("crc16: wanted %x, got %x\n", vh->crc16, c); 3129fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 313969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe } 314969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 315969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe return 0; 316969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe} 317969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 318936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc64(struct verify_header *hdr, struct vcont *vc) 319d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{ 320936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 321546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc64 *vh = hdr_priv(hdr); 322d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe unsigned long long c; 323d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 324936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "crc64 verify io_u %p, len %u\n", vc->io_u, hdr->len); 325bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 3268767783245faac99a7e1c330a1d6536e579c8402Jens Axboe c = crc64(p, hdr->len - hdr_size(hdr)); 327d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 328546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (c != vh->crc64) { 3293f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("crc64: verify failed at %llu/%u\n", 330936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe vc->io_u->offset + vc->hdr_num * hdr->len, 3313f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis hdr->len); 3325ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe log_err("crc64: wanted %llx, got %llx\n", 3335ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe (unsigned long long) vh->crc64, c); 3349fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 335d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe } 336d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 337d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe return 0; 338d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe} 339d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 340936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc32(struct verify_header *hdr, struct vcont *vc) 341e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 342936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 343546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 344546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe uint32_t c; 345e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 346936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "crc32 verify io_u %p, len %u\n", vc->io_u, hdr->len); 347bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 3488767783245faac99a7e1c330a1d6536e579c8402Jens Axboe c = crc32(p, hdr->len - hdr_size(hdr)); 349e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 350546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (c != vh->crc32) { 3513f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("crc32: verify failed at %llu/%u\n", 352936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe vc->io_u->offset + vc->hdr_num * hdr->len, hdr->len); 353546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe log_err("crc32: wanted %x, got %x\n", vh->crc32, c); 3549fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 355e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe } 356e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 357e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe return 0; 358e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 359e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 360936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc32c(struct verify_header *hdr, struct vcont *vc) 361bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{ 362936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 363bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 364bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe uint32_t c; 365bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 366936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "crc32c verify io_u %p, len %u\n", vc->io_u, hdr->len); 367bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 3683845591fadea480177223e28c9d1c03642d34f0eJens Axboe if (hdr->verify_type == VERIFY_CRC32C_INTEL) 3693845591fadea480177223e28c9d1c03642d34f0eJens Axboe c = crc32c_intel(p, hdr->len - hdr_size(hdr)); 3703845591fadea480177223e28c9d1c03642d34f0eJens Axboe else 3713845591fadea480177223e28c9d1c03642d34f0eJens Axboe c = crc32c(p, hdr->len - hdr_size(hdr)); 372bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 373bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe if (c != vh->crc32) { 374bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe log_err("crc32c: verify failed at %llu/%u\n", 375936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe vc->io_u->offset + vc->hdr_num * hdr->len, hdr->len); 376bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe log_err("crc32c: wanted %x, got %x\n", vh->crc32, c); 3779fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 378bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe } 379bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 380bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe return 0; 381bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe} 382bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 383936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_md5(struct verify_header *hdr, struct vcont *vc) 384e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 385936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 386546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_md5 *vh = hdr_priv(hdr); 3878c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe uint32_t hash[MD5_HASH_WORDS]; 3888c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe struct md5_ctx md5_ctx = { 3898c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe .hash = hash, 3908c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe }; 391e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 392936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "md5 verify io_u %p, len %u\n", vc->io_u, hdr->len); 393bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 39461f821f16cf27d8742e09b3a137c933cd0085e9bJens Axboe md5_init(&md5_ctx); 3958767783245faac99a7e1c330a1d6536e579c8402Jens Axboe md5_update(&md5_ctx, p, hdr->len - hdr_size(hdr)); 396e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 397546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (memcmp(vh->md5_digest, md5_ctx.hash, sizeof(hash))) { 3983f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("md5: verify failed at %llu/%u\n", 399936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe vc->io_u->offset + vc->hdr_num * hdr->len, hdr->len); 400546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe hexdump(vh->md5_digest, sizeof(vh->md5_digest)); 4018c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe hexdump(md5_ctx.hash, sizeof(hash)); 4029fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 403e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe } 404e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 405e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe return 0; 406e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 407e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 4083f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboestatic unsigned int hweight8(unsigned int w) 4093f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe{ 4103f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe unsigned int res = w - ((w >> 1) & 0x55); 4113f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe 4123f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe res = (res & 0x33) + ((res >> 2) & 0x33); 4133f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe return (res + (res >> 4)) & 0x0F; 4143f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe} 4153f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe 4160e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandranint verify_io_u_pattern(char *pattern, unsigned long pattern_size, 4175ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe char *buf, unsigned int len, unsigned int mod) 418a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis{ 419a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis unsigned int i; 420a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis 421a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis for (i = 0; i < len; i++) { 4220e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran if (buf[i] != pattern[mod]) { 4233f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe unsigned int bits; 4243f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe 4250e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran bits = hweight8(buf[i] ^ pattern[mod]); 4263f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe log_err("fio: got pattern %x, wanted %x. Bad bits %d\n", 4270e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran buf[i], pattern[mod], bits); 4283f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe log_err("fio: bad pattern block offset %u\n", i); 4299fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 4303f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe } 431a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis mod++; 432a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis if (mod == pattern_size) 433a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis mod = 0; 434a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis } 435a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis 436a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis return 0; 437a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis} 438a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis 439e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe/* 440e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe * Push IO verification to a separate thread 441e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe */ 442e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_io_u_async(struct thread_data *td, struct io_u *io_u) 443e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{ 444e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (io_u->file) 445e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe put_file_log(td, io_u->file); 446e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 447e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe io_u->file = NULL; 448e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 449e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_lock(&td->io_u_lock); 4500c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran 4510c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran if (io_u->flags & IO_U_F_IN_CUR_DEPTH) { 4520c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran td->cur_depth--; 4530c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran io_u->flags &= ~IO_U_F_IN_CUR_DEPTH; 4540c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran } 455e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe flist_del(&io_u->list); 456e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe flist_add_tail(&io_u->list, &td->verify_list); 4572ecc1b57721e3cb72bbf558bc169c97037fe3d0aJens Axboe io_u->flags |= IO_U_F_FREE_DEF; 458e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 459e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 460e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_signal(&td->verify_cond); 461e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe return 0; 462e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe} 463e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 46436690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboeint verify_io_u(struct thread_data *td, struct io_u *io_u) 465e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 4663f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis struct verify_header *hdr; 467a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis unsigned int hdr_size, hdr_inc, hdr_num = 0; 46895646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe void *p; 469e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe int ret; 470e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 4711dcc049824b840df1ee0ef5d019fffa4037e1bb0Shawn Lewis if (td->o.verify == VERIFY_NULL || io_u->ddir != DDIR_READ) 47236690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe return 0; 47336690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe 4743f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis hdr_inc = io_u->buflen; 475a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe if (td->o.verify_interval) 476a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe hdr_inc = td->o.verify_interval; 477e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 478a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe ret = 0; 4795ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe for (p = io_u->buf; p < io_u->buf + io_u->buflen; 4805ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe p += hdr_inc, hdr_num++) { 481936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe struct vcont vc; 482936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe 483a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe if (ret && td->o.verify_fatal) { 484a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe td->terminate = 1; 485a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe break; 486a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe } 487a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis hdr_size = __hdr_size(td->o.verify); 488a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe if (td->o.verify_offset) 489a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis memswp(p, p + td->o.verify_offset, hdr_size); 49095646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe hdr = p; 491e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 492936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe vc.io_u = io_u; 493936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe vc.hdr_num = hdr_num; 494936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe 4953f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe if (hdr->fio_magic != FIO_HDR_MAGIC) { 496b7a3e6616829c16ba11ff2d5f7c17a598e40dfebRadha Ramachandran log_err("Bad verify header %x at %llu\n", 497b7a3e6616829c16ba11ff2d5f7c17a598e40dfebRadha Ramachandran hdr->fio_magic, 498b7a3e6616829c16ba11ff2d5f7c17a598e40dfebRadha Ramachandran io_u->offset + hdr_num * hdr->len); 4999fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 5003f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe } 5013f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe 502e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis if (td->o.verify_pattern_bytes) { 503bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "pattern verify io_u %p, len %u\n", 504bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 505e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis ret = verify_io_u_pattern(td->o.verify_pattern, 5060e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran td->o.verify_pattern_bytes, 5070e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran p + hdr_size, 5080e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran hdr_inc - hdr_size, 5090e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran hdr_size % td->o.verify_pattern_bytes); 510e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran /* 511e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran * Also verify the meta data, if applicable 512e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran */ 513e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran if (hdr->verify_type == VERIFY_META) 514936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret |= verify_io_u_meta(hdr, td, &vc); 515e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran 516e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis if (ret) 517e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis log_err("fio: verify failed at %llu/%u\n", 518e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis io_u->offset + hdr_num * hdr->len, 519e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis hdr->len); 520e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis continue; 521e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis } 522e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis 5233f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis switch (hdr->verify_type) { 5243f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_MD5: 525936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_md5(hdr, &vc); 5263f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 5273f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC64: 528936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_crc64(hdr, &vc); 5293f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 530bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe case VERIFY_CRC32C: 5313845591fadea480177223e28c9d1c03642d34f0eJens Axboe case VERIFY_CRC32C_INTEL: 532936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_crc32c(hdr, &vc); 533bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe break; 5343f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC32: 535936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_crc32(hdr, &vc); 5363f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 5373f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC16: 538936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_crc16(hdr, &vc); 5393f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 5403f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC7: 541936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_crc7(hdr, &vc); 5423f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 543cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe case VERIFY_SHA256: 544936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_sha256(hdr, &vc); 545cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe break; 546cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe case VERIFY_SHA512: 547936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_sha512(hdr, &vc); 548cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe break; 5497437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis case VERIFY_META: 550936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_meta(hdr, td, &vc); 5517437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis break; 5527c353ceb3257b132f4c98326046b42201e070731Jens Axboe case VERIFY_SHA1: 553936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_sha1(hdr, &vc); 5547c353ceb3257b132f4c98326046b42201e070731Jens Axboe break; 5553f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis default: 5563f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("Bad verify type %u\n", hdr->verify_type); 557d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe ret = EINVAL; 5583f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis } 5593f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis } 560a7dfe862c2e3fe72b8db6a6e67302048d3731c6dJens Axboe 561a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe return ret; 562e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 563e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 5647437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic void fill_meta(struct verify_header *hdr, struct thread_data *td, 5655ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe struct io_u *io_u, unsigned int header_num) 5667437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{ 5677437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis struct vhdr_meta *vh = hdr_priv(hdr); 5687437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 5697437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->thread = td->thread_number; 5707437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 5717437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->time_sec = io_u->start_time.tv_sec; 5727437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->time_usec = io_u->start_time.tv_usec; 5737437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 5747437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->numberio = td->io_issues[DDIR_WRITE]; 5757437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 5767437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->offset = io_u->offset + header_num * td->o.verify_interval; 5777437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis} 5787437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 579cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha512(struct verify_header *hdr, void *p, unsigned int len) 580cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 581546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha512 *vh = hdr_priv(hdr); 582cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe struct sha512_ctx sha512_ctx = { 583546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe .buf = vh->sha512, 584cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 585cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 586cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha512_init(&sha512_ctx); 587cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha512_update(&sha512_ctx, p, len); 588cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 589cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 590cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha256(struct verify_header *hdr, void *p, unsigned int len) 591cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 592546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha256 *vh = hdr_priv(hdr); 593cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe struct sha256_ctx sha256_ctx = { 594546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe .buf = vh->sha256, 595cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 596cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 597cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha256_init(&sha256_ctx); 598cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha256_update(&sha256_ctx, p, len); 599cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 600cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 6017c353ceb3257b132f4c98326046b42201e070731Jens Axboestatic void fill_sha1(struct verify_header *hdr, void *p, unsigned int len) 6027c353ceb3257b132f4c98326046b42201e070731Jens Axboe{ 6037c353ceb3257b132f4c98326046b42201e070731Jens Axboe struct vhdr_sha1 *vh = hdr_priv(hdr); 6047c353ceb3257b132f4c98326046b42201e070731Jens Axboe struct sha1_ctx sha1_ctx = { 6057c353ceb3257b132f4c98326046b42201e070731Jens Axboe .H = vh->sha1, 6067c353ceb3257b132f4c98326046b42201e070731Jens Axboe }; 6077c353ceb3257b132f4c98326046b42201e070731Jens Axboe 6087c353ceb3257b132f4c98326046b42201e070731Jens Axboe sha1_init(&sha1_ctx); 6097c353ceb3257b132f4c98326046b42201e070731Jens Axboe sha1_update(&sha1_ctx, p, len); 6107c353ceb3257b132f4c98326046b42201e070731Jens Axboe} 6117c353ceb3257b132f4c98326046b42201e070731Jens Axboe 6121e154bdbf14a1d352117aea057035235b66f0381Jens Axboestatic void fill_crc7(struct verify_header *hdr, void *p, unsigned int len) 6131e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{ 614546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc7 *vh = hdr_priv(hdr); 615546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 616546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe vh->crc7 = crc7(p, len); 6171e154bdbf14a1d352117aea057035235b66f0381Jens Axboe} 6181e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 619969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboestatic void fill_crc16(struct verify_header *hdr, void *p, unsigned int len) 620969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{ 621546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc16 *vh = hdr_priv(hdr); 622546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 623546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe vh->crc16 = crc16(p, len); 624969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe} 625969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 626e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_crc32(struct verify_header *hdr, void *p, unsigned int len) 627e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 628546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 629546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 630546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe vh->crc32 = crc32(p, len); 631e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 632e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 633bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboestatic void fill_crc32c(struct verify_header *hdr, void *p, unsigned int len) 634bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{ 635bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 636bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 6373845591fadea480177223e28c9d1c03642d34f0eJens Axboe if (hdr->verify_type == VERIFY_CRC32C_INTEL) 6383845591fadea480177223e28c9d1c03642d34f0eJens Axboe vh->crc32 = crc32c_intel(p, len); 6393845591fadea480177223e28c9d1c03642d34f0eJens Axboe else 6403845591fadea480177223e28c9d1c03642d34f0eJens Axboe vh->crc32 = crc32c(p, len); 641bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe} 642bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 643d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboestatic void fill_crc64(struct verify_header *hdr, void *p, unsigned int len) 644d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{ 645546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc64 *vh = hdr_priv(hdr); 646546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 647546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe vh->crc64 = crc64(p, len); 648d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe} 649d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 650e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_md5(struct verify_header *hdr, void *p, unsigned int len) 651e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 652546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_md5 *vh = hdr_priv(hdr); 6538c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe struct md5_ctx md5_ctx = { 654546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe .hash = (uint32_t *) vh->md5_digest, 6558c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe }; 656e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 65761f821f16cf27d8742e09b3a137c933cd0085e9bJens Axboe md5_init(&md5_ctx); 658e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe md5_update(&md5_ctx, p, len); 659e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 660e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 661e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe/* 662e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * fill body of io_u->buf with random data and add a header with the 663e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * crc32 or md5 sum of that data. 664e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe */ 665e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboevoid populate_verify_io_u(struct thread_data *td, struct io_u *io_u) 666e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 667baefa9beacca430b8e3275c07d2f46ef14654468Jens Axboe struct verify_header *hdr; 66895646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe void *p = io_u->buf, *data; 6697437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis unsigned int hdr_inc, data_len, header_num = 0; 670e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 6719cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe if (td->o.verify == VERIFY_NULL) 6729cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe return; 6739cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe 67490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe fill_pattern(td, p, io_u->buflen); 675546a9142511875524850ac92776184fd9fb7196eShawn Lewis 676546a9142511875524850ac92776184fd9fb7196eShawn Lewis hdr_inc = io_u->buflen; 677a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe if (td->o.verify_interval) 678a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe hdr_inc = td->o.verify_interval; 679baefa9beacca430b8e3275c07d2f46ef14654468Jens Axboe 6805ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe for (; p < io_u->buf + io_u->buflen; p += hdr_inc) { 68195646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe hdr = p; 6823f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis 6833f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis hdr->fio_magic = FIO_HDR_MAGIC; 6843f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis hdr->verify_type = td->o.verify; 685546a9142511875524850ac92776184fd9fb7196eShawn Lewis hdr->len = hdr_inc; 6868767783245faac99a7e1c330a1d6536e579c8402Jens Axboe data_len = hdr_inc - hdr_size(hdr); 6873f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis 6888767783245faac99a7e1c330a1d6536e579c8402Jens Axboe data = p + hdr_size(hdr); 6893f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis switch (td->o.verify) { 6903f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_MD5: 691bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill md5 io_u %p, len %u\n", 692bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 6933f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis fill_md5(hdr, data, data_len); 6943f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 6953f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC64: 696bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill crc64 io_u %p, len %u\n", 697bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 6983f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis fill_crc64(hdr, data, data_len); 6993f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 700bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe case VERIFY_CRC32C: 7013845591fadea480177223e28c9d1c03642d34f0eJens Axboe case VERIFY_CRC32C_INTEL: 702bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe dprint(FD_VERIFY, "fill crc32c io_u %p, len %u\n", 703bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe io_u, hdr->len); 704bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe fill_crc32c(hdr, data, data_len); 705bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe break; 7063f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC32: 707bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill crc32 io_u %p, len %u\n", 708bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 7093f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis fill_crc32(hdr, data, data_len); 7103f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 7113f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC16: 712bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill crc16 io_u %p, len %u\n", 713bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 7143f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis fill_crc16(hdr, data, data_len); 7153f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 7163f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC7: 717bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill crc7 io_u %p, len %u\n", 718bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 7193f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis fill_crc7(hdr, data, data_len); 7203f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 721cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe case VERIFY_SHA256: 722bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill sha256 io_u %p, len %u\n", 723bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 724cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe fill_sha256(hdr, data, data_len); 725cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe break; 726cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe case VERIFY_SHA512: 727bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill sha512 io_u %p, len %u\n", 728bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 729cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe fill_sha512(hdr, data, data_len); 730cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe break; 7317437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis case VERIFY_META: 732bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill meta io_u %p, len %u\n", 733bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 7347437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis fill_meta(hdr, td, io_u, header_num); 7357437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis break; 7367c353ceb3257b132f4c98326046b42201e070731Jens Axboe case VERIFY_SHA1: 7377c353ceb3257b132f4c98326046b42201e070731Jens Axboe dprint(FD_VERIFY, "fill sha1 io_u %p, len %u\n", 7387c353ceb3257b132f4c98326046b42201e070731Jens Axboe io_u, hdr->len); 7397c353ceb3257b132f4c98326046b42201e070731Jens Axboe fill_sha1(hdr, data, data_len); 7407c353ceb3257b132f4c98326046b42201e070731Jens Axboe break; 7413f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis default: 7423f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("fio: bad verify type: %d\n", td->o.verify); 7433f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis assert(0); 7443f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis } 745a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe if (td->o.verify_offset) 7468767783245faac99a7e1c330a1d6536e579c8402Jens Axboe memswp(p, p + td->o.verify_offset, hdr_size(hdr)); 7477437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis header_num++; 748e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe } 749e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 750e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 751e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboeint get_next_verify(struct thread_data *td, struct io_u *io_u) 752e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 7538de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe struct io_piece *ipo = NULL; 754e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 755d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe /* 756d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe * this io_u is from a requeue, we already filled the offsets 757d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe */ 758d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe if (io_u->file) 759d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe return 0; 760d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe 7618de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe if (!RB_EMPTY_ROOT(&td->io_hist_tree)) { 7628de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe struct rb_node *n = rb_first(&td->io_hist_tree); 763e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 7648de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe ipo = rb_entry(n, struct io_piece, rb_node); 7654b87898e8d76aaf05baec83077a11311c1447397Jens Axboe rb_erase(n, &td->io_hist_tree); 7669e144189c6e000df8a797312e43a4913f3b83c9aJens Axboe td->io_hist_len--; 76701743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe } else if (!flist_empty(&td->io_hist_list)) { 76801743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe ipo = flist_entry(td->io_hist_list.next, struct io_piece, list); 7699e144189c6e000df8a797312e43a4913f3b83c9aJens Axboe td->io_hist_len--; 77001743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe flist_del(&ipo->list); 7718de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe } 772e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 7738de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe if (ipo) { 774e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe io_u->offset = ipo->offset; 775e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe io_u->buflen = ipo->len; 77636167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe io_u->file = ipo->file; 77797af62cec418cd722fb43c6010d6430534e12353Jens Axboe 778d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (!fio_file_open(io_u->file)) { 77997af62cec418cd722fb43c6010d6430534e12353Jens Axboe int r = td_io_open_file(td, io_u->file); 78097af62cec418cd722fb43c6010d6430534e12353Jens Axboe 781bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe if (r) { 782bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "failed file %s open\n", 783bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u->file->file_name); 78497af62cec418cd722fb43c6010d6430534e12353Jens Axboe return 1; 785bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe } 78697af62cec418cd722fb43c6010d6430534e12353Jens Axboe } 78797af62cec418cd722fb43c6010d6430534e12353Jens Axboe 78897af62cec418cd722fb43c6010d6430534e12353Jens Axboe get_file(ipo->file); 789d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe assert(fio_file_open(io_u->file)); 790e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe io_u->ddir = DDIR_READ; 79136167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe io_u->xfer_buf = io_u->buf; 79236167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe io_u->xfer_buflen = io_u->buflen; 793e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe free(ipo); 794bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "get_next_verify: ret io_u %p\n", io_u); 795e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe return 0; 796e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe } 797e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 798bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "get_next_verify: empty\n"); 799e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe return 1; 800e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 801e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 802e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboestatic void *verify_async_thread(void *data) 803e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{ 804e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe struct thread_data *td = data; 805e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe struct io_u *io_u; 806e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe int ret = 0; 807e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 808e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (td->o.verify_cpumask_set && 809e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe fio_setaffinity(td->pid, td->o.verify_cpumask)) { 810e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe log_err("fio: failed setting verify thread affinity\n"); 811e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe goto done; 812e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 813e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 814e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe do { 815e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe FLIST_HEAD(list); 816e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe 817e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe read_barrier(); 818e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (td->verify_thread_exit) 819e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe break; 820e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 821e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_lock(&td->io_u_lock); 822e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 823e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe while (flist_empty(&td->verify_list) && 824e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe !td->verify_thread_exit) { 825b36e298b5bdfc31ffc9a4c14e94a9c5c748888b0Jens Axboe ret = pthread_cond_wait(&td->verify_cond, 826b36e298b5bdfc31ffc9a4c14e94a9c5c748888b0Jens Axboe &td->io_u_lock); 827e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (ret) { 828e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 829e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe break; 830e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 831e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 832e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 833e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe flist_splice_init(&td->verify_list, &list); 834e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 835e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe 836e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe if (flist_empty(&list)) 837e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe continue; 838e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 839e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe while (!flist_empty(&list)) { 840e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe io_u = flist_entry(list.next, struct io_u, list); 841e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe flist_del_init(&io_u->list); 842e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 843d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe ret = verify_io_u(td, io_u); 844e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe put_io_u(td, io_u); 845d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe if (!ret) 846d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe continue; 847d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe if (td->o.continue_on_error && 848d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe td_non_fatal_error(ret)) { 849d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe update_error_count(td, ret); 850d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe td_clear_error(td); 851d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe ret = 0; 852d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe } 853e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe } 854e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } while (!ret); 855e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 856d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe if (ret) { 857d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe td_verror(td, ret, "async_verify"); 858d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe td->terminate = 1; 859d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe } 860d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe 861e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboedone: 862e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_lock(&td->io_u_lock); 863e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->nr_verify_threads--; 864e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 865e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 866e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_signal(&td->free_cond); 867e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe return NULL; 868e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe} 869e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 870e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_async_init(struct thread_data *td) 871e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{ 872e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe int i, ret; 873e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 874e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_thread_exit = 0; 875e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 876e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_threads = malloc(sizeof(pthread_t) * td->o.verify_async); 877e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe for (i = 0; i < td->o.verify_async; i++) { 878e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe ret = pthread_create(&td->verify_threads[i], NULL, 879e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe verify_async_thread, td); 880e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (ret) { 881e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe log_err("fio: async verify creation failed: %s\n", 882e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe strerror(ret)); 883e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe break; 884e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 885e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe ret = pthread_detach(td->verify_threads[i]); 886e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (ret) { 887e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe log_err("fio: async verify thread detach failed: %s\n", 888e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe strerror(ret)); 889e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe break; 890e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 891e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->nr_verify_threads++; 892e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 893e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 894e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (i != td->o.verify_async) { 895e40823b10920f679d84f3f2222e319c168b1e7daJens Axboe log_err("fio: only %d verify threads started, exiting\n", i); 896e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_thread_exit = 1; 897e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe write_barrier(); 898e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_broadcast(&td->verify_cond); 899e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe return 1; 900e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 901e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 902e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe return 0; 903e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe} 904e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 905e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboevoid verify_async_exit(struct thread_data *td) 906e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{ 907e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_thread_exit = 1; 908e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe write_barrier(); 909e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_broadcast(&td->verify_cond); 910e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 911e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_lock(&td->io_u_lock); 912e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 913e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe while (td->nr_verify_threads) 914e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_wait(&td->free_cond, &td->io_u_lock); 915e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 916e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 917e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe free(td->verify_threads); 918e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_threads = NULL; 919e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe} 920