Fix bad interaction with file open/close and queuing

Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
diff --git a/io_u.c b/io_u.c
index 7f52a24..55ac826 100644
--- a/io_u.c
+++ b/io_u.c
@@ -188,7 +188,14 @@
 			b = (f->last_pos - f->file_offset) / td->o.min_bs[ddir];
 	}
 
-	io_u->offset = (b * td->o.min_bs[ddir]) + f->file_offset;
+	io_u->offset = b * td->o.min_bs[ddir];
+	if (io_u->offset >= f->io_size) {
+		dprint(FD_IO, "get_next_offset: offset %llu >= io_size %llu\n",
+					io_u->offset, f->io_size);
+		return 1;
+	}
+
+	io_u->offset += f->file_offset;
 	if (io_u->offset >= f->real_file_size) {
 		dprint(FD_IO, "get_next_offset: offset %llu >= size %llu\n",
 					io_u->offset, f->real_file_size);
@@ -651,6 +658,16 @@
 			break;
 
 		/*
+		 * optimization to prevent close/open of the same file. This
+		 * way we preserve queueing etc.
+		 */
+		if (td->o.nr_files == 1 && td->o.time_based) {
+			put_file(td, f);
+			fio_file_reset(f);
+			goto set_file;
+		}
+
+		/*
 		 * td_io_close() does a put_file() as well, so no need to
 		 * do that here.
 		 */