From 7437ee87e4f6457168e8440f9308b4296ddb9263 Mon Sep 17 00:00:00 2001 From: Shawn Lewis Date: Thu, 2 Aug 2007 21:05:58 +0200 Subject: [PATCH] [PATCH] Add verify_meta verification type Signed-off-by: Jens Axboe --- HOWTO | 4 ++++ fio.h | 8 ++++++++ options.c | 4 ++++ verify.c | 42 +++++++++++++++++++++++++++++++++++++++++- 4 files changed, 57 insertions(+), 1 deletion(-) diff --git a/HOWTO b/HOWTO index 21ba9603..c38266c2 100644 --- a/HOWTO +++ b/HOWTO @@ -592,6 +592,10 @@ verify=str If writing to a file, fio can verify the file contents sha256 Use sha256 as the checksum function. + meta Write extra information about each io + (timestamp, block number etc.). The block + number is verified. + null Only pretend to verify. Useful for testing internals with ioengine=null, not for much else. diff --git a/fio.h b/fio.h index 5f813009..235a13b1 100644 --- a/fio.h +++ b/fio.h @@ -197,6 +197,7 @@ enum { VERIFY_CRC7, /* crc7 sum data blocks */ VERIFY_SHA256, /* sha256 sum data blocks */ VERIFY_SHA512, /* sha512 sum data blocks */ + VERIFY_META, /* block_num, timestamp etc. */ VERIFY_NULL, /* pretend to verify */ }; @@ -232,6 +233,13 @@ struct vhdr_crc16 { struct vhdr_crc7 { uint8_t crc7; }; +struct vhdr_meta { + uint64_t offset; + unsigned char thread; + unsigned short numberio; + unsigned long time_sec; + unsigned long time_usec; +}; struct group_run_stats { unsigned long long max_run[2], min_run[2]; diff --git a/options.c b/options.c index 81ddd239..a50dece0 100644 --- a/options.c +++ b/options.c @@ -638,6 +638,10 @@ static struct fio_option options[] = { .oval = VERIFY_SHA512, .help = "Use sha512 checksums for verification", }, + { .ival = "meta", + .oval = VERIFY_META, + .help = "Use io information", + }, { .ival = "null", .oval = VERIFY_NULL, diff --git a/verify.c b/verify.c index a0e26c9f..d9a68d65 100644 --- a/verify.c +++ b/verify.c @@ -133,6 +133,9 @@ static inline unsigned int __hdr_size(int verify_type) case VERIFY_SHA512: len = sizeof(struct vhdr_sha512); break; + case VERIFY_META: + len = sizeof(struct vhdr_meta); + break; default: log_err("fio: unknown verify header!\n"); assert(0); @@ -163,6 +166,21 @@ static inline void *io_u_verify_off(struct verify_header *hdr, return io_u->buf + header_num * hdr->len + hdr_size(hdr); } +static int verify_io_u_meta(struct verify_header *hdr, struct thread_data *td, + struct io_u *io_u, unsigned int header_num) +{ + struct vhdr_meta *vh = hdr_priv(hdr); + + if (vh->offset != io_u->offset + header_num * td->o.verify_interval) { + log_err("meta: verify failed at %llu/%u\n", + io_u->offset + header_num * hdr->len, + hdr->len); + return 1; + } + + return 0; +} + static int verify_io_u_sha512(struct verify_header *hdr, struct io_u *io_u, unsigned int header_num) { @@ -365,6 +383,9 @@ int verify_io_u(struct thread_data *td, struct io_u *io_u) case VERIFY_SHA512: ret = verify_io_u_sha512(hdr, io_u, hdr_num); break; + case VERIFY_META: + ret = verify_io_u_meta(hdr, td, io_u, hdr_num); + break; default: log_err("Bad verify type %u\n", hdr->verify_type); ret = 1; @@ -375,6 +396,21 @@ int verify_io_u(struct thread_data *td, struct io_u *io_u) return 0; } +static void fill_meta(struct verify_header *hdr, struct thread_data *td, + struct io_u *io_u, unsigned int header_num) +{ + struct vhdr_meta *vh = hdr_priv(hdr); + + vh->thread = td->thread_number; + + vh->time_sec = io_u->start_time.tv_sec; + vh->time_usec = io_u->start_time.tv_usec; + + vh->numberio = td->io_issues[DDIR_WRITE]; + + vh->offset = io_u->offset + header_num * td->o.verify_interval; +} + static void fill_sha512(struct verify_header *hdr, void *p, unsigned int len) { struct vhdr_sha512 *vh = hdr_priv(hdr); @@ -444,7 +480,7 @@ void populate_verify_io_u(struct thread_data *td, struct io_u *io_u) { struct verify_header *hdr; void *p = io_u->buf, *data; - unsigned int hdr_inc, data_len; + unsigned int hdr_inc, data_len, header_num = 0; if (td->o.verify == VERIFY_NULL) return; @@ -486,12 +522,16 @@ void populate_verify_io_u(struct thread_data *td, struct io_u *io_u) case VERIFY_SHA512: fill_sha512(hdr, data, data_len); break; + case VERIFY_META: + fill_meta(hdr, td, io_u, header_num); + break; default: log_err("fio: bad verify type: %d\n", td->o.verify); assert(0); } if (td->o.verify_offset) memswp(p, p + td->o.verify_offset, hdr_size(hdr)); + header_num++; } } -- 2.25.1