Add checksum to verify_header

Currently we don't know if the verify_header itself is
valid when pulled off a disk. While it will fail verify
if it is, fio might then confuse the 'expected' and
'received' data since it re-generates the corrupted
crc with the seed stored. But if the seed is corrupt,
then we fail.

So checksum the verify header, so that we know for a fact
whether the header is valid or not.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
diff --git a/verify.c b/verify.c
index eb8eddc..8bf14ae 100644
--- a/verify.c
+++ b/verify.c
@@ -649,6 +649,19 @@
 	return ret;
 }
 
+static int verify_hdr_crc(struct verify_header *hdr)
+{
+	void *p = hdr;
+	uint32_t crc;
+
+	crc = crc32(p, sizeof(*hdr) - sizeof(hdr->crc32));
+	if (crc == hdr->crc32)
+		return 1;
+
+	log_err("fio: verify header crc %x, calculated %x\n", hdr->crc32, crc);
+	return 0;
+}
+
 int verify_io_u(struct thread_data *td, struct io_u *io_u)
 {
 	struct verify_header *hdr;
@@ -682,9 +695,18 @@
 			memswp(p, p + td->o.verify_offset, header_size);
 		hdr = p;
 
-		if (hdr->fio_magic != FIO_HDR_MAGIC) {
+		if (hdr->fio_magic == FIO_HDR_MAGIC2) {
+			if (!verify_hdr_crc(hdr)) {
+				log_err("fio: bad crc on verify header.\n");
+				return EILSEQ;
+			}
+		} else if (hdr->fio_magic == FIO_HDR_MAGIC) {
+			log_err("fio: v1 headers no longer supported.\n");
+			log_err("fio: re-run the write workload.\n");
+			return EILSEQ;
+		} else {
 			log_err("verify: bad magic header %x, wanted %x at file %s offset %llu, length %u\n",
-				hdr->fio_magic, FIO_HDR_MAGIC,
+				hdr->fio_magic, FIO_HDR_MAGIC2,
 				io_u->file->file_name,
 				io_u->offset + hdr_num * hdr->len, hdr->len);
 			return EILSEQ;
@@ -844,10 +866,14 @@
 
 	p = (void *) hdr;
 
-	hdr->fio_magic = FIO_HDR_MAGIC;
+	hdr->fio_magic = FIO_HDR_MAGIC2;
 	hdr->len = header_len;
 	hdr->verify_type = td->o.verify;
+	hdr->pad1 = 0;
 	hdr->rand_seed = io_u->rand_seed;
+	hdr->pad2 = 0;
+	hdr->crc32 = crc32(p, sizeof(*hdr) - sizeof(hdr->crc32));
+
 	data_len = header_len - hdr_size(hdr);
 
 	data = p + hdr_size(hdr);