From: Jens Axboe Date: Sun, 28 Sep 2014 22:18:43 +0000 (-0600) Subject: Fix bug with rw sequence offset and io_limit X-Git-Tag: fio-2.1.13~17 X-Git-Url: https://git.kernel.dk/?a=commitdiff_plain;h=ac002339c382d56ffcbf2b15a55d07d9d8c2eac6;p=fio.git 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 --- 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;