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);