verify.c revision d16d4e09352f618c266d1efe27cbb25a95df6e86
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" 14eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc16.h" 15eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc7.h" 16eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/sha256.h" 17eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/sha512.h" 18cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 1990059d65bde4804e4da07401ad6902c1d956b592Jens Axboestatic void fill_random_bytes(struct thread_data *td, void *p, unsigned int len) 20e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 21e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe unsigned int todo; 224c5946c6606abc87ba7e2bfc57a5030d19b6d4d5Jens Axboe int r; 23e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 24e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe while (len) { 254c5946c6606abc87ba7e2bfc57a5030d19b6d4d5Jens Axboe r = os_random_long(&td->verify_state); 26e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 27e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe /* 28e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * lrand48_r seems to be broken and only fill the bottom 29e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * 32-bits, even on 64-bit archs with 64-bit longs 30e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe */ 31e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe todo = sizeof(r); 32e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe if (todo > len) 33e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe todo = len; 34e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 35e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe memcpy(p, &r, todo); 36e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 37e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe len -= todo; 38e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe p += todo; 39e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe } 40e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 41e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 4290059d65bde4804e4da07401ad6902c1d956b592Jens Axboestatic void fill_pattern(struct thread_data *td, void *p, unsigned int len) 4390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe{ 4490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe switch (td->o.verify_pattern_bytes) { 4590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe case 0: 4690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe fill_random_bytes(td, p, len); 4790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe break; 4890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe case 1: 4990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe memset(p, td->o.verify_pattern, len); 5090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe break; 5190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe case 2: 5290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe case 3: 5390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe case 4: { 5490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe unsigned int pattern = td->o.verify_pattern; 5590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe unsigned int i = 0; 5690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe unsigned char c1, c2, c3, c4; 5790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe unsigned char *b = p; 5890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe 5990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe c1 = pattern & 0xff; 6090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe pattern >>= 8; 6190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe c2 = pattern & 0xff; 6290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe pattern >>= 8; 6390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe c3 = pattern & 0xff; 6490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe pattern >>= 8; 6590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe c4 = pattern & 0xff; 6690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe 6790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe while (i < len) { 6890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe b[i++] = c1; 6990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe if (i == len) 7090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe break; 7190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe b[i++] = c2; 7290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe if (td->o.verify_pattern_bytes == 2 || i == len) 7390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe continue; 7490059d65bde4804e4da07401ad6902c1d956b592Jens Axboe b[i++] = c3; 7590059d65bde4804e4da07401ad6902c1d956b592Jens Axboe if (td->o.verify_pattern_bytes == 3 || i == len) 7690059d65bde4804e4da07401ad6902c1d956b592Jens Axboe continue; 7790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe b[i++] = c4; 7890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe } 7990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe break; 8090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe } 8190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe } 8290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe} 8390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe 844764aec9fe5988281bdc114c13ac771fb16713ccJens Axboestatic void memswp(void *buf1, void *buf2, unsigned int len) 85546a9142511875524850ac92776184fd9fb7196eShawn Lewis{ 86dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis char swap[200]; 87dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis 88dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis assert(len <= sizeof(swap)); 8990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe 90546a9142511875524850ac92776184fd9fb7196eShawn Lewis memcpy(&swap, buf1, len); 91546a9142511875524850ac92776184fd9fb7196eShawn Lewis memcpy(buf1, buf2, len); 92546a9142511875524850ac92776184fd9fb7196eShawn Lewis memcpy(buf2, &swap, len); 93546a9142511875524850ac92776184fd9fb7196eShawn Lewis} 94546a9142511875524850ac92776184fd9fb7196eShawn Lewis 95e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void hexdump(void *buffer, int len) 96e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 97e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe unsigned char *p = buffer; 98e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe int i; 99e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 100e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe for (i = 0; i < len; i++) 1016d86144dd10b05e8b82e9b895c35dd778e5e71abJens Axboe log_info("%02x", p[i]); 1026d86144dd10b05e8b82e9b895c35dd778e5e71abJens Axboe log_info("\n"); 103e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 104e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 105d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe/* 1068767783245faac99a7e1c330a1d6536e579c8402Jens Axboe * Prepare for seperation of verify_header and checksum header 1078767783245faac99a7e1c330a1d6536e579c8402Jens Axboe */ 108546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic inline unsigned int __hdr_size(int verify_type) 1098767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{ 110546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe unsigned int len; 1118767783245faac99a7e1c330a1d6536e579c8402Jens Axboe 112546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe switch (verify_type) { 113546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_NONE: 114546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_NULL: 115bfb41d98f63cb9fb72cb7c82618be10bc6d52c33Jens Axboe case VERIFY_PATTERN: 116546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = 0; 117546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 118546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_MD5: 119546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_md5); 120546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 121546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC64: 122546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc64); 123546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 124546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC32: 125546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc32); 126546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 127546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC16: 128546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc16); 129546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 130546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC7: 131546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc7); 132546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 133546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_SHA256: 134546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_sha256); 135546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 136546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_SHA512: 137546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_sha512); 138546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 1397437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis case VERIFY_META: 1407437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis len = sizeof(struct vhdr_meta); 1417437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis break; 142546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe default: 143546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe log_err("fio: unknown verify header!\n"); 144546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe assert(0); 145546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe } 146546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 147546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe return len + sizeof(struct verify_header); 1488767783245faac99a7e1c330a1d6536e579c8402Jens Axboe} 1498767783245faac99a7e1c330a1d6536e579c8402Jens Axboe 1508767783245faac99a7e1c330a1d6536e579c8402Jens Axboestatic inline unsigned int hdr_size(struct verify_header *hdr) 1518767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{ 152546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe return __hdr_size(hdr->verify_type); 153546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe} 154546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 155546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic void *hdr_priv(struct verify_header *hdr) 156546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe{ 157546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe void *priv = hdr; 158546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 159546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe return priv + sizeof(struct verify_header); 1608767783245faac99a7e1c330a1d6536e579c8402Jens Axboe} 1618767783245faac99a7e1c330a1d6536e579c8402Jens Axboe 1628767783245faac99a7e1c330a1d6536e579c8402Jens Axboe/* 163d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe * Return data area 'header_num' 164d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe */ 165d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboestatic inline void *io_u_verify_off(struct verify_header *hdr, 166d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe struct io_u *io_u, 167d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe unsigned char header_num) 168d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe{ 1698767783245faac99a7e1c330a1d6536e579c8402Jens Axboe return io_u->buf + header_num * hdr->len + hdr_size(hdr); 170d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe} 171d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe 1727437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic int verify_io_u_meta(struct verify_header *hdr, struct thread_data *td, 1737437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis struct io_u *io_u, unsigned int header_num) 1747437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{ 1757437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis struct vhdr_meta *vh = hdr_priv(hdr); 1767437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 1777437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis if (vh->offset != io_u->offset + header_num * td->o.verify_interval) { 1787437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis log_err("meta: verify failed at %llu/%u\n", 1797437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis io_u->offset + header_num * hdr->len, 1807437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis hdr->len); 181d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe return EIO; 1827437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis } 1837437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 1847437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis return 0; 1857437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis} 1867437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 187cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic int verify_io_u_sha512(struct verify_header *hdr, struct io_u *io_u, 188cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe unsigned int header_num) 189cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 190cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe void *p = io_u_verify_off(hdr, io_u, header_num); 191546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha512 *vh = hdr_priv(hdr); 192cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe uint8_t sha512[128]; 193cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe struct sha512_ctx sha512_ctx = { 194cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe .buf = sha512, 195cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 196cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 197cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha512_init(&sha512_ctx); 1988767783245faac99a7e1c330a1d6536e579c8402Jens Axboe sha512_update(&sha512_ctx, p, hdr->len - hdr_size(hdr)); 199cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 200546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (memcmp(vh->sha512, sha512_ctx.buf, sizeof(sha512))) { 201cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe log_err("sha512: verify failed at %llu/%u\n", 202cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe io_u->offset + header_num * hdr->len, 203cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe hdr->len); 204546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe hexdump(vh->sha512, sizeof(vh->sha512)); 205cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe hexdump(sha512_ctx.buf, sizeof(sha512)); 206d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe return EIO; 207cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe } 208cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 209cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe return 0; 210cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 211cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 212cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic int verify_io_u_sha256(struct verify_header *hdr, struct io_u *io_u, 213cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe unsigned int header_num) 214cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 215cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe void *p = io_u_verify_off(hdr, io_u, header_num); 216546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha256 *vh = hdr_priv(hdr); 217cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe uint8_t sha256[128]; 218cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe struct sha256_ctx sha256_ctx = { 219cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe .buf = sha256, 220cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 221cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 222cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha256_init(&sha256_ctx); 2238767783245faac99a7e1c330a1d6536e579c8402Jens Axboe sha256_update(&sha256_ctx, p, hdr->len - hdr_size(hdr)); 224cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 225546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (memcmp(vh->sha256, sha256_ctx.buf, sizeof(sha256))) { 226cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe log_err("sha256: verify failed at %llu/%u\n", 227cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe io_u->offset + header_num * hdr->len, 228cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe hdr->len); 229546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe hexdump(vh->sha256, sizeof(vh->sha256)); 230cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe hexdump(sha256_ctx.buf, sizeof(sha256)); 231d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe return EIO; 232cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe } 233cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 234cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe return 0; 235cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 236cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 2373f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_crc7(struct verify_header *hdr, struct io_u *io_u, 2383f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis unsigned char header_num) 2391e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{ 240d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe void *p = io_u_verify_off(hdr, io_u, header_num); 241546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc7 *vh = hdr_priv(hdr); 2421e154bdbf14a1d352117aea057035235b66f0381Jens Axboe unsigned char c; 2431e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 2448767783245faac99a7e1c330a1d6536e579c8402Jens Axboe c = crc7(p, hdr->len - hdr_size(hdr)); 2451e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 246546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (c != vh->crc7) { 2473f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("crc7: verify failed at %llu/%u\n", 2483f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis io_u->offset + header_num * hdr->len, 2493f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis hdr->len); 250546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe log_err("crc7: wanted %x, got %x\n", vh->crc7, c); 251d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe return EIO; 2521e154bdbf14a1d352117aea057035235b66f0381Jens Axboe } 2531e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 2541e154bdbf14a1d352117aea057035235b66f0381Jens Axboe return 0; 2551e154bdbf14a1d352117aea057035235b66f0381Jens Axboe} 2561e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 2573f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_crc16(struct verify_header *hdr, struct io_u *io_u, 2583f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis unsigned int header_num) 259969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{ 260d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe void *p = io_u_verify_off(hdr, io_u, header_num); 261546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc16 *vh = hdr_priv(hdr); 262969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe unsigned short c; 263969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 2648767783245faac99a7e1c330a1d6536e579c8402Jens Axboe c = crc16(p, hdr->len - hdr_size(hdr)); 265969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 266546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (c != vh->crc16) { 2673f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("crc16: verify failed at %llu/%u\n", 2683f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis io_u->offset + header_num * hdr->len, 2693f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis hdr->len); 270546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe log_err("crc16: wanted %x, got %x\n", vh->crc16, c); 271d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe return EIO; 272969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe } 273969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 274969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe return 0; 275969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe} 276969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 2773f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_crc64(struct verify_header *hdr, struct io_u *io_u, 2783f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis unsigned int header_num) 279d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{ 280d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe void *p = io_u_verify_off(hdr, io_u, header_num); 281546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc64 *vh = hdr_priv(hdr); 282d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe unsigned long long c; 283d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 2848767783245faac99a7e1c330a1d6536e579c8402Jens Axboe c = crc64(p, hdr->len - hdr_size(hdr)); 285d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 286546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (c != vh->crc64) { 2873f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("crc64: verify failed at %llu/%u\n", 2883f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis io_u->offset + header_num * hdr->len, 2893f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis hdr->len); 290546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe log_err("crc64: wanted %llx, got %llx\n", (unsigned long long) vh->crc64, c); 291d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe return EIO; 292d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe } 293d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 294d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe return 0; 295d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe} 296d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 2973f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_crc32(struct verify_header *hdr, struct io_u *io_u, 2983f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis unsigned int header_num) 299e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 300d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe void *p = io_u_verify_off(hdr, io_u, header_num); 301546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 302546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe uint32_t c; 303e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 3048767783245faac99a7e1c330a1d6536e579c8402Jens Axboe c = crc32(p, hdr->len - hdr_size(hdr)); 305e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 306546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (c != vh->crc32) { 3073f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("crc32: verify failed at %llu/%u\n", 3083f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis io_u->offset + header_num * hdr->len, 3093f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis hdr->len); 310546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe log_err("crc32: wanted %x, got %x\n", vh->crc32, c); 311d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe return EIO; 312e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe } 313e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 314e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe return 0; 315e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 316e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 3173f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewisstatic int verify_io_u_md5(struct verify_header *hdr, struct io_u *io_u, 3183f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis unsigned int header_num) 319e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 320d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe void *p = io_u_verify_off(hdr, io_u, header_num); 321546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_md5 *vh = hdr_priv(hdr); 3228c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe uint32_t hash[MD5_HASH_WORDS]; 3238c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe struct md5_ctx md5_ctx = { 3248c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe .hash = hash, 3258c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe }; 326e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 32761f821f16cf27d8742e09b3a137c933cd0085e9bJens Axboe md5_init(&md5_ctx); 3288767783245faac99a7e1c330a1d6536e579c8402Jens Axboe md5_update(&md5_ctx, p, hdr->len - hdr_size(hdr)); 329e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 330546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe if (memcmp(vh->md5_digest, md5_ctx.hash, sizeof(hash))) { 3313f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("md5: verify failed at %llu/%u\n", 3323f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis io_u->offset + header_num * hdr->len, 3333f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis hdr->len); 334546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe hexdump(vh->md5_digest, sizeof(vh->md5_digest)); 3358c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe hexdump(md5_ctx.hash, sizeof(hash)); 336d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe return EIO; 337e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe } 338e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 339e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe return 0; 340e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 341e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 3423f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboestatic unsigned int hweight8(unsigned int w) 3433f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe{ 3443f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe unsigned int res = w - ((w >> 1) & 0x55); 3453f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe 3463f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe res = (res & 0x33) + ((res >> 2) & 0x33); 3473f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe return (res + (res >> 4)) & 0x0F; 3483f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe} 3493f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe 350a944e335fac62c75966b417a25ec107c40957cdbShawn Lewisint verify_io_u_pattern(unsigned long pattern, unsigned long pattern_size, 3514764aec9fe5988281bdc114c13ac771fb16713ccJens Axboe char *buf, unsigned int len, unsigned int mod) 352a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis{ 353a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis unsigned int i; 354a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis char split_pattern[4]; 355a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis 356a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis for (i = 0; i < 4; i++) { 357a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis split_pattern[i] = pattern & 0xff; 358a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis pattern >>= 8; 359a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis } 360a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis 361a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis for (i = 0; i < len; i++) { 3623f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe if (buf[i] != split_pattern[mod]) { 3633f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe unsigned int bits; 3643f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe 3653f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe bits = hweight8(buf[i] ^ split_pattern[mod]); 3663f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe log_err("fio: got pattern %x, wanted %x. Bad bits %d\n", 3673f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe buf[i], split_pattern[mod], bits); 3683f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe log_err("fio: bad pattern block offset %u\n", i); 369d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe return EIO; 3703f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe } 371a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis mod++; 372a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis if (mod == pattern_size) 373a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis mod = 0; 374a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis } 375a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis 376a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis return 0; 377a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis} 378a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis 37936690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboeint verify_io_u(struct thread_data *td, struct io_u *io_u) 380e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 3813f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis struct verify_header *hdr; 382a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis unsigned int hdr_size, hdr_inc, hdr_num = 0; 38395646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe void *p; 384e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe int ret; 385e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 3861dcc049824b840df1ee0ef5d019fffa4037e1bb0Shawn Lewis if (td->o.verify == VERIFY_NULL || io_u->ddir != DDIR_READ) 38736690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe return 0; 38836690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe 3893f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis hdr_inc = io_u->buflen; 390a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe if (td->o.verify_interval) 391a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe hdr_inc = td->o.verify_interval; 392e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 393a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe ret = 0; 3943f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe for (p = io_u->buf; p < io_u->buf + io_u->buflen; p += hdr_inc, hdr_num++) { 395a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe if (ret && td->o.verify_fatal) { 396a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe td->terminate = 1; 397a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe break; 398a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe } 399a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis hdr_size = __hdr_size(td->o.verify); 400a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe if (td->o.verify_offset) 401a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis memswp(p, p + td->o.verify_offset, hdr_size); 40295646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe hdr = p; 403e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 4043f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe if (hdr->fio_magic != FIO_HDR_MAGIC) { 4053f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe log_err("Bad verify header %x\n", hdr->fio_magic); 4063f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe return EIO; 4073f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe } 4083f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe 4093f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis switch (hdr->verify_type) { 4103f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_MD5: 4113f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis ret = verify_io_u_md5(hdr, io_u, hdr_num); 4123f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 4133f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC64: 4143f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis ret = verify_io_u_crc64(hdr, io_u, hdr_num); 4153f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 4163f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC32: 4173f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis ret = verify_io_u_crc32(hdr, io_u, hdr_num); 4183f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 4193f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC16: 4203f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis ret = verify_io_u_crc16(hdr, io_u, hdr_num); 4213f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 4223f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC7: 4233f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis ret = verify_io_u_crc7(hdr, io_u, hdr_num); 4243f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 425cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe case VERIFY_SHA256: 426cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe ret = verify_io_u_sha256(hdr, io_u, hdr_num); 427cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe break; 428cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe case VERIFY_SHA512: 429cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe ret = verify_io_u_sha512(hdr, io_u, hdr_num); 430cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe break; 4317437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis case VERIFY_META: 4327437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis ret = verify_io_u_meta(hdr, td, io_u, hdr_num); 4337437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis break; 434bfb41d98f63cb9fb72cb7c82618be10bc6d52c33Jens Axboe case VERIFY_PATTERN: 435bfb41d98f63cb9fb72cb7c82618be10bc6d52c33Jens Axboe ret = verify_io_u_pattern(td->o.verify_pattern, 436bfb41d98f63cb9fb72cb7c82618be10bc6d52c33Jens Axboe td->o.verify_pattern_bytes, 437bfb41d98f63cb9fb72cb7c82618be10bc6d52c33Jens Axboe p + hdr_size, 438bfb41d98f63cb9fb72cb7c82618be10bc6d52c33Jens Axboe hdr_inc - hdr_size, 439bfb41d98f63cb9fb72cb7c82618be10bc6d52c33Jens Axboe hdr_size % 4); 440bfb41d98f63cb9fb72cb7c82618be10bc6d52c33Jens Axboe if (ret) 441bfb41d98f63cb9fb72cb7c82618be10bc6d52c33Jens Axboe log_err("fio: verify failed at %llu/%u\n", 442bfb41d98f63cb9fb72cb7c82618be10bc6d52c33Jens Axboe io_u->offset + hdr_num * hdr->len, 443bfb41d98f63cb9fb72cb7c82618be10bc6d52c33Jens Axboe hdr->len); 444bfb41d98f63cb9fb72cb7c82618be10bc6d52c33Jens Axboe break; 4453f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis default: 4463f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("Bad verify type %u\n", hdr->verify_type); 447d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe ret = EINVAL; 4483f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis } 4493f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis } 450a7dfe862c2e3fe72b8db6a6e67302048d3731c6dJens Axboe 451a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe return ret; 452e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 453e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 4547437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic void fill_meta(struct verify_header *hdr, struct thread_data *td, 4557437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis struct io_u *io_u, unsigned int header_num) 4567437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{ 4577437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis struct vhdr_meta *vh = hdr_priv(hdr); 4587437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 4597437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->thread = td->thread_number; 4607437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 4617437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->time_sec = io_u->start_time.tv_sec; 4627437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->time_usec = io_u->start_time.tv_usec; 4637437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 4647437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->numberio = td->io_issues[DDIR_WRITE]; 4657437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 4667437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->offset = io_u->offset + header_num * td->o.verify_interval; 4677437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis} 4687437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 469cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha512(struct verify_header *hdr, void *p, unsigned int len) 470cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 471546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha512 *vh = hdr_priv(hdr); 472cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe struct sha512_ctx sha512_ctx = { 473546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe .buf = vh->sha512, 474cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 475cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 476cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha512_init(&sha512_ctx); 477cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha512_update(&sha512_ctx, p, len); 478cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 479cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 480cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha256(struct verify_header *hdr, void *p, unsigned int len) 481cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 482546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha256 *vh = hdr_priv(hdr); 483cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe struct sha256_ctx sha256_ctx = { 484546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe .buf = vh->sha256, 485cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 486cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 487cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha256_init(&sha256_ctx); 488cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha256_update(&sha256_ctx, p, len); 489cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 490cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 4911e154bdbf14a1d352117aea057035235b66f0381Jens Axboestatic void fill_crc7(struct verify_header *hdr, void *p, unsigned int len) 4921e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{ 493546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc7 *vh = hdr_priv(hdr); 494546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 495546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe vh->crc7 = crc7(p, len); 4961e154bdbf14a1d352117aea057035235b66f0381Jens Axboe} 4971e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 498969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboestatic void fill_crc16(struct verify_header *hdr, void *p, unsigned int len) 499969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{ 500546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc16 *vh = hdr_priv(hdr); 501546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 502546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe vh->crc16 = crc16(p, len); 503969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe} 504969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 505e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_crc32(struct verify_header *hdr, void *p, unsigned int len) 506e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 507546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 508546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 509546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe vh->crc32 = crc32(p, len); 510e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 511e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 512d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboestatic void fill_crc64(struct verify_header *hdr, void *p, unsigned int len) 513d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{ 514546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc64 *vh = hdr_priv(hdr); 515546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 516546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe vh->crc64 = crc64(p, len); 517d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe} 518d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 519e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_md5(struct verify_header *hdr, void *p, unsigned int len) 520e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 521546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_md5 *vh = hdr_priv(hdr); 5228c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe struct md5_ctx md5_ctx = { 523546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe .hash = (uint32_t *) vh->md5_digest, 5248c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe }; 525e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 52661f821f16cf27d8742e09b3a137c933cd0085e9bJens Axboe md5_init(&md5_ctx); 527e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe md5_update(&md5_ctx, p, len); 528e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 529e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 530e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe/* 531e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * fill body of io_u->buf with random data and add a header with the 532e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * crc32 or md5 sum of that data. 533e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe */ 534e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboevoid populate_verify_io_u(struct thread_data *td, struct io_u *io_u) 535e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 536baefa9beacca430b8e3275c07d2f46ef14654468Jens Axboe struct verify_header *hdr; 53795646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe void *p = io_u->buf, *data; 5387437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis unsigned int hdr_inc, data_len, header_num = 0; 539e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 5409cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe if (td->o.verify == VERIFY_NULL) 5419cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe return; 5429cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe 54390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe fill_pattern(td, p, io_u->buflen); 544546a9142511875524850ac92776184fd9fb7196eShawn Lewis 545546a9142511875524850ac92776184fd9fb7196eShawn Lewis hdr_inc = io_u->buflen; 546a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe if (td->o.verify_interval) 547a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe hdr_inc = td->o.verify_interval; 548baefa9beacca430b8e3275c07d2f46ef14654468Jens Axboe 54995646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe for (;p < io_u->buf + io_u->buflen; p += hdr_inc) { 55095646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe hdr = p; 5513f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis 5523f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis hdr->fio_magic = FIO_HDR_MAGIC; 5533f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis hdr->verify_type = td->o.verify; 554546a9142511875524850ac92776184fd9fb7196eShawn Lewis hdr->len = hdr_inc; 5558767783245faac99a7e1c330a1d6536e579c8402Jens Axboe data_len = hdr_inc - hdr_size(hdr); 5563f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis 5578767783245faac99a7e1c330a1d6536e579c8402Jens Axboe data = p + hdr_size(hdr); 5583f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis switch (td->o.verify) { 5593f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_MD5: 5603f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis fill_md5(hdr, data, data_len); 5613f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 5623f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC64: 5633f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis fill_crc64(hdr, data, data_len); 5643f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 5653f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC32: 5663f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis fill_crc32(hdr, data, data_len); 5673f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 5683f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC16: 5693f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis fill_crc16(hdr, data, data_len); 5703f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 5713f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC7: 5723f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis fill_crc7(hdr, data, data_len); 5733f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 574cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe case VERIFY_SHA256: 575cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe fill_sha256(hdr, data, data_len); 576cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe break; 577cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe case VERIFY_SHA512: 578cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe fill_sha512(hdr, data, data_len); 579cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe break; 5807437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis case VERIFY_META: 5817437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis fill_meta(hdr, td, io_u, header_num); 5827437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis break; 583bfb41d98f63cb9fb72cb7c82618be10bc6d52c33Jens Axboe case VERIFY_PATTERN: 584bfb41d98f63cb9fb72cb7c82618be10bc6d52c33Jens Axboe break; 5853f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis default: 5863f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("fio: bad verify type: %d\n", td->o.verify); 5873f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis assert(0); 5883f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis } 589a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe if (td->o.verify_offset) 5908767783245faac99a7e1c330a1d6536e579c8402Jens Axboe memswp(p, p + td->o.verify_offset, hdr_size(hdr)); 5917437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis header_num++; 592e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe } 593e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 594e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 595e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboeint get_next_verify(struct thread_data *td, struct io_u *io_u) 596e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 5978de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe struct io_piece *ipo = NULL; 598e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 599d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe /* 600d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe * this io_u is from a requeue, we already filled the offsets 601d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe */ 602d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe if (io_u->file) 603d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe return 0; 604d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe 6058de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe if (!RB_EMPTY_ROOT(&td->io_hist_tree)) { 6068de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe struct rb_node *n = rb_first(&td->io_hist_tree); 607e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 6088de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe ipo = rb_entry(n, struct io_piece, rb_node); 6094b87898e8d76aaf05baec83077a11311c1447397Jens Axboe rb_erase(n, &td->io_hist_tree); 6108de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe } else if (!list_empty(&td->io_hist_list)) { 6118de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe ipo = list_entry(td->io_hist_list.next, struct io_piece, list); 6128de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe list_del(&ipo->list); 6138de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe } 614e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 6158de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe if (ipo) { 616e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe io_u->offset = ipo->offset; 617e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe io_u->buflen = ipo->len; 61836167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe io_u->file = ipo->file; 61997af62cec418cd722fb43c6010d6430534e12353Jens Axboe 62097af62cec418cd722fb43c6010d6430534e12353Jens Axboe if ((io_u->file->flags & FIO_FILE_OPEN) == 0) { 62197af62cec418cd722fb43c6010d6430534e12353Jens Axboe int r = td_io_open_file(td, io_u->file); 62297af62cec418cd722fb43c6010d6430534e12353Jens Axboe 62397af62cec418cd722fb43c6010d6430534e12353Jens Axboe if (r) 62497af62cec418cd722fb43c6010d6430534e12353Jens Axboe return 1; 62597af62cec418cd722fb43c6010d6430534e12353Jens Axboe } 62697af62cec418cd722fb43c6010d6430534e12353Jens Axboe 62797af62cec418cd722fb43c6010d6430534e12353Jens Axboe get_file(ipo->file); 62897af62cec418cd722fb43c6010d6430534e12353Jens Axboe assert(io_u->file->flags & FIO_FILE_OPEN); 629e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe io_u->ddir = DDIR_READ; 63036167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe io_u->xfer_buf = io_u->buf; 63136167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe io_u->xfer_buflen = io_u->buflen; 632e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe free(ipo); 633e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe return 0; 634e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe } 635e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 636e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe return 1; 637e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 638