[PATCH] Add verify_meta verification type
authorShawn Lewis <shawnlewis@google.com>
Thu, 2 Aug 2007 19:05:58 +0000 (21:05 +0200)
committerJens Axboe <jens.axboe@oracle.com>
Thu, 2 Aug 2007 19:05:58 +0000 (21:05 +0200)
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
HOWTO
fio.h
options.c
verify.c

diff --git a/HOWTO b/HOWTO
index 21ba96033c283d0742f9191cc76ef97cf969277d..c38266c2afe100fcf02106476c3ae52eb05e4ae1 100644 (file)
--- 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 5f813009f26f414d81a263af6858b9ef02fd467a..235a13b1d8c8f96e996d1c16c9138d2d9afa84e5 100644 (file)
--- 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];
index 81ddd2390ca5459b85714c74d014716109e1005d..a50dece0baf4c5fd696df0a9f3fe0384ea9fe4b7 100644 (file)
--- 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,
index a0e26c9f97cdfc7f00902c86a740acca553501b1..d9a68d656e490ca2d9a3e0b6a76777895e08f045 100644 (file)
--- 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++;
        }
 }