Fio 1.50-rc3
[fio.git] / verify.c
1 /*
2  * IO verification helpers
3  */
4 #include <unistd.h>
5 #include <fcntl.h>
6 #include <string.h>
7 #include <assert.h>
8 #include <pthread.h>
9 #include <libgen.h>
10
11 #include "fio.h"
12 #include "verify.h"
13 #include "smalloc.h"
14 #include "trim.h"
15 #include "lib/rand.h"
16
17 #include "crc/md5.h"
18 #include "crc/crc64.h"
19 #include "crc/crc32.h"
20 #include "crc/crc32c.h"
21 #include "crc/crc16.h"
22 #include "crc/crc7.h"
23 #include "crc/sha256.h"
24 #include "crc/sha512.h"
25 #include "crc/sha1.h"
26
27 static void populate_hdr(struct thread_data *td, struct io_u *io_u,
28                          struct verify_header *hdr, unsigned int header_num,
29                          unsigned int header_len);
30
31 void fill_pattern(struct thread_data *td, void *p, unsigned int len, struct io_u *io_u, unsigned long seed, int use_seed)
32 {
33         switch (td->o.verify_pattern_bytes) {
34         case 0:
35                 dprint(FD_VERIFY, "fill random bytes len=%u\n", len);
36                 if (use_seed)
37                         __fill_random_buf(p, len, seed);
38                 else
39                         io_u->rand_seed = fill_random_buf(p, len);
40                 break;
41         case 1:
42                 /*
43                  * See below write barrier comment
44                  */
45 #if 0
46                 read_barrier();
47                 if (io_u->buf_filled_len >= len) {
48                         dprint(FD_VERIFY, "using already filled verify pattern b=0 len=%u\n", len);
49                         return;
50                 }
51 #endif
52                 dprint(FD_VERIFY, "fill verify pattern b=0 len=%u\n", len);
53                 memset(p, td->o.verify_pattern[0], len);
54                 /*
55                  * We need to ensure that the pattern stores are seen before
56                  * the fill length store, or we could observe headers that
57                  * aren't valid to the extent notified by the fill length
58                  */
59                 write_barrier();
60                 io_u->buf_filled_len = len;
61                 break;
62         default: {
63                 unsigned int i = 0, size = 0;
64                 unsigned char *b = p;
65
66 #if 0
67                 read_barrier();
68                 if (io_u->buf_filled_len >= len) {
69                         dprint(FD_VERIFY, "using already filled verify pattern b=%d len=%u\n",
70                                         td->o.verify_pattern_bytes, len);
71                         return;
72                 }
73 #endif
74                 dprint(FD_VERIFY, "fill verify pattern b=%d len=%u\n",
75                                         td->o.verify_pattern_bytes, len);
76
77                 while (i < len) {
78                         size = td->o.verify_pattern_bytes;
79                         if (size > (len - i))
80                                 size = len - i;
81                         memcpy(b+i, td->o.verify_pattern, size);
82                         i += size;
83                 }
84                 write_barrier();
85                 io_u->buf_filled_len = len;
86                 break;
87                 }
88         }
89 }
90
91 static unsigned int get_hdr_inc(struct thread_data *td, struct io_u *io_u)
92 {
93         unsigned int hdr_inc;
94
95         hdr_inc = io_u->buflen;
96         if (td->o.verify_interval)
97                 hdr_inc = td->o.verify_interval;
98
99         return hdr_inc;
100 }
101
102 static void fill_pattern_headers(struct thread_data *td, struct io_u *io_u,
103                                  unsigned long seed, int use_seed)
104 {
105         unsigned int hdr_inc, header_num;
106         struct verify_header *hdr;
107         void *p = io_u->buf;
108
109         fill_pattern(td, p, io_u->buflen, io_u, seed, use_seed);
110
111         hdr_inc = get_hdr_inc(td, io_u);
112         header_num = 0;
113         for (; p < io_u->buf + io_u->buflen; p += hdr_inc) {
114                 hdr = p;
115                 populate_hdr(td, io_u, hdr, header_num, hdr_inc);
116                 header_num++;
117         }
118 }
119
120 static void memswp(void *buf1, void *buf2, unsigned int len)
121 {
122         char swap[200];
123
124         assert(len <= sizeof(swap));
125
126         memcpy(&swap, buf1, len);
127         memcpy(buf1, buf2, len);
128         memcpy(buf2, &swap, len);
129 }
130
131 static void hexdump(void *buffer, int len)
132 {
133         unsigned char *p = buffer;
134         int i;
135
136         for (i = 0; i < len; i++)
137                 log_err("%02x", p[i]);
138         log_err("\n");
139 }
140
141 /*
142  * Prepare for seperation of verify_header and checksum header
143  */
144 static inline unsigned int __hdr_size(int verify_type)
145 {
146         unsigned int len = 0;
147
148         switch (verify_type) {
149         case VERIFY_NONE:
150         case VERIFY_NULL:
151                 len = 0;
152                 break;
153         case VERIFY_MD5:
154                 len = sizeof(struct vhdr_md5);
155                 break;
156         case VERIFY_CRC64:
157                 len = sizeof(struct vhdr_crc64);
158                 break;
159         case VERIFY_CRC32C:
160         case VERIFY_CRC32:
161         case VERIFY_CRC32C_INTEL:
162                 len = sizeof(struct vhdr_crc32);
163                 break;
164         case VERIFY_CRC16:
165                 len = sizeof(struct vhdr_crc16);
166                 break;
167         case VERIFY_CRC7:
168                 len = sizeof(struct vhdr_crc7);
169                 break;
170         case VERIFY_SHA256:
171                 len = sizeof(struct vhdr_sha256);
172                 break;
173         case VERIFY_SHA512:
174                 len = sizeof(struct vhdr_sha512);
175                 break;
176         case VERIFY_META:
177                 len = sizeof(struct vhdr_meta);
178                 break;
179         case VERIFY_SHA1:
180                 len = sizeof(struct vhdr_sha1);
181                 break;
182         default:
183                 log_err("fio: unknown verify header!\n");
184                 assert(0);
185         }
186
187         return len + sizeof(struct verify_header);
188 }
189
190 static inline unsigned int hdr_size(struct verify_header *hdr)
191 {
192         return __hdr_size(hdr->verify_type);
193 }
194
195 static void *hdr_priv(struct verify_header *hdr)
196 {
197         void *priv = hdr;
198
199         return priv + sizeof(struct verify_header);
200 }
201
202 /*
203  * Verify container, pass info to verify handlers and allow them to
204  * pass info back in case of error
205  */
206 struct vcont {
207         /*
208          * Input
209          */
210         struct io_u *io_u;
211         unsigned int hdr_num;
212         struct thread_data *td;
213
214         /*
215          * Output, only valid in case of error
216          */
217         const char *name;
218         void *good_crc;
219         void *bad_crc;
220         unsigned int crc_len;
221 };
222
223 static void dump_buf(char *buf, unsigned int len, unsigned long long offset,
224                      const char *type, struct fio_file *f)
225 {
226         char *ptr, fname[256];
227         int ret, fd;
228
229         ptr = strdup(f->file_name);
230         strcpy(fname, basename(ptr));
231
232         sprintf(fname + strlen(fname), ".%llu.%s", offset, type);
233
234         fd = open(fname, O_CREAT | O_TRUNC | O_WRONLY, 0644);
235         if (fd < 0) {
236                 perror("open verify buf file");
237                 return;
238         }
239
240         while (len) {
241                 ret = write(fd, buf, len);
242                 if (!ret)
243                         break;
244                 else if (ret < 0) {
245                         perror("write verify buf file");
246                         break;
247                 }
248                 len -= ret;
249                 buf += ret;
250         }
251
252         close(fd);
253         log_err("       %s data dumped as %s\n", type, fname);
254         free(ptr);
255 }
256
257 /*
258  * Dump the contents of the read block and re-generate the correct data
259  * and dump that too.
260  */
261 static void dump_verify_buffers(struct verify_header *hdr, struct vcont *vc)
262 {
263         struct thread_data *td = vc->td;
264         struct io_u *io_u = vc->io_u;
265         unsigned long hdr_offset;
266         struct io_u dummy;
267         void *buf;
268
269         /*
270          * Dump the contents we just read off disk
271          */
272         hdr_offset = vc->hdr_num * hdr->len;
273
274         dump_buf(io_u->buf + hdr_offset, hdr->len, io_u->offset + hdr_offset,
275                         "received", vc->io_u->file);
276
277         /*
278          * Allocate a new buf and re-generate the original data
279          */
280         buf = malloc(io_u->buflen);
281         dummy = *io_u;
282         dummy.buf = buf;
283         dummy.rand_seed = hdr->rand_seed;
284         dummy.buf_filled_len = 0;
285
286         fill_pattern_headers(td, &dummy, hdr->rand_seed, 1);
287
288         dump_buf(buf + hdr_offset, hdr->len, io_u->offset + hdr_offset,
289                         "expected", vc->io_u->file);
290         free(buf);
291 }
292
293 static void log_verify_failure(struct verify_header *hdr, struct vcont *vc)
294 {
295         unsigned long long offset;
296
297         offset = vc->io_u->offset;
298         offset += vc->hdr_num * hdr->len;
299         log_err("%.8s: verify failed at file %s offset %llu, length %u\n",
300                         vc->name, vc->io_u->file->file_name, offset, hdr->len);
301
302         if (vc->good_crc && vc->bad_crc) {
303                 log_err("       Expected CRC: ");
304                 hexdump(vc->good_crc, vc->crc_len);
305                 log_err("       Received CRC: ");
306                 hexdump(vc->bad_crc, vc->crc_len);
307         }
308
309         dump_verify_buffers(hdr, vc);
310 }
311
312 /*
313  * Return data area 'header_num'
314  */
315 static inline void *io_u_verify_off(struct verify_header *hdr, struct vcont *vc)
316 {
317         return vc->io_u->buf + vc->hdr_num * hdr->len + hdr_size(hdr);
318 }
319
320 static int verify_io_u_meta(struct verify_header *hdr, struct thread_data *td,
321                             struct vcont *vc)
322 {
323         struct vhdr_meta *vh = hdr_priv(hdr);
324         struct io_u *io_u = vc->io_u;
325
326         dprint(FD_VERIFY, "meta verify io_u %p, len %u\n", io_u, hdr->len);
327
328         if (vh->offset == io_u->offset + vc->hdr_num * td->o.verify_interval)
329                 return 0;
330
331         vc->name = "meta";
332         log_verify_failure(hdr, vc);
333         return EILSEQ;
334 }
335
336 static int verify_io_u_sha512(struct verify_header *hdr, struct vcont *vc)
337 {
338         void *p = io_u_verify_off(hdr, vc);
339         struct vhdr_sha512 *vh = hdr_priv(hdr);
340         uint8_t sha512[128];
341         struct sha512_ctx sha512_ctx = {
342                 .buf = sha512,
343         };
344
345         dprint(FD_VERIFY, "sha512 verify io_u %p, len %u\n", vc->io_u, hdr->len);
346
347         sha512_init(&sha512_ctx);
348         sha512_update(&sha512_ctx, p, hdr->len - hdr_size(hdr));
349
350         if (!memcmp(vh->sha512, sha512_ctx.buf, sizeof(sha512)))
351                 return 0;
352
353         vc->name = "sha512";
354         vc->good_crc = vh->sha512;
355         vc->bad_crc = sha512_ctx.buf;
356         vc->crc_len = sizeof(vh->sha512);
357         log_verify_failure(hdr, vc);
358         return EILSEQ;
359 }
360
361 static int verify_io_u_sha256(struct verify_header *hdr, struct vcont *vc)
362 {
363         void *p = io_u_verify_off(hdr, vc);
364         struct vhdr_sha256 *vh = hdr_priv(hdr);
365         uint8_t sha256[64];
366         struct sha256_ctx sha256_ctx = {
367                 .buf = sha256,
368         };
369
370         dprint(FD_VERIFY, "sha256 verify io_u %p, len %u\n", vc->io_u, hdr->len);
371
372         sha256_init(&sha256_ctx);
373         sha256_update(&sha256_ctx, p, hdr->len - hdr_size(hdr));
374
375         if (!memcmp(vh->sha256, sha256_ctx.buf, sizeof(sha256)))
376                 return 0;
377
378         vc->name = "sha256";
379         vc->good_crc = vh->sha256;
380         vc->bad_crc = sha256_ctx.buf;
381         vc->crc_len = sizeof(vh->sha256);
382         log_verify_failure(hdr, vc);
383         return EILSEQ;
384 }
385
386 static int verify_io_u_sha1(struct verify_header *hdr, struct vcont *vc)
387 {
388         void *p = io_u_verify_off(hdr, vc);
389         struct vhdr_sha1 *vh = hdr_priv(hdr);
390         uint32_t sha1[5];
391         struct sha1_ctx sha1_ctx = {
392                 .H = sha1,
393         };
394
395         dprint(FD_VERIFY, "sha1 verify io_u %p, len %u\n", vc->io_u, hdr->len);
396
397         sha1_init(&sha1_ctx);
398         sha1_update(&sha1_ctx, p, hdr->len - hdr_size(hdr));
399
400         if (!memcmp(vh->sha1, sha1_ctx.H, sizeof(sha1)))
401                 return 0;
402
403         vc->name = "sha1";
404         vc->good_crc = vh->sha1;
405         vc->bad_crc = sha1_ctx.H;
406         vc->crc_len = sizeof(vh->sha1);
407         log_verify_failure(hdr, vc);
408         return EILSEQ;
409 }
410
411 static int verify_io_u_crc7(struct verify_header *hdr, struct vcont *vc)
412 {
413         void *p = io_u_verify_off(hdr, vc);
414         struct vhdr_crc7 *vh = hdr_priv(hdr);
415         unsigned char c;
416
417         dprint(FD_VERIFY, "crc7 verify io_u %p, len %u\n", vc->io_u, hdr->len);
418
419         c = crc7(p, hdr->len - hdr_size(hdr));
420
421         if (c == vh->crc7)
422                 return 0;
423
424         vc->name = "crc7";
425         vc->good_crc = &vh->crc7;
426         vc->bad_crc = &c;
427         vc->crc_len = 1;
428         log_verify_failure(hdr, vc);
429         return EILSEQ;
430 }
431
432 static int verify_io_u_crc16(struct verify_header *hdr, struct vcont *vc)
433 {
434         void *p = io_u_verify_off(hdr, vc);
435         struct vhdr_crc16 *vh = hdr_priv(hdr);
436         unsigned short c;
437
438         dprint(FD_VERIFY, "crc16 verify io_u %p, len %u\n", vc->io_u, hdr->len);
439
440         c = crc16(p, hdr->len - hdr_size(hdr));
441
442         if (c == vh->crc16)
443                 return 0;
444
445         vc->name = "crc16";
446         vc->good_crc = &vh->crc16;
447         vc->bad_crc = &c;
448         vc->crc_len = 2;
449         log_verify_failure(hdr, vc);
450         return EILSEQ;
451 }
452
453 static int verify_io_u_crc64(struct verify_header *hdr, struct vcont *vc)
454 {
455         void *p = io_u_verify_off(hdr, vc);
456         struct vhdr_crc64 *vh = hdr_priv(hdr);
457         unsigned long long c;
458
459         dprint(FD_VERIFY, "crc64 verify io_u %p, len %u\n", vc->io_u, hdr->len);
460
461         c = crc64(p, hdr->len - hdr_size(hdr));
462
463         if (c == vh->crc64)
464                 return 0;
465
466         vc->name = "crc64";
467         vc->good_crc = &vh->crc64;
468         vc->bad_crc = &c;
469         vc->crc_len = 8;
470         log_verify_failure(hdr, vc);
471         return EILSEQ;
472 }
473
474 static int verify_io_u_crc32(struct verify_header *hdr, struct vcont *vc)
475 {
476         void *p = io_u_verify_off(hdr, vc);
477         struct vhdr_crc32 *vh = hdr_priv(hdr);
478         uint32_t c;
479
480         dprint(FD_VERIFY, "crc32 verify io_u %p, len %u\n", vc->io_u, hdr->len);
481
482         c = crc32(p, hdr->len - hdr_size(hdr));
483
484         if (c == vh->crc32)
485                 return 0;
486
487         vc->name = "crc32";
488         vc->good_crc = &vh->crc32;
489         vc->bad_crc = &c;
490         vc->crc_len = 4;
491         log_verify_failure(hdr, vc);
492         return EILSEQ;
493 }
494
495 static int verify_io_u_crc32c(struct verify_header *hdr, struct vcont *vc)
496 {
497         void *p = io_u_verify_off(hdr, vc);
498         struct vhdr_crc32 *vh = hdr_priv(hdr);
499         uint32_t c;
500
501         dprint(FD_VERIFY, "crc32c verify io_u %p, len %u\n", vc->io_u, hdr->len);
502
503         if (hdr->verify_type == VERIFY_CRC32C_INTEL)
504                 c = crc32c_intel(p, hdr->len - hdr_size(hdr));
505         else
506                 c = crc32c(p, hdr->len - hdr_size(hdr));
507
508         if (c == vh->crc32)
509                 return 0;
510
511         vc->name = "crc32c";
512         vc->good_crc = &vh->crc32;
513         vc->bad_crc = &c;
514         vc->crc_len = 4;
515         log_verify_failure(hdr, vc);
516         return EILSEQ;
517 }
518
519 static int verify_io_u_md5(struct verify_header *hdr, struct vcont *vc)
520 {
521         void *p = io_u_verify_off(hdr, vc);
522         struct vhdr_md5 *vh = hdr_priv(hdr);
523         uint32_t hash[MD5_HASH_WORDS];
524         struct md5_ctx md5_ctx = {
525                 .hash = hash,
526         };
527
528         dprint(FD_VERIFY, "md5 verify io_u %p, len %u\n", vc->io_u, hdr->len);
529
530         md5_init(&md5_ctx);
531         md5_update(&md5_ctx, p, hdr->len - hdr_size(hdr));
532
533         if (!memcmp(vh->md5_digest, md5_ctx.hash, sizeof(hash)))
534                 return 0;
535
536         vc->name = "md5";
537         vc->good_crc = vh->md5_digest;
538         vc->bad_crc = md5_ctx.hash;
539         vc->crc_len = sizeof(hash);
540         log_verify_failure(hdr, vc);
541         return EILSEQ;
542 }
543
544 static unsigned int hweight8(unsigned int w)
545 {
546         unsigned int res = w - ((w >> 1) & 0x55);
547
548         res = (res & 0x33) + ((res >> 2) & 0x33);
549         return (res + (res >> 4)) & 0x0F;
550 }
551
552 int verify_io_u_pattern(struct verify_header *hdr, struct vcont *vc)
553 {
554         struct thread_data *td = vc->td;
555         struct io_u *io_u = vc->io_u;
556         char *buf, *pattern;
557         unsigned int hdr_size = __hdr_size(td->o.verify);
558         unsigned int len, mod, i;
559
560         pattern = td->o.verify_pattern;
561         buf = (void *) hdr + hdr_size;
562         len = get_hdr_inc(td, io_u) - hdr_size;
563         mod = hdr_size % td->o.verify_pattern_bytes;
564
565         for (i = 0; i < len; i++) {
566                 if (buf[i] != pattern[mod]) {
567                         unsigned int bits;
568
569                         bits = hweight8(buf[i] ^ pattern[mod]);
570                         log_err("fio: got pattern %x, wanted %x. Bad bits %d\n",
571                                 buf[i], pattern[mod], bits);
572                         log_err("fio: bad pattern block offset %u\n", i);
573                         dump_verify_buffers(hdr, vc);
574                         return EILSEQ;
575                 }
576                 mod++;
577                 if (mod == td->o.verify_pattern_bytes)
578                         mod = 0;
579         }
580
581         return 0;
582 }
583
584 /*
585  * Push IO verification to a separate thread
586  */
587 int verify_io_u_async(struct thread_data *td, struct io_u *io_u)
588 {
589         if (io_u->file)
590                 put_file_log(td, io_u->file);
591
592         io_u->file = NULL;
593
594         pthread_mutex_lock(&td->io_u_lock);
595         
596         if (io_u->flags & IO_U_F_IN_CUR_DEPTH) {
597                 td->cur_depth--;
598                 io_u->flags &= ~IO_U_F_IN_CUR_DEPTH;
599         }
600         flist_del(&io_u->list);
601         flist_add_tail(&io_u->list, &td->verify_list);
602         io_u->flags |= IO_U_F_FREE_DEF;
603         pthread_mutex_unlock(&td->io_u_lock);
604
605         pthread_cond_signal(&td->verify_cond);
606         return 0;
607 }
608
609 static int verify_trimmed_io_u(struct thread_data *td, struct io_u *io_u)
610 {
611         static char zero_buf[1024];
612         unsigned int this_len, len;
613         int ret = 0;
614         void *p;
615
616         if (!td->o.trim_zero)
617                 return 0;
618
619         len = io_u->buflen;
620         p = io_u->buf;
621         do {
622                 this_len = sizeof(zero_buf);
623                 if (this_len > len)
624                         this_len = len;
625                 if (memcmp(p, zero_buf, this_len)) {
626                         ret = EILSEQ;
627                         break;
628                 }
629                 len -= this_len;
630                 p += this_len;
631         } while (len);
632
633         if (!ret)
634                 return 0;
635
636         log_err("trim: verify failed at file %s offset %llu, length %lu"
637                 ", block offset %lu\n",
638                         io_u->file->file_name, io_u->offset, io_u->buflen,
639                         (unsigned long) (p - io_u->buf));
640         return ret;
641 }
642
643 int verify_io_u(struct thread_data *td, struct io_u *io_u)
644 {
645         struct verify_header *hdr;
646         unsigned int hdr_size, hdr_inc, hdr_num = 0;
647         void *p;
648         int ret;
649
650         if (td->o.verify == VERIFY_NULL || io_u->ddir != DDIR_READ)
651                 return 0;
652         if (io_u->flags & IO_U_F_TRIMMED) {
653                 ret = verify_trimmed_io_u(td, io_u);
654                 goto done;
655         }
656
657         hdr_inc = get_hdr_inc(td, io_u);
658
659         ret = 0;
660         for (p = io_u->buf; p < io_u->buf + io_u->buflen;
661              p += hdr_inc, hdr_num++) {
662                 struct vcont vc = {
663                         .io_u           = io_u,
664                         .hdr_num        = hdr_num,
665                         .td             = td,
666                 };
667
668                 if (ret && td->o.verify_fatal)
669                         break;
670
671                 hdr_size = __hdr_size(td->o.verify);
672                 if (td->o.verify_offset)
673                         memswp(p, p + td->o.verify_offset, hdr_size);
674                 hdr = p;
675
676                 if (hdr->fio_magic != FIO_HDR_MAGIC) {
677                         log_err("verify: bad magic header %x, wanted %x at file %s offset %llu, length %u\n",
678                                 hdr->fio_magic, FIO_HDR_MAGIC,
679                                 io_u->file->file_name,
680                                 io_u->offset + hdr_num * hdr->len, hdr->len);
681                         return EILSEQ;
682                 }
683
684                 if (td->o.verify_pattern_bytes) {
685                         dprint(FD_VERIFY, "pattern verify io_u %p, len %u\n",
686                                                                 io_u, hdr->len);
687                         ret = verify_io_u_pattern(hdr, &vc);
688                         if (ret) {
689                                 log_err("pattern: verify failed at file %s offset %llu, length %u\n",
690                                         io_u->file->file_name,
691                                         io_u->offset + hdr_num * hdr->len,
692                                         hdr->len);
693                         }
694
695                         /*
696                          * Also verify the meta data, if applicable
697                          */
698                         if (hdr->verify_type == VERIFY_META)
699                                 ret |= verify_io_u_meta(hdr, td, &vc);
700                         continue;
701                 }
702
703                 switch (hdr->verify_type) {
704                 case VERIFY_MD5:
705                         ret = verify_io_u_md5(hdr, &vc);
706                         break;
707                 case VERIFY_CRC64:
708                         ret = verify_io_u_crc64(hdr, &vc);
709                         break;
710                 case VERIFY_CRC32C:
711                 case VERIFY_CRC32C_INTEL:
712                         ret = verify_io_u_crc32c(hdr, &vc);
713                         break;
714                 case VERIFY_CRC32:
715                         ret = verify_io_u_crc32(hdr, &vc);
716                         break;
717                 case VERIFY_CRC16:
718                         ret = verify_io_u_crc16(hdr, &vc);
719                         break;
720                 case VERIFY_CRC7:
721                         ret = verify_io_u_crc7(hdr, &vc);
722                         break;
723                 case VERIFY_SHA256:
724                         ret = verify_io_u_sha256(hdr, &vc);
725                         break;
726                 case VERIFY_SHA512:
727                         ret = verify_io_u_sha512(hdr, &vc);
728                         break;
729                 case VERIFY_META:
730                         ret = verify_io_u_meta(hdr, td, &vc);
731                         break;
732                 case VERIFY_SHA1:
733                         ret = verify_io_u_sha1(hdr, &vc);
734                         break;
735                 default:
736                         log_err("Bad verify type %u\n", hdr->verify_type);
737                         ret = EINVAL;
738                 }
739         }
740
741 done:
742         if (ret && td->o.verify_fatal)
743                 td->terminate = 1;
744
745         return ret;
746 }
747
748 static void fill_meta(struct verify_header *hdr, struct thread_data *td,
749                       struct io_u *io_u, unsigned int header_num)
750 {
751         struct vhdr_meta *vh = hdr_priv(hdr);
752
753         vh->thread = td->thread_number;
754
755         vh->time_sec = io_u->start_time.tv_sec;
756         vh->time_usec = io_u->start_time.tv_usec;
757
758         vh->numberio = td->io_issues[DDIR_WRITE];
759
760         vh->offset = io_u->offset + header_num * td->o.verify_interval;
761 }
762
763 static void fill_sha512(struct verify_header *hdr, void *p, unsigned int len)
764 {
765         struct vhdr_sha512 *vh = hdr_priv(hdr);
766         struct sha512_ctx sha512_ctx = {
767                 .buf = vh->sha512,
768         };
769
770         sha512_init(&sha512_ctx);
771         sha512_update(&sha512_ctx, p, len);
772 }
773
774 static void fill_sha256(struct verify_header *hdr, void *p, unsigned int len)
775 {
776         struct vhdr_sha256 *vh = hdr_priv(hdr);
777         struct sha256_ctx sha256_ctx = {
778                 .buf = vh->sha256,
779         };
780
781         sha256_init(&sha256_ctx);
782         sha256_update(&sha256_ctx, p, len);
783 }
784
785 static void fill_sha1(struct verify_header *hdr, void *p, unsigned int len)
786 {
787         struct vhdr_sha1 *vh = hdr_priv(hdr);
788         struct sha1_ctx sha1_ctx = {
789                 .H = vh->sha1,
790         };
791
792         sha1_init(&sha1_ctx);
793         sha1_update(&sha1_ctx, p, len);
794 }
795
796 static void fill_crc7(struct verify_header *hdr, void *p, unsigned int len)
797 {
798         struct vhdr_crc7 *vh = hdr_priv(hdr);
799
800         vh->crc7 = crc7(p, len);
801 }
802
803 static void fill_crc16(struct verify_header *hdr, void *p, unsigned int len)
804 {
805         struct vhdr_crc16 *vh = hdr_priv(hdr);
806
807         vh->crc16 = crc16(p, len);
808 }
809
810 static void fill_crc32(struct verify_header *hdr, void *p, unsigned int len)
811 {
812         struct vhdr_crc32 *vh = hdr_priv(hdr);
813
814         vh->crc32 = crc32(p, len);
815 }
816
817 static void fill_crc32c(struct verify_header *hdr, void *p, unsigned int len)
818 {
819         struct vhdr_crc32 *vh = hdr_priv(hdr);
820
821         if (hdr->verify_type == VERIFY_CRC32C_INTEL)
822                 vh->crc32 = crc32c_intel(p, len);
823         else
824                 vh->crc32 = crc32c(p, len);
825 }
826
827 static void fill_crc64(struct verify_header *hdr, void *p, unsigned int len)
828 {
829         struct vhdr_crc64 *vh = hdr_priv(hdr);
830
831         vh->crc64 = crc64(p, len);
832 }
833
834 static void fill_md5(struct verify_header *hdr, void *p, unsigned int len)
835 {
836         struct vhdr_md5 *vh = hdr_priv(hdr);
837         struct md5_ctx md5_ctx = {
838                 .hash = (uint32_t *) vh->md5_digest,
839         };
840
841         md5_init(&md5_ctx);
842         md5_update(&md5_ctx, p, len);
843 }
844
845 static void populate_hdr(struct thread_data *td, struct io_u *io_u,
846                          struct verify_header *hdr, unsigned int header_num,
847                          unsigned int header_len)
848 {
849         unsigned int data_len;
850         void *data, *p;
851
852         p = (void *) hdr;
853
854         hdr->fio_magic = FIO_HDR_MAGIC;
855         hdr->len = header_len;
856         hdr->verify_type = td->o.verify;
857         hdr->rand_seed = io_u->rand_seed;
858         data_len = header_len - hdr_size(hdr);
859
860         data = p + hdr_size(hdr);
861         switch (td->o.verify) {
862         case VERIFY_MD5:
863                 dprint(FD_VERIFY, "fill md5 io_u %p, len %u\n",
864                                                 io_u, hdr->len);
865                 fill_md5(hdr, data, data_len);
866                 break;
867         case VERIFY_CRC64:
868                 dprint(FD_VERIFY, "fill crc64 io_u %p, len %u\n",
869                                                 io_u, hdr->len);
870                 fill_crc64(hdr, data, data_len);
871                 break;
872         case VERIFY_CRC32C:
873         case VERIFY_CRC32C_INTEL:
874                 dprint(FD_VERIFY, "fill crc32c io_u %p, len %u\n",
875                                                 io_u, hdr->len);
876                 fill_crc32c(hdr, data, data_len);
877                 break;
878         case VERIFY_CRC32:
879                 dprint(FD_VERIFY, "fill crc32 io_u %p, len %u\n",
880                                                 io_u, hdr->len);
881                 fill_crc32(hdr, data, data_len);
882                 break;
883         case VERIFY_CRC16:
884                 dprint(FD_VERIFY, "fill crc16 io_u %p, len %u\n",
885                                                 io_u, hdr->len);
886                 fill_crc16(hdr, data, data_len);
887                 break;
888         case VERIFY_CRC7:
889                 dprint(FD_VERIFY, "fill crc7 io_u %p, len %u\n",
890                                                 io_u, hdr->len);
891                 fill_crc7(hdr, data, data_len);
892                 break;
893         case VERIFY_SHA256:
894                 dprint(FD_VERIFY, "fill sha256 io_u %p, len %u\n",
895                                                 io_u, hdr->len);
896                 fill_sha256(hdr, data, data_len);
897                 break;
898         case VERIFY_SHA512:
899                 dprint(FD_VERIFY, "fill sha512 io_u %p, len %u\n",
900                                                 io_u, hdr->len);
901                 fill_sha512(hdr, data, data_len);
902                 break;
903         case VERIFY_META:
904                 dprint(FD_VERIFY, "fill meta io_u %p, len %u\n",
905                                                 io_u, hdr->len);
906                 fill_meta(hdr, td, io_u, header_num);
907                 break;
908         case VERIFY_SHA1:
909                 dprint(FD_VERIFY, "fill sha1 io_u %p, len %u\n",
910                                                 io_u, hdr->len);
911                 fill_sha1(hdr, data, data_len);
912                 break;
913         default:
914                 log_err("fio: bad verify type: %d\n", td->o.verify);
915                 assert(0);
916         }
917         if (td->o.verify_offset)
918                 memswp(p, p + td->o.verify_offset, hdr_size(hdr));
919 }
920
921 /*
922  * fill body of io_u->buf with random data and add a header with the
923  * checksum of choice
924  */
925 void populate_verify_io_u(struct thread_data *td, struct io_u *io_u)
926 {
927         if (td->o.verify == VERIFY_NULL)
928                 return;
929
930         fill_pattern_headers(td, io_u, 0, 0);
931 }
932
933 int get_next_verify(struct thread_data *td, struct io_u *io_u)
934 {
935         struct io_piece *ipo = NULL;
936
937         /*
938          * this io_u is from a requeue, we already filled the offsets
939          */
940         if (io_u->file)
941                 return 0;
942
943         if (!RB_EMPTY_ROOT(&td->io_hist_tree)) {
944                 struct rb_node *n = rb_first(&td->io_hist_tree);
945
946                 ipo = rb_entry(n, struct io_piece, rb_node);
947                 rb_erase(n, &td->io_hist_tree);
948                 assert(ipo->flags & IP_F_ONRB);
949                 ipo->flags &= ~IP_F_ONRB;
950         } else if (!flist_empty(&td->io_hist_list)) {
951                 ipo = flist_entry(td->io_hist_list.next, struct io_piece, list);
952                 flist_del(&ipo->list);
953                 assert(ipo->flags & IP_F_ONLIST);
954                 ipo->flags &= ~IP_F_ONLIST;
955         }
956
957         if (ipo) {
958                 td->io_hist_len--;
959
960                 io_u->offset = ipo->offset;
961                 io_u->buflen = ipo->len;
962                 io_u->file = ipo->file;
963
964                 if (ipo->flags & IP_F_TRIMMED)
965                         io_u->flags |= IO_U_F_TRIMMED;
966
967                 if (!fio_file_open(io_u->file)) {
968                         int r = td_io_open_file(td, io_u->file);
969
970                         if (r) {
971                                 dprint(FD_VERIFY, "failed file %s open\n",
972                                                 io_u->file->file_name);
973                                 return 1;
974                         }
975                 }
976
977                 get_file(ipo->file);
978                 assert(fio_file_open(io_u->file));
979                 io_u->ddir = DDIR_READ;
980                 io_u->xfer_buf = io_u->buf;
981                 io_u->xfer_buflen = io_u->buflen;
982
983                 remove_trim_entry(td, ipo);
984                 free(ipo);
985                 dprint(FD_VERIFY, "get_next_verify: ret io_u %p\n", io_u);
986                 return 0;
987         }
988
989         dprint(FD_VERIFY, "get_next_verify: empty\n");
990         return 1;
991 }
992
993 static void *verify_async_thread(void *data)
994 {
995         struct thread_data *td = data;
996         struct io_u *io_u;
997         int ret = 0;
998
999         if (td->o.verify_cpumask_set &&
1000             fio_setaffinity(td->pid, td->o.verify_cpumask)) {
1001                 log_err("fio: failed setting verify thread affinity\n");
1002                 goto done;
1003         }
1004
1005         do {
1006                 FLIST_HEAD(list);
1007
1008                 read_barrier();
1009                 if (td->verify_thread_exit)
1010                         break;
1011
1012                 pthread_mutex_lock(&td->io_u_lock);
1013
1014                 while (flist_empty(&td->verify_list) &&
1015                        !td->verify_thread_exit) {
1016                         ret = pthread_cond_wait(&td->verify_cond,
1017                                                         &td->io_u_lock);
1018                         if (ret) {
1019                                 pthread_mutex_unlock(&td->io_u_lock);
1020                                 break;
1021                         }
1022                 }
1023
1024                 flist_splice_init(&td->verify_list, &list);
1025                 pthread_mutex_unlock(&td->io_u_lock);
1026
1027                 if (flist_empty(&list))
1028                         continue;
1029
1030                 while (!flist_empty(&list)) {
1031                         io_u = flist_entry(list.next, struct io_u, list);
1032                         flist_del_init(&io_u->list);
1033
1034                         ret = verify_io_u(td, io_u);
1035                         put_io_u(td, io_u);
1036                         if (!ret)
1037                                 continue;
1038                         if (td->o.continue_on_error &&
1039                             td_non_fatal_error(ret)) {
1040                                 update_error_count(td, ret);
1041                                 td_clear_error(td);
1042                                 ret = 0;
1043                         }
1044                 }
1045         } while (!ret);
1046
1047         if (ret) {
1048                 td_verror(td, ret, "async_verify");
1049                 if (td->o.verify_fatal)
1050                         td->terminate = 1;
1051         }
1052
1053 done:
1054         pthread_mutex_lock(&td->io_u_lock);
1055         td->nr_verify_threads--;
1056         pthread_mutex_unlock(&td->io_u_lock);
1057
1058         pthread_cond_signal(&td->free_cond);
1059         return NULL;
1060 }
1061
1062 int verify_async_init(struct thread_data *td)
1063 {
1064         int i, ret;
1065         pthread_attr_t attr;
1066
1067         pthread_attr_init(&attr);
1068         pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN);
1069
1070         td->verify_thread_exit = 0;
1071
1072         td->verify_threads = malloc(sizeof(pthread_t) * td->o.verify_async);
1073         for (i = 0; i < td->o.verify_async; i++) {
1074                 ret = pthread_create(&td->verify_threads[i], &attr,
1075                                         verify_async_thread, td);
1076                 if (ret) {
1077                         log_err("fio: async verify creation failed: %s\n",
1078                                         strerror(ret));
1079                         break;
1080                 }
1081                 ret = pthread_detach(td->verify_threads[i]);
1082                 if (ret) {
1083                         log_err("fio: async verify thread detach failed: %s\n",
1084                                         strerror(ret));
1085                         break;
1086                 }
1087                 td->nr_verify_threads++;
1088         }
1089
1090         pthread_attr_destroy(&attr);
1091
1092         if (i != td->o.verify_async) {
1093                 log_err("fio: only %d verify threads started, exiting\n", i);
1094                 td->verify_thread_exit = 1;
1095                 write_barrier();
1096                 pthread_cond_broadcast(&td->verify_cond);
1097                 return 1;
1098         }
1099
1100         return 0;
1101 }
1102
1103 void verify_async_exit(struct thread_data *td)
1104 {
1105         td->verify_thread_exit = 1;
1106         write_barrier();
1107         pthread_cond_broadcast(&td->verify_cond);
1108
1109         pthread_mutex_lock(&td->io_u_lock);
1110
1111         while (td->nr_verify_threads)
1112                 pthread_cond_wait(&td->free_cond, &td->io_u_lock);
1113
1114         pthread_mutex_unlock(&td->io_u_lock);
1115         free(td->verify_threads);
1116         td->verify_threads = NULL;
1117 }