if (minbs == maxbs)
return minbs;
+ /*
+ * If we can't satisfy the min block size from here, then fail
+ */
+ if (!io_u_fits(td, io_u, minbs))
+ return 0;
+
if (td->o.use_os_rand)
rand_max = OS_RAND_MAX;
else
/*
* We are going to sleep, ensure that we flush anything pending as
- * not to skew our latency numbers
+ * not to skew our latency numbers.
+ *
+ * Changed to only monitor 'in flight' requests here instead of the
+ * td->cur_depth, b/c td->cur_depth does not accurately represent
+ * io's that have been actually submitted to an async engine,
+ * and cur_depth is meaningless for sync engines.
*/
- if (td->cur_depth) {
+ if (td->io_u_in_flight) {
int fio_unused ret;
- ret = io_u_queued_complete(td, td->cur_depth, NULL);
+ ret = io_u_queued_complete(td, td->io_u_in_flight, NULL);
}
fio_gettime(&t, NULL);
/*
* See if it's time to switch to a new zone
*/
- if (td->zone_bytes >= td->o.zone_size) {
+ if (td->zone_bytes >= td->o.zone_size && td->o.zone_skip) {
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;
p = io_u->xfer_buf;
boffset = io_u->offset;
+ io_u->buf_filled_len = 0;
for (i = 0; i < nr_blocks; i++) {
/*
}
}
- if (ramp_time_over(td) && td->runstate == TD_RUNNING) {
+ if (ramp_time_over(td) && (td->runstate == TD_RUNNING ||
+ td->runstate == TD_VERIFYING)) {
account_io_completion(td, io_u, icd, idx, bytes);
if (__should_check_rate(td, idx)) {