verify: use origina offset for verification
authorJens Axboe <axboe@kernel.dk>
Tue, 11 Aug 2020 02:55:27 +0000 (20:55 -0600)
committerJens Axboe <axboe@kernel.dk>
Tue, 11 Aug 2020 02:55:27 +0000 (20:55 -0600)
Requeued IO might have a different offset, since we increment it for
retry conditions. Store the original offset for verification purposes.

Just like we have io_u->xfer_buf/io_u->buf and
io_u->xfer_buflen/io_u->buflen, we really should be treating
io_u->offset the same. But that's a major change, so just add this
special original offset so we know that verify has it. Currently we
treat io_u->offset like we would have io_u->xfer_offset, so this just
makes io_u->verify_offset what io_u->offset should be.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_u.c
io_u.h
iolog.c
verify.c

diff --git a/io_u.c b/io_u.c
index 63a42f9f283fd4bd5777d835b4d8adab5cf2c0ab..d8d60e052327cb15771937ea7c5249c163be47c1 100644 (file)
--- a/io_u.c
+++ b/io_u.c
@@ -464,6 +464,7 @@ static int get_next_block(struct thread_data *td, struct io_u *io_u,
                        log_err("fio: bug in offset generation: offset=%llu, b=%llu\n", (unsigned long long) offset, (unsigned long long) b);
                        ret = 1;
                }
+               io_u->verify_offset = io_u->offset;
        }
 
        return ret;
