verify.c revision 7d9fb455aadc0c0363489591775496f27f4a560a
1e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe/* 2e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * IO verification helpers 3e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe */ 4e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe#include <unistd.h> 5e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe#include <fcntl.h> 6e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe#include <string.h> 797af62cec418cd722fb43c6010d6430534e12353Jens Axboe#include <assert.h> 8e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe#include <pthread.h> 9e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 10e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe#include "fio.h" 114f5af7b2370a6d3e64bc5128905c1aa8b0dc51b0Jens Axboe#include "verify.h" 12e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe#include "smalloc.h" 130d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe#include "trim.h" 14637ef8d9f7645135cf4829894d1e3983cd7a042eJens Axboe#include "lib/rand.h" 15e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 16eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/md5.h" 17eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc64.h" 18eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc32.h" 19bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe#include "crc/crc32c.h" 20eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc16.h" 21eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/crc7.h" 22eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/sha256.h" 23eef6eea1b935a67f1ae26b38e06a69d4410a12aaJens Axboe#include "crc/sha512.h" 247c353ceb3257b132f4c98326046b42201e070731Jens Axboe#include "crc/sha1.h" 25cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 267d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void populate_hdr(struct thread_data *td, struct io_u *io_u, 277d9fb455aadc0c0363489591775496f27f4a560aJens Axboe struct verify_header *hdr, unsigned int header_num, 287d9fb455aadc0c0363489591775496f27f4a560aJens Axboe unsigned int header_len); 297d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 307d9fb455aadc0c0363489591775496f27f4a560aJens Axboevoid fill_pattern(struct thread_data *td, void *p, unsigned int len, struct io_u *io_u, unsigned long seed, int use_seed) 3190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe{ 3290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe switch (td->o.verify_pattern_bytes) { 3390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe case 0: 34bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill random bytes len=%u\n", len); 357d9fb455aadc0c0363489591775496f27f4a560aJens Axboe if (use_seed) 367d9fb455aadc0c0363489591775496f27f4a560aJens Axboe __fill_random_buf(p, len, seed); 377d9fb455aadc0c0363489591775496f27f4a560aJens Axboe else 387d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u->rand_seed = fill_random_buf(p, len); 3990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe break; 4090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe case 1: 4110e8a7b30ce2917df9f839d42596c7e3af9a904fRadha Ramachandran if (io_u->buf_filled_len >= len) { 42cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran dprint(FD_VERIFY, "using already filled verify pattern b=0 len=%u\n", len); 43cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran return; 44cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran } 45bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill verify pattern b=0 len=%u\n", len); 460e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran memset(p, td->o.verify_pattern[0], len); 47cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran io_u->buf_filled_len = len; 4890059d65bde4804e4da07401ad6902c1d956b592Jens Axboe break; 490e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran default: { 500e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran unsigned int i = 0, size = 0; 5190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe unsigned char *b = p; 5290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe 5310e8a7b30ce2917df9f839d42596c7e3af9a904fRadha Ramachandran if (io_u->buf_filled_len >= len) { 54cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran dprint(FD_VERIFY, "using already filled verify pattern b=%d len=%u\n", 55cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran td->o.verify_pattern_bytes, len); 56cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran return; 57cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran } 58bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "fill verify pattern b=%d len=%u\n", 59bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe td->o.verify_pattern_bytes, len); 60bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 6190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe while (i < len) { 620e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran size = td->o.verify_pattern_bytes; 630e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran if (size > (len - i)) 640e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran size = len - i; 650e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran memcpy(b+i, td->o.verify_pattern, size); 660e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran i += size; 6790059d65bde4804e4da07401ad6902c1d956b592Jens Axboe } 68cbe8d7561cf6d81d741d87eb7940db2a111d2144Radha Ramachandran io_u->buf_filled_len = len; 6990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe break; 7090059d65bde4804e4da07401ad6902c1d956b592Jens Axboe } 7190059d65bde4804e4da07401ad6902c1d956b592Jens Axboe } 7290059d65bde4804e4da07401ad6902c1d956b592Jens Axboe} 7390059d65bde4804e4da07401ad6902c1d956b592Jens Axboe 744764aec9fe5988281bdc114c13ac771fb16713ccJens Axboestatic void memswp(void *buf1, void *buf2, unsigned int len) 75546a9142511875524850ac92776184fd9fb7196eShawn Lewis{ 76dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis char swap[200]; 77dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis 78dee6de74152299f2a7df07ae971a53441b971dafShawn Lewis assert(len <= sizeof(swap)); 7990059d65bde4804e4da07401ad6902c1d956b592Jens Axboe 80546a9142511875524850ac92776184fd9fb7196eShawn Lewis memcpy(&swap, buf1, len); 81546a9142511875524850ac92776184fd9fb7196eShawn Lewis memcpy(buf1, buf2, len); 82546a9142511875524850ac92776184fd9fb7196eShawn Lewis memcpy(buf2, &swap, len); 83546a9142511875524850ac92776184fd9fb7196eShawn Lewis} 84546a9142511875524850ac92776184fd9fb7196eShawn Lewis 85e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void hexdump(void *buffer, int len) 86e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 87e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe unsigned char *p = buffer; 88e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe int i; 89e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 90e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe for (i = 0; i < len; i++) 91bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_err("%02x", p[i]); 92bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_err("\n"); 93e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 94e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 95d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe/* 968767783245faac99a7e1c330a1d6536e579c8402Jens Axboe * Prepare for seperation of verify_header and checksum header 978767783245faac99a7e1c330a1d6536e579c8402Jens Axboe */ 98546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic inline unsigned int __hdr_size(int verify_type) 998767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{ 10003e20d687566753b90383571e5e152c5142bdffdBruce Cran unsigned int len = 0; 1018767783245faac99a7e1c330a1d6536e579c8402Jens Axboe 102546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe switch (verify_type) { 103546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_NONE: 104546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_NULL: 105546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = 0; 106546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 107546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_MD5: 108546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_md5); 109546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 110546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC64: 111546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc64); 112546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 113bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe case VERIFY_CRC32C: 114546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC32: 1153845591fadea480177223e28c9d1c03642d34f0eJens Axboe case VERIFY_CRC32C_INTEL: 116546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc32); 117546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 118546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC16: 119546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc16); 120546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 121546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_CRC7: 122546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_crc7); 123546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 124546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_SHA256: 125546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_sha256); 126546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 127546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe case VERIFY_SHA512: 128546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe len = sizeof(struct vhdr_sha512); 129546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe break; 1307437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis case VERIFY_META: 1317437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis len = sizeof(struct vhdr_meta); 1327437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis break; 1337c353ceb3257b132f4c98326046b42201e070731Jens Axboe case VERIFY_SHA1: 1347c353ceb3257b132f4c98326046b42201e070731Jens Axboe len = sizeof(struct vhdr_sha1); 1357c353ceb3257b132f4c98326046b42201e070731Jens Axboe break; 136546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe default: 137546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe log_err("fio: unknown verify header!\n"); 138546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe assert(0); 139546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe } 140546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 141546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe return len + sizeof(struct verify_header); 1428767783245faac99a7e1c330a1d6536e579c8402Jens Axboe} 1438767783245faac99a7e1c330a1d6536e579c8402Jens Axboe 1448767783245faac99a7e1c330a1d6536e579c8402Jens Axboestatic inline unsigned int hdr_size(struct verify_header *hdr) 1458767783245faac99a7e1c330a1d6536e579c8402Jens Axboe{ 146546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe return __hdr_size(hdr->verify_type); 147546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe} 148546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 149546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboestatic void *hdr_priv(struct verify_header *hdr) 150546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe{ 151546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe void *priv = hdr; 152546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 153546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe return priv + sizeof(struct verify_header); 1548767783245faac99a7e1c330a1d6536e579c8402Jens Axboe} 1558767783245faac99a7e1c330a1d6536e579c8402Jens Axboe 1568767783245faac99a7e1c330a1d6536e579c8402Jens Axboe/* 157936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * Verify container, pass info to verify handlers and allow them to 158936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * pass info back in case of error 159936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe */ 160936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestruct vcont { 161936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe /* 162936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * Input 163936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe */ 164936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe struct io_u *io_u; 165936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe unsigned int hdr_num; 1667d9fb455aadc0c0363489591775496f27f4a560aJens Axboe struct thread_data *td; 167936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe 168936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe /* 169936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe * Output, only valid in case of error 170936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe */ 171bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe const char *name; 172bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe void *good_crc; 173bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe void *bad_crc; 174936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe unsigned int crc_len; 175936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe}; 176936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe 1777d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void dump_buf(char *buf, unsigned int len, const char *name, 1787d9fb455aadc0c0363489591775496f27f4a560aJens Axboe unsigned long long offset) 1797d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{ 1807d9fb455aadc0c0363489591775496f27f4a560aJens Axboe char fname[80]; 1817d9fb455aadc0c0363489591775496f27f4a560aJens Axboe int ret, fd; 1827d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 1837d9fb455aadc0c0363489591775496f27f4a560aJens Axboe sprintf(fname, "%llu.%s", offset, name); 1847d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 1857d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fd = open(fname, O_CREAT | O_TRUNC | O_WRONLY, 0644); 1867d9fb455aadc0c0363489591775496f27f4a560aJens Axboe if (fd < 0) { 1877d9fb455aadc0c0363489591775496f27f4a560aJens Axboe perror("open verify buf file"); 1887d9fb455aadc0c0363489591775496f27f4a560aJens Axboe return; 1897d9fb455aadc0c0363489591775496f27f4a560aJens Axboe } 1907d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 1917d9fb455aadc0c0363489591775496f27f4a560aJens Axboe while (len) { 1927d9fb455aadc0c0363489591775496f27f4a560aJens Axboe ret = write(fd, buf, len); 1937d9fb455aadc0c0363489591775496f27f4a560aJens Axboe if (!ret) 1947d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 1957d9fb455aadc0c0363489591775496f27f4a560aJens Axboe else if (ret < 0) { 1967d9fb455aadc0c0363489591775496f27f4a560aJens Axboe perror("write verify buf file"); 1977d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 1987d9fb455aadc0c0363489591775496f27f4a560aJens Axboe } 1997d9fb455aadc0c0363489591775496f27f4a560aJens Axboe len -= ret; 2007d9fb455aadc0c0363489591775496f27f4a560aJens Axboe buf += ret; 2017d9fb455aadc0c0363489591775496f27f4a560aJens Axboe } 2027d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 2037d9fb455aadc0c0363489591775496f27f4a560aJens Axboe close(fd); 2047d9fb455aadc0c0363489591775496f27f4a560aJens Axboe log_err(" %s data dumped as %s\n", name, fname); 2057d9fb455aadc0c0363489591775496f27f4a560aJens Axboe} 2067d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 2077d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void dump_verify_buffers(struct verify_header *hdr, struct vcont *vc) 2087d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{ 2097d9fb455aadc0c0363489591775496f27f4a560aJens Axboe struct thread_data *td = vc->td; 2107d9fb455aadc0c0363489591775496f27f4a560aJens Axboe struct io_u *io_u = vc->io_u; 2117d9fb455aadc0c0363489591775496f27f4a560aJens Axboe unsigned long hdr_offset; 2127d9fb455aadc0c0363489591775496f27f4a560aJens Axboe unsigned int hdr_inc, header_num; 2137d9fb455aadc0c0363489591775496f27f4a560aJens Axboe struct io_u dummy; 2147d9fb455aadc0c0363489591775496f27f4a560aJens Axboe void *buf, *p; 2157d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 2167d9fb455aadc0c0363489591775496f27f4a560aJens Axboe hdr_offset = vc->hdr_num * hdr->len; 2177d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 2187d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dump_buf(io_u->buf + hdr_offset, hdr->len, "received", 2197d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u->offset + hdr_offset); 2207d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 2217d9fb455aadc0c0363489591775496f27f4a560aJens Axboe buf = p = malloc(io_u->buflen); 2227d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dummy = *io_u; 2237d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_pattern(td, p, io_u->buflen, &dummy, hdr->rand_seed, 1); 2247d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 2257d9fb455aadc0c0363489591775496f27f4a560aJens Axboe hdr_inc = io_u->buflen; 2267d9fb455aadc0c0363489591775496f27f4a560aJens Axboe if (td->o.verify_interval) 2277d9fb455aadc0c0363489591775496f27f4a560aJens Axboe hdr_inc = td->o.verify_interval; 2287d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 2297d9fb455aadc0c0363489591775496f27f4a560aJens Axboe header_num = 0; 2307d9fb455aadc0c0363489591775496f27f4a560aJens Axboe for (; p < buf + io_u->buflen; p += hdr_inc) { 2317d9fb455aadc0c0363489591775496f27f4a560aJens Axboe hdr = p; 2327d9fb455aadc0c0363489591775496f27f4a560aJens Axboe populate_hdr(td, io_u, hdr, header_num, hdr_inc); 2337d9fb455aadc0c0363489591775496f27f4a560aJens Axboe header_num++; 2347d9fb455aadc0c0363489591775496f27f4a560aJens Axboe } 2357d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 2367d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dump_buf(buf + hdr_offset, hdr->len, "expected", 2377d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u->offset + hdr_offset); 2387d9fb455aadc0c0363489591775496f27f4a560aJens Axboe free(buf); 2397d9fb455aadc0c0363489591775496f27f4a560aJens Axboe} 2407d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 241bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboestatic void log_verify_failure(struct verify_header *hdr, struct vcont *vc) 242bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe{ 243bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe unsigned long long offset; 244bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe 245bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe offset = vc->io_u->offset; 246bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe offset += vc->hdr_num * hdr->len; 24732c17adf7f75da1f0957d4691633fea60259910fJens Axboe log_err("%.8s: verify failed at file %s offset %llu, length %u\n", 24832c17adf7f75da1f0957d4691633fea60259910fJens Axboe vc->name, vc->io_u->file->file_name, offset, hdr->len); 249bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe 250bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (vc->good_crc && vc->bad_crc) { 251bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_err(" Expected CRC: "); 252bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe hexdump(vc->good_crc, vc->crc_len); 253bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_err(" Received CRC: "); 254bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe hexdump(vc->bad_crc, vc->crc_len); 255bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe } 2567d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 2577d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dump_verify_buffers(hdr, vc); 258bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe} 259bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe 260936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe/* 261d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe * Return data area 'header_num' 262d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe */ 263936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic inline void *io_u_verify_off(struct verify_header *hdr, struct vcont *vc) 264d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe{ 265936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe return vc->io_u->buf + vc->hdr_num * hdr->len + hdr_size(hdr); 266d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe} 267d9f2caf3de3f2ba6f8ecd8a2688e1eb7715bc2aaJens Axboe 2687437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic int verify_io_u_meta(struct verify_header *hdr, struct thread_data *td, 269936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe struct vcont *vc) 2707437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{ 2717437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis struct vhdr_meta *vh = hdr_priv(hdr); 272936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe struct io_u *io_u = vc->io_u; 2737437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 274bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "meta verify io_u %p, len %u\n", io_u, hdr->len); 275bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 276bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (vh->offset == io_u->offset + vc->hdr_num * td->o.verify_interval) 277bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 2787437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 279bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "meta"; 280bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 281bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 2827437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis} 2837437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 284936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha512(struct verify_header *hdr, struct vcont *vc) 285cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 286936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 287546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha512 *vh = hdr_priv(hdr); 288cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe uint8_t sha512[128]; 289cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe struct sha512_ctx sha512_ctx = { 290cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe .buf = sha512, 291cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 292cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 293936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "sha512 verify io_u %p, len %u\n", vc->io_u, hdr->len); 294bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 295cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha512_init(&sha512_ctx); 2968767783245faac99a7e1c330a1d6536e579c8402Jens Axboe sha512_update(&sha512_ctx, p, hdr->len - hdr_size(hdr)); 297cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 298bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (!memcmp(vh->sha512, sha512_ctx.buf, sizeof(sha512))) 299bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 300cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 301bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "sha512"; 302bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = vh->sha512; 303bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = sha512_ctx.buf; 304bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = sizeof(vh->sha512); 305bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 306bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 307cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 308cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 309936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha256(struct verify_header *hdr, struct vcont *vc) 310cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 311936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 312546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha256 *vh = hdr_priv(hdr); 313bc77f56f79f6ae155e9eb26263ed686ef28b47ecJens Axboe uint8_t sha256[64]; 314cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe struct sha256_ctx sha256_ctx = { 315cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe .buf = sha256, 316cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 317cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 318936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "sha256 verify io_u %p, len %u\n", vc->io_u, hdr->len); 319bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 320cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha256_init(&sha256_ctx); 3218767783245faac99a7e1c330a1d6536e579c8402Jens Axboe sha256_update(&sha256_ctx, p, hdr->len - hdr_size(hdr)); 322cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 323bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (!memcmp(vh->sha256, sha256_ctx.buf, sizeof(sha256))) 324bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 325cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 326bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "sha256"; 327bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = vh->sha256; 328bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = sha256_ctx.buf; 329bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = sizeof(vh->sha256); 330bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 331bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 332cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 333cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 334936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_sha1(struct verify_header *hdr, struct vcont *vc) 3357c353ceb3257b132f4c98326046b42201e070731Jens Axboe{ 336936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 3377c353ceb3257b132f4c98326046b42201e070731Jens Axboe struct vhdr_sha1 *vh = hdr_priv(hdr); 3387c353ceb3257b132f4c98326046b42201e070731Jens Axboe uint32_t sha1[5]; 3397c353ceb3257b132f4c98326046b42201e070731Jens Axboe struct sha1_ctx sha1_ctx = { 3407c353ceb3257b132f4c98326046b42201e070731Jens Axboe .H = sha1, 3417c353ceb3257b132f4c98326046b42201e070731Jens Axboe }; 3427c353ceb3257b132f4c98326046b42201e070731Jens Axboe 343936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "sha1 verify io_u %p, len %u\n", vc->io_u, hdr->len); 3447c353ceb3257b132f4c98326046b42201e070731Jens Axboe 3457c353ceb3257b132f4c98326046b42201e070731Jens Axboe sha1_init(&sha1_ctx); 3467c353ceb3257b132f4c98326046b42201e070731Jens Axboe sha1_update(&sha1_ctx, p, hdr->len - hdr_size(hdr)); 3477c353ceb3257b132f4c98326046b42201e070731Jens Axboe 348bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (!memcmp(vh->sha1, sha1_ctx.H, sizeof(sha1))) 349bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 3507c353ceb3257b132f4c98326046b42201e070731Jens Axboe 351bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "sha1"; 352bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = vh->sha1; 353bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = sha1_ctx.H; 354bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = sizeof(vh->sha1); 355bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 356bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 3577c353ceb3257b132f4c98326046b42201e070731Jens Axboe} 3587c353ceb3257b132f4c98326046b42201e070731Jens Axboe 359936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc7(struct verify_header *hdr, struct vcont *vc) 3601e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{ 361936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 362546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc7 *vh = hdr_priv(hdr); 3631e154bdbf14a1d352117aea057035235b66f0381Jens Axboe unsigned char c; 3641e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 365936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "crc7 verify io_u %p, len %u\n", vc->io_u, hdr->len); 366bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 3678767783245faac99a7e1c330a1d6536e579c8402Jens Axboe c = crc7(p, hdr->len - hdr_size(hdr)); 3681e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 369bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (c == vh->crc7) 370bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 3711e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 372bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "crc7"; 373bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = &vh->crc7; 374bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = &c; 375bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = 1; 376bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 377bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 3781e154bdbf14a1d352117aea057035235b66f0381Jens Axboe} 3791e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 380936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc16(struct verify_header *hdr, struct vcont *vc) 381969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{ 382936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 383546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc16 *vh = hdr_priv(hdr); 384969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe unsigned short c; 385969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 386936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "crc16 verify io_u %p, len %u\n", vc->io_u, hdr->len); 387bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 3888767783245faac99a7e1c330a1d6536e579c8402Jens Axboe c = crc16(p, hdr->len - hdr_size(hdr)); 389969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 390bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (c == vh->crc16) 391bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 392969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 393bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "crc16"; 394bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = &vh->crc16; 395bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = &c; 396bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = 2; 397bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 398bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 399969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe} 400969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 401936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc64(struct verify_header *hdr, struct vcont *vc) 402d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{ 403936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 404546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc64 *vh = hdr_priv(hdr); 405d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe unsigned long long c; 406d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 407936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "crc64 verify io_u %p, len %u\n", vc->io_u, hdr->len); 408bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 4098767783245faac99a7e1c330a1d6536e579c8402Jens Axboe c = crc64(p, hdr->len - hdr_size(hdr)); 410d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 411bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (c == vh->crc64) 412bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 413d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 414bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "crc64"; 415bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = &vh->crc64; 416bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = &c; 417bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = 8; 418bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 419bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 420d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe} 421d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 422936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc32(struct verify_header *hdr, struct vcont *vc) 423e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 424936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 425546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 426546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe uint32_t c; 427e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 428936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "crc32 verify io_u %p, len %u\n", vc->io_u, hdr->len); 429bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 4308767783245faac99a7e1c330a1d6536e579c8402Jens Axboe c = crc32(p, hdr->len - hdr_size(hdr)); 431e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 432bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (c == vh->crc32) 433bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 434e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 435bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "crc32"; 436bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = &vh->crc32; 437bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = &c; 438bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = 4; 439bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 440bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 441e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 442e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 443936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_crc32c(struct verify_header *hdr, struct vcont *vc) 444bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{ 445936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 446bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 447bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe uint32_t c; 448bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 449936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "crc32c verify io_u %p, len %u\n", vc->io_u, hdr->len); 450bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 4513845591fadea480177223e28c9d1c03642d34f0eJens Axboe if (hdr->verify_type == VERIFY_CRC32C_INTEL) 4523845591fadea480177223e28c9d1c03642d34f0eJens Axboe c = crc32c_intel(p, hdr->len - hdr_size(hdr)); 4533845591fadea480177223e28c9d1c03642d34f0eJens Axboe else 4543845591fadea480177223e28c9d1c03642d34f0eJens Axboe c = crc32c(p, hdr->len - hdr_size(hdr)); 455bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 456bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (c == vh->crc32) 457bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 458bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 459bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "crc32c"; 460bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = &vh->crc32; 461bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = &c; 462bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = 4; 463bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 464bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 465bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe} 466bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 467936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboestatic int verify_io_u_md5(struct verify_header *hdr, struct vcont *vc) 468e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 469936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe void *p = io_u_verify_off(hdr, vc); 470546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_md5 *vh = hdr_priv(hdr); 4718c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe uint32_t hash[MD5_HASH_WORDS]; 4728c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe struct md5_ctx md5_ctx = { 4738c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe .hash = hash, 4748c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe }; 475e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 476936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe dprint(FD_VERIFY, "md5 verify io_u %p, len %u\n", vc->io_u, hdr->len); 477bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe 47861f821f16cf27d8742e09b3a137c933cd0085e9bJens Axboe md5_init(&md5_ctx); 4798767783245faac99a7e1c330a1d6536e579c8402Jens Axboe md5_update(&md5_ctx, p, hdr->len - hdr_size(hdr)); 480e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 481bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe if (!memcmp(vh->md5_digest, md5_ctx.hash, sizeof(hash))) 482bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return 0; 483e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 484bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->name = "md5"; 485bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->good_crc = vh->md5_digest; 486bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->bad_crc = md5_ctx.hash; 487bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe vc->crc_len = sizeof(hash); 488bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe log_verify_failure(hdr, vc); 489bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe return EILSEQ; 490e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 491e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 4923f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboestatic unsigned int hweight8(unsigned int w) 4933f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe{ 4943f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe unsigned int res = w - ((w >> 1) & 0x55); 4953f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe 4963f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe res = (res & 0x33) + ((res >> 2) & 0x33); 4973f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe return (res + (res >> 4)) & 0x0F; 4983f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe} 4993f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe 5000e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandranint verify_io_u_pattern(char *pattern, unsigned long pattern_size, 5015ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe char *buf, unsigned int len, unsigned int mod) 502a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis{ 503a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis unsigned int i; 504a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis 505a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis for (i = 0; i < len; i++) { 5060e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran if (buf[i] != pattern[mod]) { 5073f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe unsigned int bits; 5083f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe 5090e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran bits = hweight8(buf[i] ^ pattern[mod]); 5103f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe log_err("fio: got pattern %x, wanted %x. Bad bits %d\n", 5110e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran buf[i], pattern[mod], bits); 5123f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe log_err("fio: bad pattern block offset %u\n", i); 5139fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 5143f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe } 515a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis mod++; 516a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis if (mod == pattern_size) 517a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis mod = 0; 518a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis } 519a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis 520a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis return 0; 521a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis} 522a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis 523e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe/* 524e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe * Push IO verification to a separate thread 525e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe */ 526e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_io_u_async(struct thread_data *td, struct io_u *io_u) 527e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{ 528e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (io_u->file) 529e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe put_file_log(td, io_u->file); 530e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 531e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe io_u->file = NULL; 532e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 533e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_lock(&td->io_u_lock); 5340c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran 5350c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran if (io_u->flags & IO_U_F_IN_CUR_DEPTH) { 5360c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran td->cur_depth--; 5370c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran io_u->flags &= ~IO_U_F_IN_CUR_DEPTH; 5380c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran } 539e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe flist_del(&io_u->list); 540e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe flist_add_tail(&io_u->list, &td->verify_list); 5412ecc1b57721e3cb72bbf558bc169c97037fe3d0aJens Axboe io_u->flags |= IO_U_F_FREE_DEF; 542e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 543e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 544e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_signal(&td->verify_cond); 545e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe return 0; 546e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe} 547e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 5480d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboestatic int verify_trimmed_io_u(struct thread_data *td, struct io_u *io_u) 5490d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe{ 5500d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe static char zero_buf[1024]; 5510d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe unsigned int this_len, len; 5520d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe int ret = 0; 5530d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe void *p; 5540d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 5550d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe if (!td->o.trim_zero) 5560d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe return 0; 5570d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 5580d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe len = io_u->buflen; 5590d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe p = io_u->buf; 5600d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe do { 5610d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe this_len = sizeof(zero_buf); 5620d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe if (this_len > len) 5630d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe this_len = len; 5640d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe if (memcmp(p, zero_buf, this_len)) { 5650d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe ret = EILSEQ; 5660d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe break; 5670d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe } 5680d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe len -= this_len; 5690d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe p += this_len; 5700d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe } while (len); 5710d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 5720d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe if (!ret) 5730d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe return 0; 5740d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 575a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe log_err("trim: verify failed at file %s offset %llu, length %lu" 576a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe ", block offset %lu\n", 577a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe io_u->file->file_name, io_u->offset, io_u->buflen, 5782f68124f26e54233db41b462a257dabc48e5c32bJens Axboe (unsigned long) (p - io_u->buf)); 5790d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe return ret; 5800d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe} 5810d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 58236690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboeint verify_io_u(struct thread_data *td, struct io_u *io_u) 583e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 5843f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis struct verify_header *hdr; 585a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis unsigned int hdr_size, hdr_inc, hdr_num = 0; 58695646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe void *p; 587e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe int ret; 588e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 5891dcc049824b840df1ee0ef5d019fffa4037e1bb0Shawn Lewis if (td->o.verify == VERIFY_NULL || io_u->ddir != DDIR_READ) 59036690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe return 0; 5910d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe if (io_u->flags & IO_U_F_TRIMMED) { 5920d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe ret = verify_trimmed_io_u(td, io_u); 5930d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe goto done; 5940d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe } 59536690c9b5b50736cec1fcd53100f01fd1181fdf4Jens Axboe 5963f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis hdr_inc = io_u->buflen; 597a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe if (td->o.verify_interval) 598a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe hdr_inc = td->o.verify_interval; 599e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 600a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe ret = 0; 6015ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe for (p = io_u->buf; p < io_u->buf + io_u->buflen; 6025ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe p += hdr_inc, hdr_num++) { 603bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe struct vcont vc = { 604bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe .io_u = io_u, 605bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe .hdr_num = hdr_num, 6067d9fb455aadc0c0363489591775496f27f4a560aJens Axboe .td = td, 607bfacf389e9edb1b63ca0b9c6cb2aea8b06d53aceJens Axboe }; 608936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe 609f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe if (ret && td->o.verify_fatal) 610a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe break; 611f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe 612a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis hdr_size = __hdr_size(td->o.verify); 613a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe if (td->o.verify_offset) 614a944e335fac62c75966b417a25ec107c40957cdbShawn Lewis memswp(p, p + td->o.verify_offset, hdr_size); 61595646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe hdr = p; 616e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 6173f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe if (hdr->fio_magic != FIO_HDR_MAGIC) { 618c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe log_err("verify: bad magic header %x, wanted %x at file %s offset %llu, length %u\n", 619c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe hdr->fio_magic, FIO_HDR_MAGIC, 620c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe io_u->file->file_name, 621c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe io_u->offset + hdr_num * hdr->len, hdr->len); 6229fd189697dbf9fb7878093be5e41f25b7f932c2dJens Axboe return EILSEQ; 6233f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe } 6243f199b01fc9cc7a0f4915db266d7a28bc46e84f0Jens Axboe 625e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis if (td->o.verify_pattern_bytes) { 626bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "pattern verify io_u %p, len %u\n", 627bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u, hdr->len); 628e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis ret = verify_io_u_pattern(td->o.verify_pattern, 6290e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran td->o.verify_pattern_bytes, 6300e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran p + hdr_size, 6310e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran hdr_inc - hdr_size, 6320e92f873a3d542d2b237d68fd9391c92a85fa0b8Radha Ramachandran hdr_size % td->o.verify_pattern_bytes); 633c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe 634c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe if (ret) { 635c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe log_err("pattern: verify failed at file %s offset %llu, length %u\n", 636c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe io_u->file->file_name, 637c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe io_u->offset + hdr_num * hdr->len, 638c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe hdr->len); 639c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe } 640c9b440312ff63c2b4c8548530f24c2eb5820b6a3Jens Axboe 641e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran /* 642e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran * Also verify the meta data, if applicable 643e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran */ 644e92d3d714acfe180413f63a5e5327de594aad0efRadha Ramachandran if (hdr->verify_type == VERIFY_META) 645936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret |= verify_io_u_meta(hdr, td, &vc); 646e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis continue; 647e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis } 648e28218f3017e5eb156d3a4a6e7b33651dc022ceaShawn Lewis 6493f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis switch (hdr->verify_type) { 6503f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_MD5: 651936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_md5(hdr, &vc); 6523f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 6533f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC64: 654936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_crc64(hdr, &vc); 6553f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 656bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe case VERIFY_CRC32C: 6573845591fadea480177223e28c9d1c03642d34f0eJens Axboe case VERIFY_CRC32C_INTEL: 658936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_crc32c(hdr, &vc); 659bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe break; 6603f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC32: 661936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_crc32(hdr, &vc); 6623f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 6633f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC16: 664936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_crc16(hdr, &vc); 6653f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 6663f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis case VERIFY_CRC7: 667936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_crc7(hdr, &vc); 6683f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis break; 669cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe case VERIFY_SHA256: 670936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_sha256(hdr, &vc); 671cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe break; 672cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe case VERIFY_SHA512: 673936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_sha512(hdr, &vc); 674cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe break; 6757437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis case VERIFY_META: 676936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_meta(hdr, td, &vc); 6777437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis break; 6787c353ceb3257b132f4c98326046b42201e070731Jens Axboe case VERIFY_SHA1: 679936216f8cd8ae2261282453d82a2a8232bb4db45Jens Axboe ret = verify_io_u_sha1(hdr, &vc); 6807c353ceb3257b132f4c98326046b42201e070731Jens Axboe break; 6813f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis default: 6823f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis log_err("Bad verify type %u\n", hdr->verify_type); 683d16d4e09352f618c266d1efe27cbb25a95df6e86Jens Axboe ret = EINVAL; 6843f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis } 6853f9f4e2631c4f5d33f125dd71db20c1773d22c91Shawn Lewis } 686a7dfe862c2e3fe72b8db6a6e67302048d3731c6dJens Axboe 6870d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboedone: 688f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe if (ret && td->o.verify_fatal) 689f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe td->terminate = 1; 690f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe 691a12a3b4d8903b9941705067442c2c530a94635f3Jens Axboe return ret; 692e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 693e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 6947437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewisstatic void fill_meta(struct verify_header *hdr, struct thread_data *td, 6955ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe struct io_u *io_u, unsigned int header_num) 6967437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis{ 6977437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis struct vhdr_meta *vh = hdr_priv(hdr); 6987437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 6997437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->thread = td->thread_number; 7007437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 7017437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->time_sec = io_u->start_time.tv_sec; 7027437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->time_usec = io_u->start_time.tv_usec; 7037437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 7047437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->numberio = td->io_issues[DDIR_WRITE]; 7057437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 7067437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis vh->offset = io_u->offset + header_num * td->o.verify_interval; 7077437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis} 7087437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis 709cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha512(struct verify_header *hdr, void *p, unsigned int len) 710cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 711546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha512 *vh = hdr_priv(hdr); 712cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe struct sha512_ctx sha512_ctx = { 713546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe .buf = vh->sha512, 714cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 715cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 716cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha512_init(&sha512_ctx); 717cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha512_update(&sha512_ctx, p, len); 718cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 719cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 720cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboestatic void fill_sha256(struct verify_header *hdr, void *p, unsigned int len) 721cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe{ 722546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_sha256 *vh = hdr_priv(hdr); 723cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe struct sha256_ctx sha256_ctx = { 724546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe .buf = vh->sha256, 725cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe }; 726cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 727cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha256_init(&sha256_ctx); 728cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe sha256_update(&sha256_ctx, p, len); 729cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe} 730cd14cc1079771ece34fce5b30d47c7b273ee56e5Jens Axboe 7317c353ceb3257b132f4c98326046b42201e070731Jens Axboestatic void fill_sha1(struct verify_header *hdr, void *p, unsigned int len) 7327c353ceb3257b132f4c98326046b42201e070731Jens Axboe{ 7337c353ceb3257b132f4c98326046b42201e070731Jens Axboe struct vhdr_sha1 *vh = hdr_priv(hdr); 7347c353ceb3257b132f4c98326046b42201e070731Jens Axboe struct sha1_ctx sha1_ctx = { 7357c353ceb3257b132f4c98326046b42201e070731Jens Axboe .H = vh->sha1, 7367c353ceb3257b132f4c98326046b42201e070731Jens Axboe }; 7377c353ceb3257b132f4c98326046b42201e070731Jens Axboe 7387c353ceb3257b132f4c98326046b42201e070731Jens Axboe sha1_init(&sha1_ctx); 7397c353ceb3257b132f4c98326046b42201e070731Jens Axboe sha1_update(&sha1_ctx, p, len); 7407c353ceb3257b132f4c98326046b42201e070731Jens Axboe} 7417c353ceb3257b132f4c98326046b42201e070731Jens Axboe 7421e154bdbf14a1d352117aea057035235b66f0381Jens Axboestatic void fill_crc7(struct verify_header *hdr, void *p, unsigned int len) 7431e154bdbf14a1d352117aea057035235b66f0381Jens Axboe{ 744546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc7 *vh = hdr_priv(hdr); 745546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 746546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe vh->crc7 = crc7(p, len); 7471e154bdbf14a1d352117aea057035235b66f0381Jens Axboe} 7481e154bdbf14a1d352117aea057035235b66f0381Jens Axboe 749969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboestatic void fill_crc16(struct verify_header *hdr, void *p, unsigned int len) 750969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe{ 751546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc16 *vh = hdr_priv(hdr); 752546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 753546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe vh->crc16 = crc16(p, len); 754969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe} 755969f7ed32353ade93ea30542a4993b75b94e3f8aJens Axboe 756e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_crc32(struct verify_header *hdr, void *p, unsigned int len) 757e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 758546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 759546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 760546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe vh->crc32 = crc32(p, len); 761e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 762e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 763bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboestatic void fill_crc32c(struct verify_header *hdr, void *p, unsigned int len) 764bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe{ 765bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe struct vhdr_crc32 *vh = hdr_priv(hdr); 766bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 7673845591fadea480177223e28c9d1c03642d34f0eJens Axboe if (hdr->verify_type == VERIFY_CRC32C_INTEL) 7683845591fadea480177223e28c9d1c03642d34f0eJens Axboe vh->crc32 = crc32c_intel(p, len); 7693845591fadea480177223e28c9d1c03642d34f0eJens Axboe else 7703845591fadea480177223e28c9d1c03642d34f0eJens Axboe vh->crc32 = crc32c(p, len); 771bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe} 772bac39e0e8807a1d52863ad8304e67221df2bc63bJens Axboe 773d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboestatic void fill_crc64(struct verify_header *hdr, void *p, unsigned int len) 774d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe{ 775546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_crc64 *vh = hdr_priv(hdr); 776546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe 777546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe vh->crc64 = crc64(p, len); 778d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe} 779d77a7af3e718200bbd77d76194725ead4bdb3591Jens Axboe 780e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboestatic void fill_md5(struct verify_header *hdr, void *p, unsigned int len) 781e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 782546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe struct vhdr_md5 *vh = hdr_priv(hdr); 7838c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe struct md5_ctx md5_ctx = { 784546dfd9ff99eec4af5d1c6c2ca702b7cf9656334Jens Axboe .hash = (uint32_t *) vh->md5_digest, 7858c432325c3df2075a77b27eab8a87704cf7b48eeJens Axboe }; 786e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 78761f821f16cf27d8742e09b3a137c933cd0085e9bJens Axboe md5_init(&md5_ctx); 788e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe md5_update(&md5_ctx, p, len); 789e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 790e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 7917d9fb455aadc0c0363489591775496f27f4a560aJens Axboestatic void populate_hdr(struct thread_data *td, struct io_u *io_u, 7927d9fb455aadc0c0363489591775496f27f4a560aJens Axboe struct verify_header *hdr, unsigned int header_num, 7937d9fb455aadc0c0363489591775496f27f4a560aJens Axboe unsigned int header_len) 7947d9fb455aadc0c0363489591775496f27f4a560aJens Axboe{ 7957d9fb455aadc0c0363489591775496f27f4a560aJens Axboe unsigned int data_len; 7967d9fb455aadc0c0363489591775496f27f4a560aJens Axboe void *data, *p; 7977d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 7987d9fb455aadc0c0363489591775496f27f4a560aJens Axboe p = (void *) hdr; 7997d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 8007d9fb455aadc0c0363489591775496f27f4a560aJens Axboe hdr->fio_magic = FIO_HDR_MAGIC; 8017d9fb455aadc0c0363489591775496f27f4a560aJens Axboe hdr->len = header_len; 8027d9fb455aadc0c0363489591775496f27f4a560aJens Axboe hdr->verify_type = td->o.verify; 8037d9fb455aadc0c0363489591775496f27f4a560aJens Axboe hdr->rand_seed = io_u->rand_seed; 8047d9fb455aadc0c0363489591775496f27f4a560aJens Axboe data_len = header_len - hdr_size(hdr); 8057d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 8067d9fb455aadc0c0363489591775496f27f4a560aJens Axboe data = p + hdr_size(hdr); 8077d9fb455aadc0c0363489591775496f27f4a560aJens Axboe switch (td->o.verify) { 8087d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_MD5: 8097d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill md5 io_u %p, len %u\n", 8107d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 8117d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_md5(hdr, data, data_len); 8127d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 8137d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_CRC64: 8147d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill crc64 io_u %p, len %u\n", 8157d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 8167d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_crc64(hdr, data, data_len); 8177d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 8187d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_CRC32C: 8197d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_CRC32C_INTEL: 8207d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill crc32c io_u %p, len %u\n", 8217d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 8227d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_crc32c(hdr, data, data_len); 8237d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 8247d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_CRC32: 8257d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill crc32 io_u %p, len %u\n", 8267d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 8277d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_crc32(hdr, data, data_len); 8287d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 8297d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_CRC16: 8307d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill crc16 io_u %p, len %u\n", 8317d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 8327d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_crc16(hdr, data, data_len); 8337d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 8347d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_CRC7: 8357d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill crc7 io_u %p, len %u\n", 8367d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 8377d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_crc7(hdr, data, data_len); 8387d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 8397d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_SHA256: 8407d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill sha256 io_u %p, len %u\n", 8417d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 8427d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_sha256(hdr, data, data_len); 8437d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 8447d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_SHA512: 8457d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill sha512 io_u %p, len %u\n", 8467d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 8477d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_sha512(hdr, data, data_len); 8487d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 8497d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_META: 8507d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill meta io_u %p, len %u\n", 8517d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 8527d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_meta(hdr, td, io_u, header_num); 8537d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 8547d9fb455aadc0c0363489591775496f27f4a560aJens Axboe case VERIFY_SHA1: 8557d9fb455aadc0c0363489591775496f27f4a560aJens Axboe dprint(FD_VERIFY, "fill sha1 io_u %p, len %u\n", 8567d9fb455aadc0c0363489591775496f27f4a560aJens Axboe io_u, hdr->len); 8577d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_sha1(hdr, data, data_len); 8587d9fb455aadc0c0363489591775496f27f4a560aJens Axboe break; 8597d9fb455aadc0c0363489591775496f27f4a560aJens Axboe default: 8607d9fb455aadc0c0363489591775496f27f4a560aJens Axboe log_err("fio: bad verify type: %d\n", td->o.verify); 8617d9fb455aadc0c0363489591775496f27f4a560aJens Axboe assert(0); 8627d9fb455aadc0c0363489591775496f27f4a560aJens Axboe } 8637d9fb455aadc0c0363489591775496f27f4a560aJens Axboe if (td->o.verify_offset) 8647d9fb455aadc0c0363489591775496f27f4a560aJens Axboe memswp(p, p + td->o.verify_offset, hdr_size(hdr)); 8657d9fb455aadc0c0363489591775496f27f4a560aJens Axboe} 8667d9fb455aadc0c0363489591775496f27f4a560aJens Axboe 867e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe/* 868e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * fill body of io_u->buf with random data and add a header with the 869e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe * crc32 or md5 sum of that data. 870e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe */ 871e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboevoid populate_verify_io_u(struct thread_data *td, struct io_u *io_u) 872e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 873baefa9beacca430b8e3275c07d2f46ef14654468Jens Axboe struct verify_header *hdr; 8747d9fb455aadc0c0363489591775496f27f4a560aJens Axboe unsigned int hdr_inc, header_num = 0; 8757d9fb455aadc0c0363489591775496f27f4a560aJens Axboe void *p = io_u->buf; 876e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 8779cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe if (td->o.verify == VERIFY_NULL) 8789cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe return; 8799cc3d1506b9f7ce0a9dba38c32c418e54ea0b573Jens Axboe 8807d9fb455aadc0c0363489591775496f27f4a560aJens Axboe fill_pattern(td, p, io_u->buflen, io_u, 0, 0); 881546a9142511875524850ac92776184fd9fb7196eShawn Lewis 882546a9142511875524850ac92776184fd9fb7196eShawn Lewis hdr_inc = io_u->buflen; 883a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe if (td->o.verify_interval) 884a59e170d683f9ccbaa45648d7ae9a13b70e3822cJens Axboe hdr_inc = td->o.verify_interval; 885baefa9beacca430b8e3275c07d2f46ef14654468Jens Axboe 8865ec10eaad3b09875b91e19a20bbdfa06f2117562Jens Axboe for (; p < io_u->buf + io_u->buflen; p += hdr_inc) { 88795646108f83a34c0486d7f3ed19e99c1d93691e6Jens Axboe hdr = p; 8887d9fb455aadc0c0363489591775496f27f4a560aJens Axboe populate_hdr(td, io_u, hdr, header_num, hdr_inc); 8897437ee87e4f6457168e8440f9308b4296ddb9263Shawn Lewis header_num++; 890e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe } 891e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 892e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 893e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboeint get_next_verify(struct thread_data *td, struct io_u *io_u) 894e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe{ 8958de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe struct io_piece *ipo = NULL; 896e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 897d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe /* 898d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe * this io_u is from a requeue, we already filled the offsets 899d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe */ 900d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe if (io_u->file) 901d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe return 0; 902d2d7fa53c18f1fc3fb89f3fe20df9b39986bde72Jens Axboe 9038de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe if (!RB_EMPTY_ROOT(&td->io_hist_tree)) { 9048de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe struct rb_node *n = rb_first(&td->io_hist_tree); 905e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 9068de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe ipo = rb_entry(n, struct io_piece, rb_node); 9074b87898e8d76aaf05baec83077a11311c1447397Jens Axboe rb_erase(n, &td->io_hist_tree); 908a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe assert(ipo->flags & IP_F_ONRB); 909a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe ipo->flags &= ~IP_F_ONRB; 91001743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe } else if (!flist_empty(&td->io_hist_list)) { 91101743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe ipo = flist_entry(td->io_hist_list.next, struct io_piece, list); 91201743ee1718e7ec4b16ae3e53c8f64900c6052ccJens Axboe flist_del(&ipo->list); 913a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe assert(ipo->flags & IP_F_ONLIST); 914a917a8b3dfeefdd7007ba2f46f21fc145574309dJens Axboe ipo->flags &= ~IP_F_ONLIST; 9158de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe } 916e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 9178de8f047bd025f12d23cfc3fc1793434c6d8ff94Jens Axboe if (ipo) { 9180d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe td->io_hist_len--; 9190d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 920e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe io_u->offset = ipo->offset; 921e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe io_u->buflen = ipo->len; 92236167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe io_u->file = ipo->file; 92397af62cec418cd722fb43c6010d6430534e12353Jens Axboe 9240d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe if (ipo->flags & IP_F_TRIMMED) 9250d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe io_u->flags |= IO_U_F_TRIMMED; 9260d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 927d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe if (!fio_file_open(io_u->file)) { 92897af62cec418cd722fb43c6010d6430534e12353Jens Axboe int r = td_io_open_file(td, io_u->file); 92997af62cec418cd722fb43c6010d6430534e12353Jens Axboe 930bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe if (r) { 931bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "failed file %s open\n", 932bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe io_u->file->file_name); 93397af62cec418cd722fb43c6010d6430534e12353Jens Axboe return 1; 934bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe } 93597af62cec418cd722fb43c6010d6430534e12353Jens Axboe } 93697af62cec418cd722fb43c6010d6430534e12353Jens Axboe 93797af62cec418cd722fb43c6010d6430534e12353Jens Axboe get_file(ipo->file); 938d6aed795f2e3e403828abf60874dd2d6e8342a1bJens Axboe assert(fio_file_open(io_u->file)); 939e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe io_u->ddir = DDIR_READ; 94036167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe io_u->xfer_buf = io_u->buf; 94136167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe io_u->xfer_buflen = io_u->buflen; 9420d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe 9430d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe remove_trim_entry(td, ipo); 944e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe free(ipo); 945bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "get_next_verify: ret io_u %p\n", io_u); 946e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe return 0; 947e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe } 948e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe 949bd6f78b2f0b6375383948f126368804612ec0035Jens Axboe dprint(FD_VERIFY, "get_next_verify: empty\n"); 950e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe return 1; 951e29d1b70a21e29801fb35dfbc1b236b7c8514055Jens Axboe} 952e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 953e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboestatic void *verify_async_thread(void *data) 954e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{ 955e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe struct thread_data *td = data; 956e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe struct io_u *io_u; 957e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe int ret = 0; 958e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 959e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (td->o.verify_cpumask_set && 960e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe fio_setaffinity(td->pid, td->o.verify_cpumask)) { 961e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe log_err("fio: failed setting verify thread affinity\n"); 962e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe goto done; 963e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 964e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 965e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe do { 966e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe FLIST_HEAD(list); 967e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe 968e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe read_barrier(); 969e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (td->verify_thread_exit) 970e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe break; 971e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 972e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_lock(&td->io_u_lock); 973e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 974e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe while (flist_empty(&td->verify_list) && 975e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe !td->verify_thread_exit) { 976b36e298b5bdfc31ffc9a4c14e94a9c5c748888b0Jens Axboe ret = pthread_cond_wait(&td->verify_cond, 977b36e298b5bdfc31ffc9a4c14e94a9c5c748888b0Jens Axboe &td->io_u_lock); 978e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (ret) { 979e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 980e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe break; 981e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 982e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 983e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 984e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe flist_splice_init(&td->verify_list, &list); 985e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 986e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe 987e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe if (flist_empty(&list)) 988e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe continue; 989e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 990e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe while (!flist_empty(&list)) { 991e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe io_u = flist_entry(list.next, struct io_u, list); 992e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe flist_del_init(&io_u->list); 993e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 994d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe ret = verify_io_u(td, io_u); 995e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe put_io_u(td, io_u); 996d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe if (!ret) 997d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe continue; 998d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe if (td->o.continue_on_error && 999d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe td_non_fatal_error(ret)) { 1000d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe update_error_count(td, ret); 1001d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe td_clear_error(td); 1002d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe ret = 0; 1003d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe } 1004e53ab27c7425241d64e8d64ad77850a776c01375Jens Axboe } 1005e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } while (!ret); 1006e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1007d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe if (ret) { 1008d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe td_verror(td, ret, "async_verify"); 1009f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe if (td->o.verify_fatal) 1010f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2aJens Axboe td->terminate = 1; 1011d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe } 1012d561f2ab37ef5729882ef3c6e6ed8ee49414955fJens Axboe 1013e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboedone: 1014e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_lock(&td->io_u_lock); 1015e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->nr_verify_threads--; 1016e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 1017e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1018e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_signal(&td->free_cond); 1019e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe return NULL; 1020e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe} 1021e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1022e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboeint verify_async_init(struct thread_data *td) 1023e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{ 1024e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe int i, ret; 1025304a47c7d94f407cc72a87025679a67f02288447bart Van Assche pthread_attr_t attr; 1026304a47c7d94f407cc72a87025679a67f02288447bart Van Assche 1027304a47c7d94f407cc72a87025679a67f02288447bart Van Assche pthread_attr_init(&attr); 1028304a47c7d94f407cc72a87025679a67f02288447bart Van Assche pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN); 1029e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1030e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_thread_exit = 0; 1031e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1032e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_threads = malloc(sizeof(pthread_t) * td->o.verify_async); 1033e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe for (i = 0; i < td->o.verify_async; i++) { 1034304a47c7d94f407cc72a87025679a67f02288447bart Van Assche ret = pthread_create(&td->verify_threads[i], &attr, 1035e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe verify_async_thread, td); 1036e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (ret) { 1037e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe log_err("fio: async verify creation failed: %s\n", 1038e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe strerror(ret)); 1039e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe break; 1040e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 1041e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe ret = pthread_detach(td->verify_threads[i]); 1042e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (ret) { 1043e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe log_err("fio: async verify thread detach failed: %s\n", 1044e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe strerror(ret)); 1045e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe break; 1046e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 1047e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->nr_verify_threads++; 1048e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 1049e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1050304a47c7d94f407cc72a87025679a67f02288447bart Van Assche pthread_attr_destroy(&attr); 1051304a47c7d94f407cc72a87025679a67f02288447bart Van Assche 1052e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe if (i != td->o.verify_async) { 1053e40823b10920f679d84f3f2222e319c168b1e7daJens Axboe log_err("fio: only %d verify threads started, exiting\n", i); 1054e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_thread_exit = 1; 1055e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe write_barrier(); 1056e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_broadcast(&td->verify_cond); 1057e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe return 1; 1058e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe } 1059e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1060e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe return 0; 1061e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe} 1062e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1063e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboevoid verify_async_exit(struct thread_data *td) 1064e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe{ 1065e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_thread_exit = 1; 1066e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe write_barrier(); 1067e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_broadcast(&td->verify_cond); 1068e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1069e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_lock(&td->io_u_lock); 1070e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1071e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe while (td->nr_verify_threads) 1072e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_cond_wait(&td->free_cond, &td->io_u_lock); 1073e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe 1074e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe pthread_mutex_unlock(&td->io_u_lock); 1075e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe free(td->verify_threads); 1076e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe td->verify_threads = NULL; 1077e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe} 1078