verify.c revision d6aed795f2e3e403828abf60874dd2d6e8342a1b
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> 8e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 9e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe#include "fio.h" 10e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 11eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/md5.h" 12eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc64.h" 13eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc32.h" 14bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe#include "crc/crc32c.h" 15eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc16.h" 16eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc7.h" 17eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/sha256.h" 18eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/sha512.h" 19cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 2090059d65bde4804e4da07401ad6902c1d956b592Jens Axboestatic void fill_random_bytes(struct thread_data *td, void *p, unsigned int len) 21e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 22e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe unsigned int todo; 234c5946c6606abc87ba7e2bfc57a5030d19b6d4d5Jens Axboe int r; 24e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 25e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe while (len) { 264c5946c6606abc87ba7e2bfc57a5030d19b6d4d5Jens Axboe r = os_random_long(&td->verify_state); 27e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 28e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe /* 29e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * lrand48_r seems to be broken and only fill the bottom 30e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * 32-bits, even on 64-bit archs with 64-bit longs 31e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe */ 32e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe todo = sizeof(r); 33e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe if (todo > len) 34e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe todo = len; 35e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 36e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe memcpy(p, &r, todo); 37e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 38e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe len -= todo; 39e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe p += todo; 40e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe } 41e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 42e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 4390059d65bde4804e4da07401ad6902c1d956b592Jens Axboestatic void fill_pattern(struct thread_data *td, void *p, unsigned int len) 4490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe{ 4590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe switch (td->o.verify_pattern_bytes) { 4690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe case 0: 47bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill random bytes len=%u\n", len); 4890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe fill_random_bytes(td, p, len); 4990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe break; 5090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe case 1: 51bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill verify pattern b=0 len=%u\n", len); 5290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe memset(p, td->o.verify_pattern, len); 5390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe break; 5490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe case 2: 5590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe case 3: 5690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe case 4: { 5790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe unsigned int pattern = td->o.verify_pattern; 5890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe unsigned int i = 0; 5990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe unsigned char c1, c2, c3, c4; 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 c1 = pattern & 0xff; 6690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe pattern >>= 8; 6790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe c2 = pattern & 0xff; 6890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe pattern >>= 8; 6990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe c3 = pattern & 0xff; 7090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe pattern >>= 8; 7190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe c4 = pattern & 0xff; 7290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe 7390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe while (i < len) { 7490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe b[i++] = c1; 7590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe if (i == len) 7690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe break; 7790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe b[i++] = c2; 7890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe if (td->o.verify_pattern_bytes == 2 || i == len) 7990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe continue; 8090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe b[i++] = c3; 8190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe if (td->o.verify_pattern_bytes == 3 || i == len) 8290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe continue; 8390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe b[i++] = c4; 8490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe } 8590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe break; 8690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe } 8790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe } 8890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe} 8990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe 904764aec9fe5988281bdc114c13ac771fb16713ccJens Axboestatic void memswp(void *buf1, void *buf2, unsigned int len) 91546a9142511875524850ac92776184fd9fb7196eShawn Lewis{ 92dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis char swap[200]; 93dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis 94dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis assert(len <= sizeof(swap)); 9590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe 96546a9142511875524850ac92776184fd9fb7196eShawn Lewis memcpy(&swap, buf1, len); 97546a9142511875524850ac92776184fd9fb7196eShawn Lewis memcpy(buf1, buf2, len); 98546a9142511875524850ac92776184fd9fb7196eShawn Lewis memcpy(buf2, &swap, len); 99546a9142511875524850ac92776184fd9fb7196eShawn Lewis} 100546a9142511875524850ac92776184fd9fb7196eShawn Lewis 101e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void hexdump(void *buffer, int len) 102e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 103e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe unsigned char *p = buffer; 104e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe int i; 105e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 106e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe for (i = 0; i < len; i++) 1076d86144dd10b05e8b82e9b895c35dd778e5e71abJens Axboe log_info("%02x", p[i]); 1086d86144dd10b05e8b82e9b895c35dd778e5e71abJens Axboe log_info("\n"); 109e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 110e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 111d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe/* 1128767783245faac99a7e1c330a1d6536e579c8402Jens Axboe * Prepare for seperation of verify_header and checksum header 1138767783245faac99a7e1c330a1d6536e579c8402Jens Axboe */ 114546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic inline unsigned int __hdr_size(int verify_type) 1158767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{ 1165921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe unsigned int len = len; 1178767783245faac99a7e1c330a1d6536e579c8402Jens Axboe 118546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe switch (verify_type) { 119546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_NONE: 120546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_NULL: 121546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = 0; 122546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 123546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_MD5: 124546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_md5); 125546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 126546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC64: 127546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc64); 128546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 129bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe case VERIFY_CRC32C: 130546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC32: 1313845591fadea480177223e28c9d1c03642d34f0eJens Axboe case VERIFY_CRC32C_INTEL: 132546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc32); 133546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 134546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC16: 135546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc16); 136546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 137546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC7: 138546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc7); 139546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 140546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_SHA256: 141546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_sha256); 142546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 143546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_SHA512: 144546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_sha512); 145546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 1467437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis case VERIFY_META: 1477437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis len = sizeof(struct vhdr_meta); 1487437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis break; 149546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe default: 150546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe log_err("fio: unknown verify header!\n"); 151546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe assert(0); 152546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe } 153546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 154546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe return len + sizeof(struct verify_header); 1558767783245faac99a7e1c330a1d6536e579c8402Jens Axboe} 1568767783245faac99a7e1c330a1d6536e579c8402Jens Axboe 1578767783245faac99a7e1c330a1d6536e579c8402Jens Axboestatic inline unsigned int hdr_size(struct verify_header *hdr) 1588767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{ 159546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe return __hdr_size(hdr->verify_type); 160546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe} 161546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 162546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic void *hdr_priv(struct verify_header *hdr) 163546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe{ 164546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe void *priv = hdr; 165546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 166546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe return priv + sizeof(struct verify_header); 1678767783245faac99a7e1c330a1d6536e579c8402Jens Axboe} 1688767783245faac99a7e1c330a1d6536e579c8402Jens Axboe 1698767783245faac99a7e1c330a1d6536e579c8402Jens Axboe/* 170d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe * Return data area 'header_num' 171d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe */ 172d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboestatic inline void *io_u_verify_off(struct verify_header *hdr, 1735ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe struct io_u *io_u, unsigned char header_num) 174d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe{ 1758767783245faac99a7e1c330a1d6536e579c8402Jens Axboe return io_u->buf + header_num * hdr->len + hdr_size(hdr); 176d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe} 177d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe 1787437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic int verify_io_u_meta(struct verify_header *hdr, struct thread_data *td, 1795ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe struct io_u *io_u, unsigned int header_num) 1807437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{ 1817437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis struct vhdr_meta *vh = hdr_priv(hdr); 1827437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 183bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "meta verify io_u %p, len %u\n", io_u, hdr->len); 184bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 1857437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis if (vh->offset != io_u->offset + header_num * td->o.verify_interval) { 1867437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis log_err("meta: verify failed at %llu/%u\n", 1875ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe io_u->offset + header_num * hdr->len, hdr->len); 1889fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 1897437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis } 1907437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 1917437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis return 0; 1927437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis} 1937437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 194cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic int verify_io_u_sha512(struct verify_header *hdr, struct io_u *io_u, 195cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe unsigned int header_num) 196cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 197cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe void *p = io_u_verify_off(hdr, io_u, header_num); 198546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha512 *vh = hdr_priv(hdr); 199cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe uint8_t sha512[128]; 200cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe struct sha512_ctx sha512_ctx = { 201cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe .buf = sha512, 202cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 203cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 204bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "sha512 verify io_u %p, len %u\n", io_u, hdr->len); 205bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 206cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha512_init(&sha512_ctx); 2078767783245faac99a7e1c330a1d6536e579c8402Jens Axboe sha512_update(&sha512_ctx, p, hdr->len - hdr_size(hdr)); 208cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 209546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (memcmp(vh->sha512, sha512_ctx.buf, sizeof(sha512))) { 210cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe log_err("sha512: verify failed at %llu/%u\n", 2115ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe io_u->offset + header_num * hdr->len, hdr->len); 212546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe hexdump(vh->sha512, sizeof(vh->sha512)); 213cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe hexdump(sha512_ctx.buf, sizeof(sha512)); 2149fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 215cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe } 216cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 217cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe return 0; 218cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 219cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 220cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic int verify_io_u_sha256(struct verify_header *hdr, struct io_u *io_u, 221cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe unsigned int header_num) 222cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 223cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe void *p = io_u_verify_off(hdr, io_u, header_num); 224546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha256 *vh = hdr_priv(hdr); 225cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe uint8_t sha256[128]; 226cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe struct sha256_ctx sha256_ctx = { 227cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe .buf = sha256, 228cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 229cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 230bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "sha256 verify io_u %p, len %u\n", io_u, hdr->len); 231bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 232cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha256_init(&sha256_ctx); 2338767783245faac99a7e1c330a1d6536e579c8402Jens Axboe sha256_update(&sha256_ctx, p, hdr->len - hdr_size(hdr)); 234cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 235546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (memcmp(vh->sha256, sha256_ctx.buf, sizeof(sha256))) { 236cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe log_err("sha256: verify failed at %llu/%u\n", 2375ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe io_u->offset + header_num * hdr->len, hdr->len); 238546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe hexdump(vh->sha256, sizeof(vh->sha256)); 239cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe hexdump(sha256_ctx.buf, sizeof(sha256)); 2409fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 241cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe } 242cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 243cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe return 0; 244cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 245cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 2463f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_crc7(struct verify_header *hdr, struct io_u *io_u, 2475ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe unsigned char header_num) 2481e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{ 249d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe void *p = io_u_verify_off(hdr, io_u, header_num); 250546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc7 *vh = hdr_priv(hdr); 2511e154bdbf14a1d352117aea057035235b66f0381Jens Axboe unsigned char c; 2521e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 253bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "crc7 verify io_u %p, len %u\n", io_u, hdr->len); 254bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 2558767783245faac99a7e1c330a1d6536e579c8402Jens Axboe c = crc7(p, hdr->len - hdr_size(hdr)); 2561e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 257546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (c != vh->crc7) { 2583f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("crc7: verify failed at %llu/%u\n", 2595ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe io_u->offset + header_num * hdr->len, hdr->len); 260546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe log_err("crc7: wanted %x, got %x\n", vh->crc7, c); 2619fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 2621e154bdbf14a1d352117aea057035235b66f0381Jens Axboe } 2631e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 2641e154bdbf14a1d352117aea057035235b66f0381Jens Axboe return 0; 2651e154bdbf14a1d352117aea057035235b66f0381Jens Axboe} 2661e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 2673f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_crc16(struct verify_header *hdr, struct io_u *io_u, 2685ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe unsigned int header_num) 269969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{ 270d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe void *p = io_u_verify_off(hdr, io_u, header_num); 271546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc16 *vh = hdr_priv(hdr); 272969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe unsigned short c; 273969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 274bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "crc16 verify io_u %p, len %u\n", io_u, hdr->len); 275bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 2768767783245faac99a7e1c330a1d6536e579c8402Jens Axboe c = crc16(p, hdr->len - hdr_size(hdr)); 277969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 278546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (c != vh->crc16) { 2793f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("crc16: verify failed at %llu/%u\n", 2805ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe io_u->offset + header_num * hdr->len, hdr->len); 281546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe log_err("crc16: wanted %x, got %x\n", vh->crc16, c); 2829fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 283969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe } 284969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 285969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe return 0; 286969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe} 287969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 2883f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_crc64(struct verify_header *hdr, struct io_u *io_u, 2895ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe unsigned int header_num) 290d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{ 291d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe void *p = io_u_verify_off(hdr, io_u, header_num); 292546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc64 *vh = hdr_priv(hdr); 293d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe unsigned long long c; 294d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 295bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "crc64 verify io_u %p, len %u\n", io_u, hdr->len); 296bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 2978767783245faac99a7e1c330a1d6536e579c8402Jens Axboe c = crc64(p, hdr->len - hdr_size(hdr)); 298d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 299546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (c != vh->crc64) { 3003f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("crc64: verify failed at %llu/%u\n", 3013f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis io_u->offset + header_num * hdr->len, 3023f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis hdr->len); 3035ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe log_err("crc64: wanted %llx, got %llx\n", 3045ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe (unsigned long long) vh->crc64, c); 3059fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 306d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe } 307d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 308d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe return 0; 309d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe} 310d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 3113f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_crc32(struct verify_header *hdr, struct io_u *io_u, 3125ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe unsigned int header_num) 313e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 314d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe void *p = io_u_verify_off(hdr, io_u, header_num); 315546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 316546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe uint32_t c; 317e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 318bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "crc32 verify io_u %p, len %u\n", io_u, hdr->len); 319bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 3208767783245faac99a7e1c330a1d6536e579c8402Jens Axboe c = crc32(p, hdr->len - hdr_size(hdr)); 321e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 322546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (c != vh->crc32) { 3233f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("crc32: verify failed at %llu/%u\n", 3245ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe io_u->offset + header_num * hdr->len, hdr->len); 325546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe log_err("crc32: wanted %x, got %x\n", vh->crc32, c); 3269fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 327e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe } 328e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 329e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe return 0; 330e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 331e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 332bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboestatic int verify_io_u_crc32c(struct verify_header *hdr, struct io_u *io_u, 333bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe unsigned int header_num) 334bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{ 335bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe void *p = io_u_verify_off(hdr, io_u, header_num); 336bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 337bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe uint32_t c; 338bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 339bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe dprint(FD_VERIFY, "crc32c verify io_u %p, len %u\n", io_u, hdr->len); 340bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 3413845591fadea480177223e28c9d1c03642d34f0eJens Axboe if (hdr->verify_type == VERIFY_CRC32C_INTEL) 3423845591fadea480177223e28c9d1c03642d34f0eJens Axboe c = crc32c_intel(p, hdr->len - hdr_size(hdr)); 3433845591fadea480177223e28c9d1c03642d34f0eJens Axboe else 3443845591fadea480177223e28c9d1c03642d34f0eJens Axboe c = crc32c(p, hdr->len - hdr_size(hdr)); 345bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 346bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe if (c != vh->crc32) { 347bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe log_err("crc32c: verify failed at %llu/%u\n", 348bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe io_u->offset + header_num * hdr->len, hdr->len); 349bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe log_err("crc32c: wanted %x, got %x\n", vh->crc32, c); 3509fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 351bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe } 352bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 353bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe return 0; 354bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe} 355bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 3563f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_md5(struct verify_header *hdr, struct io_u *io_u, 3575ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe unsigned int header_num) 358e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 359d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe void *p = io_u_verify_off(hdr, io_u, header_num); 360546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_md5 *vh = hdr_priv(hdr); 3618c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe uint32_t hash[MD5_HASH_WORDS]; 3628c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe struct md5_ctx md5_ctx = { 3638c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe .hash = hash, 3648c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe }; 365e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 366bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "md5 verify io_u %p, len %u\n", io_u, hdr->len); 367bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 36861f821f16cf27d8742e09b3a137c933cd0085e9bJens Axboe md5_init(&md5_ctx); 3698767783245faac99a7e1c330a1d6536e579c8402Jens Axboe md5_update(&md5_ctx, p, hdr->len - hdr_size(hdr)); 370e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 371546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (memcmp(vh->md5_digest, md5_ctx.hash, sizeof(hash))) { 3723f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("md5: verify failed at %llu/%u\n", 3735ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe io_u->offset + header_num * hdr->len, hdr->len); 374546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe hexdump(vh->md5_digest, sizeof(vh->md5_digest)); 3758c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe hexdump(md5_ctx.hash, sizeof(hash)); 3769fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 377e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe } 378e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 379e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe return 0; 380e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 381e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 3823f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboestatic unsigned int hweight8(unsigned int w) 3833f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe{ 3843f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe unsigned int res = w - ((w >> 1) & 0x55); 3853f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe 3863f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe res = (res & 0x33) + ((res >> 2) & 0x33); 3873f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe return (res + (res >> 4)) & 0x0F; 3883f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe} 3893f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe 390a944e335fac62c75966b417a25ec107c40957cdbShawn Lewisint verify_io_u_pattern(unsigned long pattern, unsigned long pattern_size, 3915ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe char *buf, unsigned int len, unsigned int mod) 392a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis{ 393a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis unsigned int i; 394a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis char split_pattern[4]; 395a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis 396a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis for (i = 0; i < 4; i++) { 397a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis split_pattern[i] = pattern & 0xff; 398a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis pattern >>= 8; 399a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis } 400a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis 401a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis for (i = 0; i < len; i++) { 4023f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe if (buf[i] != split_pattern[mod]) { 4033f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe unsigned int bits; 4043f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe 4053f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe bits = hweight8(buf[i] ^ split_pattern[mod]); 4063f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe log_err("fio: got pattern %x, wanted %x. Bad bits %d\n", 4073f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe buf[i], split_pattern[mod], bits); 4083f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe log_err("fio: bad pattern block offset %u\n", i); 4099fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 4103f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe } 411a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis mod++; 412a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis if (mod == pattern_size) 413a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis mod = 0; 414a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis } 415a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis 416a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis return 0; 417a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis} 418a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis 41936690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboeint verify_io_u(struct thread_data *td, struct io_u *io_u) 420e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 4213f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis struct verify_header *hdr; 422a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis unsigned int hdr_size, hdr_inc, hdr_num = 0; 42395646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe void *p; 424e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe int ret; 425e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 4261dcc049824b840df1ee0ef5d019fffa4037e1bb0Shawn Lewis if (td->o.verify == VERIFY_NULL || io_u->ddir != DDIR_READ) 42736690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe return 0; 42836690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe 4293f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis hdr_inc = io_u->buflen; 430a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe if (td->o.verify_interval) 431a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe hdr_inc = td->o.verify_interval; 432e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 433a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe ret = 0; 4345ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe for (p = io_u->buf; p < io_u->buf + io_u->buflen; 4355ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe p += hdr_inc, hdr_num++) { 436a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe if (ret && td->o.verify_fatal) { 437a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe td->terminate = 1; 438a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe break; 439a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe } 440a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis hdr_size = __hdr_size(td->o.verify); 441a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe if (td->o.verify_offset) 442a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis memswp(p, p + td->o.verify_offset, hdr_size); 44395646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe hdr = p; 444e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 4453f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe if (hdr->fio_magic != FIO_HDR_MAGIC) { 4463f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe log_err("Bad verify header %x\n", hdr->fio_magic); 4479fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 4483f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe } 4493f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe 450e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis if (td->o.verify_pattern_bytes) { 451bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "pattern verify io_u %p, len %u\n", 452bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 453e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis ret = verify_io_u_pattern(td->o.verify_pattern, 4545ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe td->o.verify_pattern_bytes, 4555ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe p + hdr_size, 4565ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe hdr_inc - hdr_size, 4575ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe hdr_size % 4); 458e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis if (ret) 459e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis log_err("fio: verify failed at %llu/%u\n", 460e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis io_u->offset + hdr_num * hdr->len, 461e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis hdr->len); 462e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis continue; 463e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis } 464e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis 4653f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis switch (hdr->verify_type) { 4663f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_MD5: 4673f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis ret = verify_io_u_md5(hdr, io_u, hdr_num); 4683f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 4693f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC64: 4703f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis ret = verify_io_u_crc64(hdr, io_u, hdr_num); 4713f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 472bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe case VERIFY_CRC32C: 4733845591fadea480177223e28c9d1c03642d34f0eJens Axboe case VERIFY_CRC32C_INTEL: 474bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe ret = verify_io_u_crc32c(hdr, io_u, hdr_num); 475bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe break; 4763f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC32: 4773f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis ret = verify_io_u_crc32(hdr, io_u, hdr_num); 4783f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 4793f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC16: 4803f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis ret = verify_io_u_crc16(hdr, io_u, hdr_num); 4813f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 4823f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC7: 4833f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis ret = verify_io_u_crc7(hdr, io_u, hdr_num); 4843f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 485cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe case VERIFY_SHA256: 486cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe ret = verify_io_u_sha256(hdr, io_u, hdr_num); 487cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe break; 488cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe case VERIFY_SHA512: 489cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe ret = verify_io_u_sha512(hdr, io_u, hdr_num); 490cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe break; 4917437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis case VERIFY_META: 4927437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis ret = verify_io_u_meta(hdr, td, io_u, hdr_num); 4937437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis break; 4943f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis default: 4953f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("Bad verify type %u\n", hdr->verify_type); 496d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe ret = EINVAL; 4973f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis } 4983f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis } 499a7dfe862c2e3fe72b8db6a6e67302048d3731c6dJens Axboe 500a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe return ret; 501e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 502e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 5037437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic void fill_meta(struct verify_header *hdr, struct thread_data *td, 5045ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe struct io_u *io_u, unsigned int header_num) 5057437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{ 5067437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis struct vhdr_meta *vh = hdr_priv(hdr); 5077437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 5087437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->thread = td->thread_number; 5097437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 5107437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->time_sec = io_u->start_time.tv_sec; 5117437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->time_usec = io_u->start_time.tv_usec; 5127437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 5137437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->numberio = td->io_issues[DDIR_WRITE]; 5147437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 5157437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->offset = io_u->offset + header_num * td->o.verify_interval; 5167437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis} 5177437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 518cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha512(struct verify_header *hdr, void *p, unsigned int len) 519cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 520546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha512 *vh = hdr_priv(hdr); 521cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe struct sha512_ctx sha512_ctx = { 522546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe .buf = vh->sha512, 523cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 524cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 525cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha512_init(&sha512_ctx); 526cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha512_update(&sha512_ctx, p, len); 527cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 528cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 529cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha256(struct verify_header *hdr, void *p, unsigned int len) 530cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 531546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha256 *vh = hdr_priv(hdr); 532cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe struct sha256_ctx sha256_ctx = { 533546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe .buf = vh->sha256, 534cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 535cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 536cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha256_init(&sha256_ctx); 537cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha256_update(&sha256_ctx, p, len); 538cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 539cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 5401e154bdbf14a1d352117aea057035235b66f0381Jens Axboestatic void fill_crc7(struct verify_header *hdr, void *p, unsigned int len) 5411e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{ 542546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc7 *vh = hdr_priv(hdr); 543546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 544546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe vh->crc7 = crc7(p, len); 5451e154bdbf14a1d352117aea057035235b66f0381Jens Axboe} 5461e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 547969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboestatic void fill_crc16(struct verify_header *hdr, void *p, unsigned int len) 548969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{ 549546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc16 *vh = hdr_priv(hdr); 550546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 551546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe vh->crc16 = crc16(p, len); 552969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe} 553969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 554e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_crc32(struct verify_header *hdr, void *p, unsigned int len) 555e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 556546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 557546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 558546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe vh->crc32 = crc32(p, len); 559e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 560e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 561bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboestatic void fill_crc32c(struct verify_header *hdr, void *p, unsigned int len) 562bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{ 563bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 564bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 5653845591fadea480177223e28c9d1c03642d34f0eJens Axboe if (hdr->verify_type == VERIFY_CRC32C_INTEL) 5663845591fadea480177223e28c9d1c03642d34f0eJens Axboe vh->crc32 = crc32c_intel(p, len); 5673845591fadea480177223e28c9d1c03642d34f0eJens Axboe else 5683845591fadea480177223e28c9d1c03642d34f0eJens Axboe vh->crc32 = crc32c(p, len); 569bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe} 570bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 571d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboestatic void fill_crc64(struct verify_header *hdr, void *p, unsigned int len) 572d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{ 573546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc64 *vh = hdr_priv(hdr); 574546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 575546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe vh->crc64 = crc64(p, len); 576d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe} 577d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 578e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_md5(struct verify_header *hdr, void *p, unsigned int len) 579e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 580546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_md5 *vh = hdr_priv(hdr); 5818c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe struct md5_ctx md5_ctx = { 582546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe .hash = (uint32_t *) vh->md5_digest, 5838c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe }; 584e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 58561f821f16cf27d8742e09b3a137c933cd0085e9bJens Axboe md5_init(&md5_ctx); 586e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe md5_update(&md5_ctx, p, len); 587e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 588e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 589e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe/* 590e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * fill body of io_u->buf with random data and add a header with the 591e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * crc32 or md5 sum of that data. 592e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe */ 593e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboevoid populate_verify_io_u(struct thread_data *td, struct io_u *io_u) 594e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 595baefa9beacca430b8e3275c07d2f46ef14654468Jens Axboe struct verify_header *hdr; 59695646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe void *p = io_u->buf, *data; 5977437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis unsigned int hdr_inc, data_len, header_num = 0; 598e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 5999cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe if (td->o.verify == VERIFY_NULL) 6009cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe return; 6019cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe 60290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe fill_pattern(td, p, io_u->buflen); 603546a9142511875524850ac92776184fd9fb7196eShawn Lewis 604546a9142511875524850ac92776184fd9fb7196eShawn Lewis hdr_inc = io_u->buflen; 605a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe if (td->o.verify_interval) 606a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe hdr_inc = td->o.verify_interval; 607baefa9beacca430b8e3275c07d2f46ef14654468Jens Axboe 6085ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe for (; p < io_u->buf + io_u->buflen; p += hdr_inc) { 60995646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe hdr = p; 6103f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis 6113f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis hdr->fio_magic = FIO_HDR_MAGIC; 6123f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis hdr->verify_type = td->o.verify; 613546a9142511875524850ac92776184fd9fb7196eShawn Lewis hdr->len = hdr_inc; 6148767783245faac99a7e1c330a1d6536e579c8402Jens Axboe data_len = hdr_inc - hdr_size(hdr); 6153f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis 6168767783245faac99a7e1c330a1d6536e579c8402Jens Axboe data = p + hdr_size(hdr); 6173f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis switch (td->o.verify) { 6183f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_MD5: 619bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill md5 io_u %p, len %u\n", 620bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 6213f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis fill_md5(hdr, data, data_len); 6223f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 6233f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC64: 624bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill crc64 io_u %p, len %u\n", 625bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 6263f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis fill_crc64(hdr, data, data_len); 6273f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 628bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe case VERIFY_CRC32C: 6293845591fadea480177223e28c9d1c03642d34f0eJens Axboe case VERIFY_CRC32C_INTEL: 630bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe dprint(FD_VERIFY, "fill crc32c io_u %p, len %u\n", 631bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe io_u, hdr->len); 632bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe fill_crc32c(hdr, data, data_len); 633bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe break; 6343f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC32: 635bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill crc32 io_u %p, len %u\n", 636bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 6373f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis fill_crc32(hdr, data, data_len); 6383f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 6393f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC16: 640bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill crc16 io_u %p, len %u\n", 641bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 6423f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis fill_crc16(hdr, data, data_len); 6433f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 6443f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC7: 645bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill crc7 io_u %p, len %u\n", 646bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 6473f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis fill_crc7(hdr, data, data_len); 6483f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 649cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe case VERIFY_SHA256: 650bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill sha256 io_u %p, len %u\n", 651bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 652cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe fill_sha256(hdr, data, data_len); 653cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe break; 654cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe case VERIFY_SHA512: 655bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill sha512 io_u %p, len %u\n", 656bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 657cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe fill_sha512(hdr, data, data_len); 658cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe break; 6597437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis case VERIFY_META: 660bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill meta io_u %p, len %u\n", 661bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 6627437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis fill_meta(hdr, td, io_u, header_num); 6637437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis break; 6643f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis default: 6653f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("fio: bad verify type: %d\n", td->o.verify); 6663f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis assert(0); 6673f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis } 668a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe if (td->o.verify_offset) 6698767783245faac99a7e1c330a1d6536e579c8402Jens Axboe memswp(p, p + td->o.verify_offset, hdr_size(hdr)); 6707437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis header_num++; 671e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe } 672e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 673e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 674e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboeint get_next_verify(struct thread_data *td, struct io_u *io_u) 675e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 6768de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe struct io_piece *ipo = NULL; 677e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 678d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe /* 679d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe * this io_u is from a requeue, we already filled the offsets 680d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe */ 681d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe if (io_u->file) 682d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe return 0; 683d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe 6848de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe if (!RB_EMPTY_ROOT(&td->io_hist_tree)) { 6858de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe struct rb_node *n = rb_first(&td->io_hist_tree); 686e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 6878de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe ipo = rb_entry(n, struct io_piece, rb_node); 6884b87898e8d76aaf05baec83077a11311c1447397Jens Axboe rb_erase(n, &td->io_hist_tree); 68901743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe } else if (!flist_empty(&td->io_hist_list)) { 69001743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe ipo = flist_entry(td->io_hist_list.next, struct io_piece, list); 69101743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe flist_del(&ipo->list); 6928de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe } 693e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 6948de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe if (ipo) { 695e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe io_u->offset = ipo->offset; 696e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe io_u->buflen = ipo->len; 69736167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe io_u->file = ipo->file; 69897af62cec418cd722fb43c6010d6430534e12353Jens Axboe 699d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (!fio_file_open(io_u->file)) { 70097af62cec418cd722fb43c6010d6430534e12353Jens Axboe int r = td_io_open_file(td, io_u->file); 70197af62cec418cd722fb43c6010d6430534e12353Jens Axboe 702bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe if (r) { 703bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "failed file %s open\n", 704bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u->file->file_name); 70597af62cec418cd722fb43c6010d6430534e12353Jens Axboe return 1; 706bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe } 70797af62cec418cd722fb43c6010d6430534e12353Jens Axboe } 70897af62cec418cd722fb43c6010d6430534e12353Jens Axboe 70997af62cec418cd722fb43c6010d6430534e12353Jens Axboe get_file(ipo->file); 710d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe assert(fio_file_open(io_u->file)); 711e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe io_u->ddir = DDIR_READ; 71236167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe io_u->xfer_buf = io_u->buf; 71336167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe io_u->xfer_buflen = io_u->buflen; 714e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe free(ipo); 715bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "get_next_verify: ret io_u %p\n", io_u); 716e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe return 0; 717e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe } 718e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 719bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "get_next_verify: empty\n"); 720e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe return 1; 721e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 722