Add Linus' optimized sha1 hash for checksum

It does appear to be pretty fast.

Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
diff --git a/verify.c b/verify.c
index 10bad7e..193e171 100644
--- a/verify.c
+++ b/verify.c
@@ -19,6 +19,7 @@
 #include "crc/crc7.h"
 #include "crc/sha256.h"
 #include "crc/sha512.h"
+#include "crc/sha1.h"
 
 static void fill_random_bytes(struct thread_data *td, void *p, unsigned int len)
 {
@@ -149,6 +150,9 @@
 	case VERIFY_META:
 		len = sizeof(struct vhdr_meta);
 		break;
+	case VERIFY_SHA1:
+		len = sizeof(struct vhdr_sha1);
+		break;
 	default:
 		log_err("fio: unknown verify header!\n");
 		assert(0);
@@ -246,6 +250,32 @@
 	return 0;
 }
 
+static int verify_io_u_sha1(struct verify_header *hdr, struct io_u *io_u,
+			    unsigned int header_num)
+{
+	void *p = io_u_verify_off(hdr, io_u, header_num);
+	struct vhdr_sha1 *vh = hdr_priv(hdr);
+	uint32_t sha1[5];
+	struct sha1_ctx sha1_ctx = {
+		.H = sha1,
+	};
+
+	dprint(FD_VERIFY, "sha1 verify io_u %p, len %u\n", io_u, hdr->len);
+
+	sha1_init(&sha1_ctx);
+	sha1_update(&sha1_ctx, p, hdr->len - hdr_size(hdr));
+
+	if (memcmp(vh->sha1, sha1_ctx.H, sizeof(sha1))) {
+		log_err("sha1: verify failed at %llu/%u\n",
+				io_u->offset + header_num * hdr->len, hdr->len);
+		hexdump(vh->sha1, sizeof(vh->sha1));
+		hexdump(sha1_ctx.H, sizeof(sha1));
+		return EILSEQ;
+	}
+
+	return 0;
+}
+
 static int verify_io_u_crc7(struct verify_header *hdr, struct io_u *io_u,
 			    unsigned char header_num)
 {
@@ -520,6 +550,9 @@
 		case VERIFY_META:
 			ret = verify_io_u_meta(hdr, td, io_u, hdr_num);
 			break;
+		case VERIFY_SHA1:
+			ret = verify_io_u_sha1(hdr, io_u, hdr_num);
+			break;
 		default:
 			log_err("Bad verify type %u\n", hdr->verify_type);
 			ret = EINVAL;
@@ -566,6 +599,17 @@
 	sha256_update(&sha256_ctx, p, len);
 }
 
+static void fill_sha1(struct verify_header *hdr, void *p, unsigned int len)
+{
+	struct vhdr_sha1 *vh = hdr_priv(hdr);
+	struct sha1_ctx sha1_ctx = {
+		.H = vh->sha1,
+	};
+
+	sha1_init(&sha1_ctx);
+	sha1_update(&sha1_ctx, p, len);
+}
+
 static void fill_crc7(struct verify_header *hdr, void *p, unsigned int len)
 {
 	struct vhdr_crc7 *vh = hdr_priv(hdr);
@@ -690,6 +734,11 @@
 							io_u, hdr->len);
 			fill_meta(hdr, td, io_u, header_num);
 			break;
+		case VERIFY_SHA1:
+			dprint(FD_VERIFY, "fill sha1 io_u %p, len %u\n",
+							io_u, hdr->len);
+			fill_sha1(hdr, data, data_len);
+			break;
 		default:
 			log_err("fio: bad verify type: %d\n", td->o.verify);
 			assert(0);