summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Axboe <axboe@kernel.dk>2020-08-10 20:55:27 -0600
committerJens Axboe <axboe@kernel.dk>2020-08-10 20:55:27 -0600
commit4fff54ccba73aa59de250a0f4161b9ce3d952601 (patch)
treedd0580337648fa8858094c935de5d33893fc0239
parent7d33649cc0b6a887cb2e89e5ef2632e21529f4ec (diff)
downloadfio-4fff54ccba73aa59de250a0f4161b9ce3d952601.tar.gz
fio-4fff54ccba73aa59de250a0f4161b9ce3d952601.tar.bz2
verify: use origina offset for verification
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>
-rw-r--r--io_u.c1
-rw-r--r--io_u.h3
-rw-r--r--iolog.c1
-rw-r--r--verify.c27
4 files changed, 18 insertions, 14 deletions
diff --git a/io_u.c b/io_u.c
index 63a42f9f..d8d60e05 100644
--- 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 87c29201..31100928 100644
--- 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 7f21be51..fa40c857 100644
--- 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);
diff --git a/verify.c b/verify.c
index 5ee0029d..a418c054 100644
--- 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;
}