Improve verify pattern failure logging

Show number of bad bits and block offset.

Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
diff --git a/verify.c b/verify.c
index 96a2f12..f5ed51a 100644
--- a/verify.c
+++ b/verify.c
@@ -338,6 +338,14 @@
 	return 0;
 }
 
+static unsigned int hweight8(unsigned int w)
+{
+	unsigned int res = w - ((w >> 1) & 0x55);
+
+	res = (res & 0x33) + ((res >> 2) & 0x33);
+	return (res + (res >> 4)) & 0x0F;
+}
+
 int verify_io_u_pattern(unsigned long pattern, unsigned long pattern_size,
                         char* buf, unsigned int len, unsigned int mod)
 {
@@ -350,8 +358,15 @@
 	}
 
 	for (i = 0; i < len; i++) {
-		if (buf[i] != split_pattern[mod])
+		if (buf[i] != split_pattern[mod]) {
+			unsigned int bits;
+
+			bits = hweight8(buf[i] ^ split_pattern[mod]);
+			log_err("fio: got pattern %x, wanted %x. Bad bits %d\n",
+				buf[i], split_pattern[mod], bits);
+			log_err("fio: bad pattern block offset %u\n", i);
 			return 1;
+		}
 		mod++;
 		if (mod == pattern_size)
 			mod = 0;
@@ -374,29 +389,28 @@
 	if (td->o.verify_interval)
 		hdr_inc = td->o.verify_interval;
 
-	for (p = io_u->buf; p < io_u->buf + io_u->buflen; p += hdr_inc) {
+	for (p = io_u->buf; p < io_u->buf + io_u->buflen; p += hdr_inc, hdr_num++) {
 		hdr_size = __hdr_size(td->o.verify);
 		if (td->o.verify_offset)
 			memswp(p, p + td->o.verify_offset, hdr_size);
 		hdr = p;
 
+		if (hdr->fio_magic != FIO_HDR_MAGIC) {
+			log_err("Bad verify header %x\n", hdr->fio_magic);
+			return EIO;
+		}
+
 		if (td->o.verify_pattern_bytes) {
 			ret = verify_io_u_pattern(td->o.verify_pattern,
 			                          td->o.verify_pattern_bytes,
 			                          p + hdr_size,
 			                          hdr_inc - hdr_size,
 			                          hdr_size % 4);
-			if (ret) {
-				log_err("pattern: verify failed at %llu/%u\n",
+			if (ret)
+				log_err("fio: verify failed at %llu/%u\n",
 					io_u->offset + hdr_num * hdr->len,
-				        hdr->len);
-				return ret;
-			}
-		}
-
-		if (hdr->fio_magic != FIO_HDR_MAGIC) {
-			log_err("Bad verify header %x\n", hdr->fio_magic);
-			return EIO;
+					hdr->len);
+			continue;
 		}
 
 		switch (hdr->verify_type) {
@@ -428,7 +442,6 @@
 			log_err("Bad verify type %u\n", hdr->verify_type);
 			ret = 1;
 		}
-		hdr_num++;
 	}
 
 	return 0;