From 4c8be5b1569f0aca8c7769803e57b79280d1f668 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Sun, 28 Sep 2014 16:20:58 -0600 Subject: [PATCH] Fix bug with zone and zone skipping and io_limit If you do: dd if=/dev/zero of=/dev/shm/1M bs=1M count=1 fio --bs=4k --rw=write --filename=/dev/shm/1M --name=go \ --zoneskip=4k --zonesize=4k --io_limit=2M then fio will exit after having performed 512KB of IO, instead of the specified IO limit. This is a similar issue as was fixed by commit ac002339c382 with rw sequencing - if we reach the end of the file with a zone skip, wrap to the beginning. Signed-off-by: Jens Axboe --- io_u.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/io_u.c b/io_u.c index 583f1e39..9adc31bf 100644 --- a/io_u.c +++ b/io_u.c @@ -760,9 +760,17 @@ static int fill_io_u(struct thread_data *td, struct io_u *io_u) * See if it's time to switch to a new zone */ if (td->zone_bytes >= td->o.zone_size && td->o.zone_skip) { + struct fio_file *f = io_u->file; + td->zone_bytes = 0; - io_u->file->file_offset += td->o.zone_range + td->o.zone_skip; - io_u->file->last_pos = io_u->file->file_offset; + f->file_offset += td->o.zone_range + td->o.zone_skip; + + /* + * Wrap from the beginning, if we exceed the file size + */ + if (f->file_offset >= f->real_file_size) + f->file_offset = f->real_file_size - f->file_offset; + f->last_pos = f->file_offset; td->io_skip_bytes += td->o.zone_skip; } -- 2.25.1