verify.c revision d561f2ab37ef5729882ef3c6e6ed8ee49414955f
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" 22cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 2390059d65bde4804e4da07401ad6902c1d956b592Jens Axboestatic void fill_random_bytes(struct thread_data *td, void *p, unsigned int len) 24e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 25e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe unsigned int todo; 264c5946c6606abc87ba7e2bfc57a5030d19b6d4d5Jens Axboe int r; 27e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 28e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe while (len) { 294c5946c6606abc87ba7e2bfc57a5030d19b6d4d5Jens Axboe r = os_random_long(&td->verify_state); 30e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 31e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe /* 32e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * lrand48_r seems to be broken and only fill the bottom 33e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * 32-bits, even on 64-bit archs with 64-bit longs 34e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe */ 35e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe todo = sizeof(r); 36e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe if (todo > len) 37e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe todo = len; 38e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 39e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe memcpy(p, &r, todo); 40e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 41e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe len -= todo; 42e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe p += todo; 43e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe } 44e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 45e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 4690059d65bde4804e4da07401ad6902c1d956b592Jens Axboestatic void fill_pattern(struct thread_data *td, void *p, unsigned int len) 4790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe{ 4890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe switch (td->o.verify_pattern_bytes) { 4990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe case 0: 50bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill random bytes len=%u\n", len); 5190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe fill_random_bytes(td, p, len); 5290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe break; 5390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe case 1: 54bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill verify pattern b=0 len=%u\n", len); 5590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe memset(p, td->o.verify_pattern, len); 5690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe break; 5790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe case 2: 5890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe case 3: 5990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe case 4: { 6090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe unsigned int pattern = td->o.verify_pattern; 6190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe unsigned int i = 0; 6290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe unsigned char c1, c2, c3, c4; 6390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe unsigned char *b = p; 6490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe 65bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill verify pattern b=%d len=%u\n", 66bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe td->o.verify_pattern_bytes, len); 67bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 6890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe c1 = pattern & 0xff; 6990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe pattern >>= 8; 7090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe c2 = pattern & 0xff; 7190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe pattern >>= 8; 7290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe c3 = pattern & 0xff; 7390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe pattern >>= 8; 7490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe c4 = pattern & 0xff; 7590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe 7690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe while (i < len) { 7790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe b[i++] = c1; 7890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe if (i == len) 7990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe break; 8090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe b[i++] = c2; 8190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe if (td->o.verify_pattern_bytes == 2 || i == len) 8290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe continue; 8390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe b[i++] = c3; 8490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe if (td->o.verify_pattern_bytes == 3 || i == len) 8590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe continue; 8690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe b[i++] = c4; 8790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe } 8890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe break; 8990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe } 9090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe } 9190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe} 9290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe 934764aec9fe5988281bdc114c13ac771fb16713ccJens Axboestatic void memswp(void *buf1, void *buf2, unsigned int len) 94546a9142511875524850ac92776184fd9fb7196eShawn Lewis{ 95dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis char swap[200]; 96dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis 97dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis assert(len <= sizeof(swap)); 9890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe 99546a9142511875524850ac92776184fd9fb7196eShawn Lewis memcpy(&swap, buf1, len); 100546a9142511875524850ac92776184fd9fb7196eShawn Lewis memcpy(buf1, buf2, len); 101546a9142511875524850ac92776184fd9fb7196eShawn Lewis memcpy(buf2, &swap, len); 102546a9142511875524850ac92776184fd9fb7196eShawn Lewis} 103546a9142511875524850ac92776184fd9fb7196eShawn Lewis 104e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void hexdump(void *buffer, int len) 105e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 106e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe unsigned char *p = buffer; 107e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe int i; 108e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 109e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe for (i = 0; i < len; i++) 1106d86144dd10b05e8b82e9b895c35dd778e5e71abJens Axboe log_info("%02x", p[i]); 1116d86144dd10b05e8b82e9b895c35dd778e5e71abJens Axboe log_info("\n"); 112e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 113e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 114d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe/* 1158767783245faac99a7e1c330a1d6536e579c8402Jens Axboe * Prepare for seperation of verify_header and checksum header 1168767783245faac99a7e1c330a1d6536e579c8402Jens Axboe */ 117546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic inline unsigned int __hdr_size(int verify_type) 1188767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{ 1195921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe unsigned int len = len; 1208767783245faac99a7e1c330a1d6536e579c8402Jens Axboe 121546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe switch (verify_type) { 122546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_NONE: 123546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_NULL: 124546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = 0; 125546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 126546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_MD5: 127546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_md5); 128546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 129546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC64: 130546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc64); 131546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 132bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe case VERIFY_CRC32C: 133546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC32: 1343845591fadea480177223e28c9d1c03642d34f0eJens Axboe case VERIFY_CRC32C_INTEL: 135546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc32); 136546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 137546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC16: 138546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc16); 139546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 140546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC7: 141546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc7); 142546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 143546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_SHA256: 144546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_sha256); 145546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 146546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_SHA512: 147546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_sha512); 148546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 1497437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis case VERIFY_META: 1507437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis len = sizeof(struct vhdr_meta); 1517437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis break; 152546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe default: 153546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe log_err("fio: unknown verify header!\n"); 154546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe assert(0); 155546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe } 156546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 157546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe return len + sizeof(struct verify_header); 1588767783245faac99a7e1c330a1d6536e579c8402Jens Axboe} 1598767783245faac99a7e1c330a1d6536e579c8402Jens Axboe 1608767783245faac99a7e1c330a1d6536e579c8402Jens Axboestatic inline unsigned int hdr_size(struct verify_header *hdr) 1618767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{ 162546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe return __hdr_size(hdr->verify_type); 163546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe} 164546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 165546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic void *hdr_priv(struct verify_header *hdr) 166546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe{ 167546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe void *priv = hdr; 168546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 169546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe return priv + sizeof(struct verify_header); 1708767783245faac99a7e1c330a1d6536e579c8402Jens Axboe} 1718767783245faac99a7e1c330a1d6536e579c8402Jens Axboe 1728767783245faac99a7e1c330a1d6536e579c8402Jens Axboe/* 173d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe * Return data area 'header_num' 174d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe */ 175d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboestatic inline void *io_u_verify_off(struct verify_header *hdr, 1765ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe struct io_u *io_u, unsigned char header_num) 177d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe{ 1788767783245faac99a7e1c330a1d6536e579c8402Jens Axboe return io_u->buf + header_num * hdr->len + hdr_size(hdr); 179d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe} 180d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe 1817437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic int verify_io_u_meta(struct verify_header *hdr, struct thread_data *td, 1825ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe struct io_u *io_u, unsigned int header_num) 1837437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{ 1847437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis struct vhdr_meta *vh = hdr_priv(hdr); 1857437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 186bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "meta verify io_u %p, len %u\n", io_u, hdr->len); 187bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 1887437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis if (vh->offset != io_u->offset + header_num * td->o.verify_interval) { 1897437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis log_err("meta: verify failed at %llu/%u\n", 1905ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe io_u->offset + header_num * hdr->len, hdr->len); 1919fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 1927437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis } 1937437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 1947437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis return 0; 1957437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis} 1967437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 197cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic int verify_io_u_sha512(struct verify_header *hdr, struct io_u *io_u, 198cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe unsigned int header_num) 199cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 200cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe void *p = io_u_verify_off(hdr, io_u, header_num); 201546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha512 *vh = hdr_priv(hdr); 202cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe uint8_t sha512[128]; 203cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe struct sha512_ctx sha512_ctx = { 204cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe .buf = sha512, 205cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 206cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 207bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "sha512 verify io_u %p, len %u\n", io_u, hdr->len); 208bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 209cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha512_init(&sha512_ctx); 2108767783245faac99a7e1c330a1d6536e579c8402Jens Axboe sha512_update(&sha512_ctx, p, hdr->len - hdr_size(hdr)); 211cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 212546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (memcmp(vh->sha512, sha512_ctx.buf, sizeof(sha512))) { 213cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe log_err("sha512: verify failed at %llu/%u\n", 2145ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe io_u->offset + header_num * hdr->len, hdr->len); 215546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe hexdump(vh->sha512, sizeof(vh->sha512)); 216cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe hexdump(sha512_ctx.buf, sizeof(sha512)); 2179fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 218cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe } 219cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 220cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe return 0; 221cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 222cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 223cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic int verify_io_u_sha256(struct verify_header *hdr, struct io_u *io_u, 224cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe unsigned int header_num) 225cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 226cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe void *p = io_u_verify_off(hdr, io_u, header_num); 227546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha256 *vh = hdr_priv(hdr); 228cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe uint8_t sha256[128]; 229cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe struct sha256_ctx sha256_ctx = { 230cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe .buf = sha256, 231cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 232cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 233bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "sha256 verify io_u %p, len %u\n", io_u, hdr->len); 234bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 235cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha256_init(&sha256_ctx); 2368767783245faac99a7e1c330a1d6536e579c8402Jens Axboe sha256_update(&sha256_ctx, p, hdr->len - hdr_size(hdr)); 237cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 238546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (memcmp(vh->sha256, sha256_ctx.buf, sizeof(sha256))) { 239cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe log_err("sha256: verify failed at %llu/%u\n", 2405ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe io_u->offset + header_num * hdr->len, hdr->len); 241546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe hexdump(vh->sha256, sizeof(vh->sha256)); 242cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe hexdump(sha256_ctx.buf, sizeof(sha256)); 2439fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 244cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe } 245cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 246cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe return 0; 247cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 248cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 2493f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_crc7(struct verify_header *hdr, struct io_u *io_u, 2505ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe unsigned char header_num) 2511e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{ 252d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe void *p = io_u_verify_off(hdr, io_u, header_num); 253546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc7 *vh = hdr_priv(hdr); 2541e154bdbf14a1d352117aea057035235b66f0381Jens Axboe unsigned char c; 2551e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 256bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "crc7 verify io_u %p, len %u\n", io_u, hdr->len); 257bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 2588767783245faac99a7e1c330a1d6536e579c8402Jens Axboe c = crc7(p, hdr->len - hdr_size(hdr)); 2591e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 260546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (c != vh->crc7) { 2613f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("crc7: verify failed at %llu/%u\n", 2625ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe io_u->offset + header_num * hdr->len, hdr->len); 263546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe log_err("crc7: wanted %x, got %x\n", vh->crc7, c); 2649fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 2651e154bdbf14a1d352117aea057035235b66f0381Jens Axboe } 2661e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 2671e154bdbf14a1d352117aea057035235b66f0381Jens Axboe return 0; 2681e154bdbf14a1d352117aea057035235b66f0381Jens Axboe} 2691e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 2703f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_crc16(struct verify_header *hdr, struct io_u *io_u, 2715ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe unsigned int header_num) 272969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{ 273d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe void *p = io_u_verify_off(hdr, io_u, header_num); 274546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc16 *vh = hdr_priv(hdr); 275969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe unsigned short c; 276969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 277bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "crc16 verify io_u %p, len %u\n", io_u, hdr->len); 278bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 2798767783245faac99a7e1c330a1d6536e579c8402Jens Axboe c = crc16(p, hdr->len - hdr_size(hdr)); 280969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 281546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (c != vh->crc16) { 2823f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("crc16: verify failed at %llu/%u\n", 2835ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe io_u->offset + header_num * hdr->len, hdr->len); 284546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe log_err("crc16: wanted %x, got %x\n", vh->crc16, c); 2859fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 286969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe } 287969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 288969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe return 0; 289969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe} 290969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 2913f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_crc64(struct verify_header *hdr, struct io_u *io_u, 2925ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe unsigned int header_num) 293d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{ 294d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe void *p = io_u_verify_off(hdr, io_u, header_num); 295546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc64 *vh = hdr_priv(hdr); 296d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe unsigned long long c; 297d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 298bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "crc64 verify io_u %p, len %u\n", io_u, hdr->len); 299bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 3008767783245faac99a7e1c330a1d6536e579c8402Jens Axboe c = crc64(p, hdr->len - hdr_size(hdr)); 301d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 302546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (c != vh->crc64) { 3033f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("crc64: verify failed at %llu/%u\n", 3043f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis io_u->offset + header_num * hdr->len, 3053f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis hdr->len); 3065ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe log_err("crc64: wanted %llx, got %llx\n", 3075ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe (unsigned long long) vh->crc64, c); 3089fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 309d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe } 310d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 311d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe return 0; 312d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe} 313d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 3143f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_crc32(struct verify_header *hdr, struct io_u *io_u, 3155ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe unsigned int header_num) 316e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 317d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe void *p = io_u_verify_off(hdr, io_u, header_num); 318546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 319546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe uint32_t c; 320e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 321bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "crc32 verify io_u %p, len %u\n", io_u, hdr->len); 322bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 3238767783245faac99a7e1c330a1d6536e579c8402Jens Axboe c = crc32(p, hdr->len - hdr_size(hdr)); 324e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 325546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (c != vh->crc32) { 3263f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("crc32: verify failed at %llu/%u\n", 3275ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe io_u->offset + header_num * hdr->len, hdr->len); 328546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe log_err("crc32: wanted %x, got %x\n", vh->crc32, c); 3299fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 330e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe } 331e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 332e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe return 0; 333e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 334e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 335bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboestatic int verify_io_u_crc32c(struct verify_header *hdr, struct io_u *io_u, 336bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe unsigned int header_num) 337bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{ 338bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe void *p = io_u_verify_off(hdr, io_u, header_num); 339bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 340bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe uint32_t c; 341bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 342bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe dprint(FD_VERIFY, "crc32c verify io_u %p, len %u\n", io_u, hdr->len); 343bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 3443845591fadea480177223e28c9d1c03642d34f0eJens Axboe if (hdr->verify_type == VERIFY_CRC32C_INTEL) 3453845591fadea480177223e28c9d1c03642d34f0eJens Axboe c = crc32c_intel(p, hdr->len - hdr_size(hdr)); 3463845591fadea480177223e28c9d1c03642d34f0eJens Axboe else 3473845591fadea480177223e28c9d1c03642d34f0eJens Axboe c = crc32c(p, hdr->len - hdr_size(hdr)); 348bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 349bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe if (c != vh->crc32) { 350bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe log_err("crc32c: verify failed at %llu/%u\n", 351bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe io_u->offset + header_num * hdr->len, hdr->len); 352bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe log_err("crc32c: wanted %x, got %x\n", vh->crc32, c); 3539fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 354bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe } 355bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 356bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe return 0; 357bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe} 358bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 3593f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_md5(struct verify_header *hdr, struct io_u *io_u, 3605ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe unsigned int header_num) 361e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 362d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe void *p = io_u_verify_off(hdr, io_u, header_num); 363546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_md5 *vh = hdr_priv(hdr); 3648c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe uint32_t hash[MD5_HASH_WORDS]; 3658c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe struct md5_ctx md5_ctx = { 3668c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe .hash = hash, 3678c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe }; 368e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 369bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "md5 verify io_u %p, len %u\n", io_u, hdr->len); 370bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 37161f821f16cf27d8742e09b3a137c933cd0085e9bJens Axboe md5_init(&md5_ctx); 3728767783245faac99a7e1c330a1d6536e579c8402Jens Axboe md5_update(&md5_ctx, p, hdr->len - hdr_size(hdr)); 373e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 374546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (memcmp(vh->md5_digest, md5_ctx.hash, sizeof(hash))) { 3753f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("md5: verify failed at %llu/%u\n", 3765ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe io_u->offset + header_num * hdr->len, hdr->len); 377546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe hexdump(vh->md5_digest, sizeof(vh->md5_digest)); 3788c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe hexdump(md5_ctx.hash, sizeof(hash)); 3799fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 380e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe } 381e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 382e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe return 0; 383e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 384e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 3853f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboestatic unsigned int hweight8(unsigned int w) 3863f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe{ 3873f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe unsigned int res = w - ((w >> 1) & 0x55); 3883f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe 3893f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe res = (res & 0x33) + ((res >> 2) & 0x33); 3903f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe return (res + (res >> 4)) & 0x0F; 3913f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe} 3923f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe 393a944e335fac62c75966b417a25ec107c40957cdbShawn Lewisint verify_io_u_pattern(unsigned long pattern, unsigned long pattern_size, 3945ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe char *buf, unsigned int len, unsigned int mod) 395a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis{ 396a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis unsigned int i; 397a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis char split_pattern[4]; 398a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis 399a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis for (i = 0; i < 4; i++) { 400a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis split_pattern[i] = pattern & 0xff; 401a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis pattern >>= 8; 402a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis } 403a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis 404a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis for (i = 0; i < len; i++) { 4053f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe if (buf[i] != split_pattern[mod]) { 4063f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe unsigned int bits; 4073f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe 4083f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe bits = hweight8(buf[i] ^ split_pattern[mod]); 4093f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe log_err("fio: got pattern %x, wanted %x. Bad bits %d\n", 4103f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe buf[i], split_pattern[mod], bits); 4113f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe log_err("fio: bad pattern block offset %u\n", i); 4129fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 4133f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe } 414a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis mod++; 415a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis if (mod == pattern_size) 416a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis mod = 0; 417a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis } 418a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis 419a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis return 0; 420a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis} 421a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis 422e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe/* 423e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe * Push IO verification to a separate thread 424e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe */ 425e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_io_u_async(struct thread_data *td, struct io_u *io_u) 426e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{ 427e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (io_u->file) 428e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe put_file_log(td, io_u->file); 429e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 430e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe io_u->file = NULL; 431e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 432e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_lock(&td->io_u_lock); 433e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe flist_del(&io_u->list); 434e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe flist_add_tail(&io_u->list, &td->verify_list); 435e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 436e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 437e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_signal(&td->verify_cond); 438e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe io_u->flags |= IO_U_F_FREE_DEF; 439e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe return 0; 440e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe} 441e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 44236690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboeint verify_io_u(struct thread_data *td, struct io_u *io_u) 443e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 4443f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis struct verify_header *hdr; 445a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis unsigned int hdr_size, hdr_inc, hdr_num = 0; 44695646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe void *p; 447e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe int ret; 448e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 4491dcc049824b840df1ee0ef5d019fffa4037e1bb0Shawn Lewis if (td->o.verify == VERIFY_NULL || io_u->ddir != DDIR_READ) 45036690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe return 0; 45136690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe 4523f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis hdr_inc = io_u->buflen; 453a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe if (td->o.verify_interval) 454a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe hdr_inc = td->o.verify_interval; 455e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 456a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe ret = 0; 4575ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe for (p = io_u->buf; p < io_u->buf + io_u->buflen; 4585ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe p += hdr_inc, hdr_num++) { 459a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe if (ret && td->o.verify_fatal) { 460a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe td->terminate = 1; 461a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe break; 462a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe } 463a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis hdr_size = __hdr_size(td->o.verify); 464a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe if (td->o.verify_offset) 465a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis memswp(p, p + td->o.verify_offset, hdr_size); 46695646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe hdr = p; 467e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 4683f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe if (hdr->fio_magic != FIO_HDR_MAGIC) { 4693f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe log_err("Bad verify header %x\n", hdr->fio_magic); 4709fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 4713f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe } 4723f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe 473e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis if (td->o.verify_pattern_bytes) { 474bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "pattern verify io_u %p, len %u\n", 475bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 476e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis ret = verify_io_u_pattern(td->o.verify_pattern, 4775ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe td->o.verify_pattern_bytes, 4785ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe p + hdr_size, 4795ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe hdr_inc - hdr_size, 4805ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe hdr_size % 4); 481e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis if (ret) 482e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis log_err("fio: verify failed at %llu/%u\n", 483e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis io_u->offset + hdr_num * hdr->len, 484e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis hdr->len); 485e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis continue; 486e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis } 487e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis 4883f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis switch (hdr->verify_type) { 4893f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_MD5: 4903f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis ret = verify_io_u_md5(hdr, io_u, hdr_num); 4913f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 4923f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC64: 4933f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis ret = verify_io_u_crc64(hdr, io_u, hdr_num); 4943f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 495bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe case VERIFY_CRC32C: 4963845591fadea480177223e28c9d1c03642d34f0eJens Axboe case VERIFY_CRC32C_INTEL: 497bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe ret = verify_io_u_crc32c(hdr, io_u, hdr_num); 498bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe break; 4993f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC32: 5003f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis ret = verify_io_u_crc32(hdr, io_u, hdr_num); 5013f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 5023f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC16: 5033f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis ret = verify_io_u_crc16(hdr, io_u, hdr_num); 5043f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 5053f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC7: 5063f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis ret = verify_io_u_crc7(hdr, io_u, hdr_num); 5073f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 508cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe case VERIFY_SHA256: 509cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe ret = verify_io_u_sha256(hdr, io_u, hdr_num); 510cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe break; 511cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe case VERIFY_SHA512: 512cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe ret = verify_io_u_sha512(hdr, io_u, hdr_num); 513cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe break; 5147437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis case VERIFY_META: 5157437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis ret = verify_io_u_meta(hdr, td, io_u, hdr_num); 5167437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis break; 5173f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis default: 5183f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("Bad verify type %u\n", hdr->verify_type); 519d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe ret = EINVAL; 5203f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis } 5213f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis } 522a7dfe862c2e3fe72b8db6a6e67302048d3731c6dJens Axboe 523a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe return ret; 524e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 525e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 5267437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic void fill_meta(struct verify_header *hdr, struct thread_data *td, 5275ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe struct io_u *io_u, unsigned int header_num) 5287437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{ 5297437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis struct vhdr_meta *vh = hdr_priv(hdr); 5307437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 5317437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->thread = td->thread_number; 5327437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 5337437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->time_sec = io_u->start_time.tv_sec; 5347437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->time_usec = io_u->start_time.tv_usec; 5357437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 5367437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->numberio = td->io_issues[DDIR_WRITE]; 5377437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 5387437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->offset = io_u->offset + header_num * td->o.verify_interval; 5397437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis} 5407437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 541cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha512(struct verify_header *hdr, void *p, unsigned int len) 542cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 543546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha512 *vh = hdr_priv(hdr); 544cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe struct sha512_ctx sha512_ctx = { 545546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe .buf = vh->sha512, 546cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 547cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 548cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha512_init(&sha512_ctx); 549cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha512_update(&sha512_ctx, p, len); 550cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 551cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 552cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha256(struct verify_header *hdr, void *p, unsigned int len) 553cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 554546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha256 *vh = hdr_priv(hdr); 555cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe struct sha256_ctx sha256_ctx = { 556546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe .buf = vh->sha256, 557cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 558cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 559cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha256_init(&sha256_ctx); 560cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha256_update(&sha256_ctx, p, len); 561cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 562cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 5631e154bdbf14a1d352117aea057035235b66f0381Jens Axboestatic void fill_crc7(struct verify_header *hdr, void *p, unsigned int len) 5641e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{ 565546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc7 *vh = hdr_priv(hdr); 566546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 567546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe vh->crc7 = crc7(p, len); 5681e154bdbf14a1d352117aea057035235b66f0381Jens Axboe} 5691e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 570969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboestatic void fill_crc16(struct verify_header *hdr, void *p, unsigned int len) 571969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{ 572546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc16 *vh = hdr_priv(hdr); 573546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 574546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe vh->crc16 = crc16(p, len); 575969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe} 576969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 577e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_crc32(struct verify_header *hdr, void *p, unsigned int len) 578e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 579546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 580546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 581546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe vh->crc32 = crc32(p, len); 582e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 583e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 584bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboestatic void fill_crc32c(struct verify_header *hdr, void *p, unsigned int len) 585bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{ 586bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 587bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 5883845591fadea480177223e28c9d1c03642d34f0eJens Axboe if (hdr->verify_type == VERIFY_CRC32C_INTEL) 5893845591fadea480177223e28c9d1c03642d34f0eJens Axboe vh->crc32 = crc32c_intel(p, len); 5903845591fadea480177223e28c9d1c03642d34f0eJens Axboe else 5913845591fadea480177223e28c9d1c03642d34f0eJens Axboe vh->crc32 = crc32c(p, len); 592bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe} 593bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 594d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboestatic void fill_crc64(struct verify_header *hdr, void *p, unsigned int len) 595d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{ 596546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc64 *vh = hdr_priv(hdr); 597546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 598546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe vh->crc64 = crc64(p, len); 599d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe} 600d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 601e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_md5(struct verify_header *hdr, void *p, unsigned int len) 602e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 603546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_md5 *vh = hdr_priv(hdr); 6048c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe struct md5_ctx md5_ctx = { 605546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe .hash = (uint32_t *) vh->md5_digest, 6068c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe }; 607e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 60861f821f16cf27d8742e09b3a137c933cd0085e9bJens Axboe md5_init(&md5_ctx); 609e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe md5_update(&md5_ctx, p, len); 610e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 611e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 612e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe/* 613e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * fill body of io_u->buf with random data and add a header with the 614e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * crc32 or md5 sum of that data. 615e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe */ 616e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboevoid populate_verify_io_u(struct thread_data *td, struct io_u *io_u) 617e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 618baefa9beacca430b8e3275c07d2f46ef14654468Jens Axboe struct verify_header *hdr; 61995646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe void *p = io_u->buf, *data; 6207437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis unsigned int hdr_inc, data_len, header_num = 0; 621e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 6229cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe if (td->o.verify == VERIFY_NULL) 6239cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe return; 6249cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe 62590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe fill_pattern(td, p, io_u->buflen); 626546a9142511875524850ac92776184fd9fb7196eShawn Lewis 627546a9142511875524850ac92776184fd9fb7196eShawn Lewis hdr_inc = io_u->buflen; 628a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe if (td->o.verify_interval) 629a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe hdr_inc = td->o.verify_interval; 630baefa9beacca430b8e3275c07d2f46ef14654468Jens Axboe 6315ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe for (; p < io_u->buf + io_u->buflen; p += hdr_inc) { 63295646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe hdr = p; 6333f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis 6343f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis hdr->fio_magic = FIO_HDR_MAGIC; 6353f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis hdr->verify_type = td->o.verify; 636546a9142511875524850ac92776184fd9fb7196eShawn Lewis hdr->len = hdr_inc; 6378767783245faac99a7e1c330a1d6536e579c8402Jens Axboe data_len = hdr_inc - hdr_size(hdr); 6383f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis 6398767783245faac99a7e1c330a1d6536e579c8402Jens Axboe data = p + hdr_size(hdr); 6403f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis switch (td->o.verify) { 6413f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_MD5: 642bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill md5 io_u %p, len %u\n", 643bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 6443f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis fill_md5(hdr, data, data_len); 6453f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 6463f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC64: 647bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill crc64 io_u %p, len %u\n", 648bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 6493f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis fill_crc64(hdr, data, data_len); 6503f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 651bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe case VERIFY_CRC32C: 6523845591fadea480177223e28c9d1c03642d34f0eJens Axboe case VERIFY_CRC32C_INTEL: 653bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe dprint(FD_VERIFY, "fill crc32c io_u %p, len %u\n", 654bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe io_u, hdr->len); 655bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe fill_crc32c(hdr, data, data_len); 656bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe break; 6573f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC32: 658bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill crc32 io_u %p, len %u\n", 659bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 6603f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis fill_crc32(hdr, data, data_len); 6613f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 6623f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC16: 663bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill crc16 io_u %p, len %u\n", 664bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 6653f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis fill_crc16(hdr, data, data_len); 6663f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 6673f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC7: 668bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill crc7 io_u %p, len %u\n", 669bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 6703f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis fill_crc7(hdr, data, data_len); 6713f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 672cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe case VERIFY_SHA256: 673bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill sha256 io_u %p, len %u\n", 674bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 675cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe fill_sha256(hdr, data, data_len); 676cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe break; 677cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe case VERIFY_SHA512: 678bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill sha512 io_u %p, len %u\n", 679bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 680cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe fill_sha512(hdr, data, data_len); 681cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe break; 6827437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis case VERIFY_META: 683bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill meta io_u %p, len %u\n", 684bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 6857437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis fill_meta(hdr, td, io_u, header_num); 6867437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis break; 6873f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis default: 6883f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("fio: bad verify type: %d\n", td->o.verify); 6893f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis assert(0); 6903f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis } 691a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe if (td->o.verify_offset) 6928767783245faac99a7e1c330a1d6536e579c8402Jens Axboe memswp(p, p + td->o.verify_offset, hdr_size(hdr)); 6937437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis header_num++; 694e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe } 695e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 696e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 697e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboeint get_next_verify(struct thread_data *td, struct io_u *io_u) 698e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 6998de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe struct io_piece *ipo = NULL; 700e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 701d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe /* 702d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe * this io_u is from a requeue, we already filled the offsets 703d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe */ 704d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe if (io_u->file) 705d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe return 0; 706d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe 7078de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe if (!RB_EMPTY_ROOT(&td->io_hist_tree)) { 7088de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe struct rb_node *n = rb_first(&td->io_hist_tree); 709e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 7108de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe ipo = rb_entry(n, struct io_piece, rb_node); 7114b87898e8d76aaf05baec83077a11311c1447397Jens Axboe rb_erase(n, &td->io_hist_tree); 71201743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe } else if (!flist_empty(&td->io_hist_list)) { 71301743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe ipo = flist_entry(td->io_hist_list.next, struct io_piece, list); 71401743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe flist_del(&ipo->list); 7158de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe } 716e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 7178de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe if (ipo) { 718e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe io_u->offset = ipo->offset; 719e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe io_u->buflen = ipo->len; 72036167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe io_u->file = ipo->file; 72197af62cec418cd722fb43c6010d6430534e12353Jens Axboe 722d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (!fio_file_open(io_u->file)) { 72397af62cec418cd722fb43c6010d6430534e12353Jens Axboe int r = td_io_open_file(td, io_u->file); 72497af62cec418cd722fb43c6010d6430534e12353Jens Axboe 725bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe if (r) { 726bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "failed file %s open\n", 727bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u->file->file_name); 72897af62cec418cd722fb43c6010d6430534e12353Jens Axboe return 1; 729bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe } 73097af62cec418cd722fb43c6010d6430534e12353Jens Axboe } 73197af62cec418cd722fb43c6010d6430534e12353Jens Axboe 73297af62cec418cd722fb43c6010d6430534e12353Jens Axboe get_file(ipo->file); 733d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe assert(fio_file_open(io_u->file)); 734e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe io_u->ddir = DDIR_READ; 73536167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe io_u->xfer_buf = io_u->buf; 73636167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe io_u->xfer_buflen = io_u->buflen; 737e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe free(ipo); 738bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "get_next_verify: ret io_u %p\n", io_u); 739e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe return 0; 740e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe } 741e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 742bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "get_next_verify: empty\n"); 743e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe return 1; 744e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 745e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 746e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboestatic void *verify_async_thread(void *data) 747e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{ 748e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe struct thread_data *td = data; 749e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe struct io_u *io_u; 750e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe int ret = 0; 751e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 752e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (td->o.verify_cpumask_set && 753e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe fio_setaffinity(td->pid, td->o.verify_cpumask)) { 754e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe log_err("fio: failed setting verify thread affinity\n"); 755e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe goto done; 756e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 757e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 758e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe do { 759e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe FLIST_HEAD(list); 760e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe 761e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe read_barrier(); 762e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (td->verify_thread_exit) 763e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe break; 764e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 765e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_lock(&td->io_u_lock); 766e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 767e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe while (flist_empty(&td->verify_list) && 768e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe !td->verify_thread_exit) { 769e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe ret = pthread_cond_wait(&td->verify_cond, &td->io_u_lock); 770e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (ret) { 771e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 772e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe break; 773e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 774e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 775e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 776e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe flist_splice_init(&td->verify_list, &list); 777e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 778e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe 779e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe if (flist_empty(&list)) 780e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe continue; 781e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 782e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe while (!flist_empty(&list)) { 783e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe io_u = flist_entry(list.next, struct io_u, list); 784e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe flist_del_init(&io_u->list); 785e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 786d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe ret = verify_io_u(td, io_u); 787e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe put_io_u(td, io_u); 788d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe if (!ret) 789d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe continue; 790d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe if (td->o.continue_on_error && 791d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe td_non_fatal_error(ret)) { 792d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe update_error_count(td, ret); 793d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe td_clear_error(td); 794d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe ret = 0; 795d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe } 796e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe } 797e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } while (!ret); 798e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 799d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe if (ret) { 800d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe td_verror(td, ret, "async_verify"); 801d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe td->terminate = 1; 802d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe } 803d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe 804e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboedone: 805e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_lock(&td->io_u_lock); 806e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->nr_verify_threads--; 807e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 808e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 809e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_signal(&td->free_cond); 810e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe return NULL; 811e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe} 812e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 813e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_async_init(struct thread_data *td) 814e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{ 815e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe int i, ret; 816e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 817e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_thread_exit = 0; 818e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 819e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_threads = malloc(sizeof(pthread_t) * td->o.verify_async); 820e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe for (i = 0; i < td->o.verify_async; i++) { 821e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe ret = pthread_create(&td->verify_threads[i], NULL, 822e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe verify_async_thread, td); 823e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (ret) { 824e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe log_err("fio: async verify creation failed: %s\n", 825e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe strerror(ret)); 826e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe break; 827e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 828e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe ret = pthread_detach(td->verify_threads[i]); 829e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (ret) { 830e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe log_err("fio: async verify thread detach failed: %s\n", 831e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe strerror(ret)); 832e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe break; 833e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 834e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->nr_verify_threads++; 835e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 836e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 837e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (i != td->o.verify_async) { 838e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_thread_exit = 1; 839e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe write_barrier(); 840e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_broadcast(&td->verify_cond); 841e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe return 1; 842e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 843e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 844e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe return 0; 845e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe} 846e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 847e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboevoid verify_async_exit(struct thread_data *td) 848e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{ 849e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_thread_exit = 1; 850e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe write_barrier(); 851e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_broadcast(&td->verify_cond); 852e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 853e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_lock(&td->io_u_lock); 854e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 855e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe while (td->nr_verify_threads) 856e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_wait(&td->free_cond, &td->io_u_lock); 857e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 858e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 859e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe free(td->verify_threads); 860e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_threads = NULL; 861e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe} 862