diff --git a/io_u.h b/io_u.h
index 87c29201a3aee39a87a615768272e0e86b596d05..311009287403f8254e6d922c9658a72b1f80ae29 100644 (file)
--- a/io_u.h
+++ b/io_u.h
@@ -53,7 +53,8 @@ struct io_u {
         * Allocated/set buffer and length
         */
        unsigned long long buflen;
-       unsigned long long offset;
+       unsigned long long offset;      /* is really ->xfer_offset... */
+       unsigned long long verify_offset;       /* is really ->offset */
        void *buf;
 
        /*
diff --git a/iolog.c b/iolog.c
index 7f21be51942024e7a2daf199770082e77291b136..fa40c8572664a4e14d1e53d39eae3547dc43b672 100644 (file)
--- a/iolog.c
+++ b/iolog.c
@@ -174,6 +174,7 @@ int read_iolog_get(struct thread_data *td, struct io_u *io_u)
                io_u->ddir = ipo->ddir;
                if (ipo->ddir != DDIR_WAIT) {
                        io_u->offset = ipo->offset;
+                       io_u->verify_offset = ipo->offset;
                        io_u->buflen = ipo->len;
                        io_u->file = td->files[ipo->fileno];
                        get_file(io_u->file);
index 5ee0029d130e2f891d48cbd6c1ee01203085a6c3..a418c05413426905e4772cb62855dad83e273197 100644 (file)
--- a/verify.c
+++ b/verify.c
@@ -302,7 +302,7 @@ static void __dump_verify_buffers(struct verify_header *hdr, struct vcont *vc)
         */
        hdr_offset = vc->hdr_num * hdr->len;
 
-       dump_buf(io_u->buf + hdr_offset, hdr->len, io_u->offset + hdr_offset,
+       dump_buf(io_u->buf + hdr_offset, hdr->len, io_u->verify_offset + hdr_offset,
                        "received", vc->io_u->file);
 
        /*
@@ -317,7 +317,7 @@ static void __dump_verify_buffers(struct verify_header *hdr, struct vcont *vc)
 
        fill_pattern_headers(td, &dummy, hdr->rand_seed, 1);
 
-       dump_buf(buf + hdr_offset, hdr->len, io_u->offset + hdr_offset,
+       dump_buf(buf + hdr_offset, hdr->len, io_u->verify_offset + hdr_offset,
                        "expected", vc->io_u->file);
        free(buf);
 }
@@ -339,12 +339,12 @@ static void log_verify_failure(struct verify_header *hdr, struct vcont *vc)
 {
        unsigned long long offset;
 
-       offset = vc->io_u->offset;
+       offset = vc->io_u->verify_offset;
        offset += vc->hdr_num * hdr->len;
        log_err("%.8s: verify failed at file %s offset %llu, length %u"
-                       " (requested block: offset=%llu, length=%llu)\n",
+                       " (requested block: offset=%llu, length=%llu, flags=%x)\n",
                        vc->name, vc->io_u->file->file_name, offset, hdr->len,
-                       vc->io_u->offset, vc->io_u->buflen);
+                       vc->io_u->verify_offset, vc->io_u->buflen, vc->io_u->flags);
 
        if (vc->good_crc && vc->bad_crc) {
                log_err("       Expected CRC: ");
@@ -801,7 +801,7 @@ static int verify_trimmed_io_u(struct thread_data *td, struct io_u *io_u)
 
        log_err("trim: verify failed at file %s offset %llu, length %llu"
                ", block offset %lu\n",
-                       io_u->file->file_name, io_u->offset, io_u->buflen,
+                       io_u->file->file_name, io_u->verify_offset, io_u->buflen,
                        (unsigned long) offset);
        return EILSEQ;
 }
@@ -829,10 +829,10 @@ static int verify_header(struct io_u *io_u, struct thread_data *td,
                        hdr->rand_seed, io_u->rand_seed);
                goto err;
        }
-       if (hdr->offset != io_u->offset + hdr_num * td->o.verify_interval) {
+       if (hdr->offset != io_u->verify_offset + hdr_num * td->o.verify_interval) {
                log_err("verify: bad header offset %"PRIu64
                        ", wanted %llu",
-                       hdr->offset, io_u->offset);
+                       hdr->offset, io_u->verify_offset);
                goto err;
        }
 
@@ -864,11 +864,11 @@ err:
        log_err(" at file %s offset %llu, length %u"
                " (requested block: offset=%llu, length=%llu)\n",
                io_u->file->file_name,
-               io_u->offset + hdr_num * hdr_len, hdr_len,
-               io_u->offset, io_u->buflen);
+               io_u->verify_offset + hdr_num * hdr_len, hdr_len,
+               io_u->verify_offset, io_u->buflen);
 
        if (td->o.verify_dump)
-               dump_buf(p, hdr_len, io_u->offset + hdr_num * hdr_len,
+               dump_buf(p, hdr_len, io_u->verify_offset + hdr_num * hdr_len,
                                "hdr_fail", io_u->file);
 
        return EILSEQ;
@@ -1156,7 +1156,7 @@ static void __fill_hdr(struct thread_data *td, struct io_u *io_u,
        hdr->verify_type = td->o.verify;
        hdr->len = header_len;
        hdr->rand_seed = rand_seed;
-       hdr->offset = io_u->offset + header_num * td->o.verify_interval;
+       hdr->offset = io_u->verify_offset + header_num * td->o.verify_interval;
        hdr->time_sec = io_u->start_time.tv_sec;
        hdr->time_nsec = io_u->start_time.tv_nsec;
        hdr->thread = td->thread_number;
@@ -1334,6 +1334,7 @@ int get_next_verify(struct thread_data *td, struct io_u *io_u)
                td->io_hist_len--;
 
                io_u->offset = ipo->offset;
+               io_u->verify_offset = ipo->offset;
                io_u->buflen = ipo->len;
                io_u->numberio = ipo->numberio;
                io_u->file = ipo->file;
@@ -1866,7 +1867,7 @@ int verify_state_should_stop(struct thread_data *td, struct io_u *io_u)
        for (i = 0; i < s->no_comps; i++) {
                if (s->comps[i].fileno != f->fileno)
                        continue;
-               if (io_u->offset == s->comps[i].offset)
+               if (io_u->verify_offset == s->comps[i].offset)
                        return 0;
        }