From ac002339c382d56ffcbf2b15a55d07d9d8c2eac6 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Sun, 28 Sep 2014 16:18:43 -0600 Subject: [PATCH] Fix bug with rw sequence offset and io_limit If you do: dd if=/dev/zero of=/dev/shm/1M bs=1M count=1 fio --bs=4k --rw=write:4k --filename=/dev/shm/1M --name=go --io_limit=2M then fio will exit prematurely after having done 128 4KB ios, so only 512KB are read. This is because after 128 ios, we have reache the end of the file. Handle this case and wrap around properly. Signed-off-by: Jens Axboe --- io_u.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/io_u.c b/io_u.c index 8546899c..583f1e39 100644 --- a/io_u.c +++ b/io_u.c @@ -271,20 +271,32 @@ static int get_next_rand_block(struct thread_data *td, struct fio_file *f, static int get_next_seq_offset(struct thread_data *td, struct fio_file *f, enum fio_ddir ddir, uint64_t *offset) { + struct thread_options *o = &td->o; + assert(ddir_rw(ddir)); - if (f->last_pos >= f->io_size + get_start_offset(td, f) && td->o.time_based) + if (f->last_pos >= f->io_size + get_start_offset(td, f) && + o->time_based) f->last_pos = f->last_pos - f->io_size; if (f->last_pos < f->real_file_size) { uint64_t pos; - if (f->last_pos == f->file_offset && td->o.ddir_seq_add < 0) + if (f->last_pos == f->file_offset && o->ddir_seq_add < 0) f->last_pos = f->real_file_size; pos = f->last_pos - f->file_offset; - if (pos) - pos += td->o.ddir_seq_add; + if (pos && o->ddir_seq_add) { + pos += o->ddir_seq_add; + + /* + * If we reach beyond the end of the file + * with holed IO, wrap around to the + * beginning again. + */ + if (pos >= f->real_file_size) + pos = f->file_offset; + } *offset = pos; return 0; -- 2.25.1