static int get_next_block(struct thread_data *td, struct io_u *io_u, enum fio_ddir ddir, int rw_seq, unsigned long long *b) { struct fio_file *f = io_u->file; int ret; assert(ddir_rw(ddir)); if (rw_seq) { if (td_random(td)) ret = get_next_rand_block(td, f, ddir, b); else ret = get_next_seq_block(td, f, ddir, b); } else { io_u->flags |= IO_U_F_BUSY_OK; if (td->o.rw_seq == RW_SEQ_SEQ) { ret = get_next_seq_block(td, f, ddir, b); if (ret) ret = get_next_rand_block(td, f, ddir, b); } else if (td->o.rw_seq == RW_SEQ_IDENT) { if (f->last_start != -1ULL) *b = (f->last_start - f->file_offset) / td->o.min_bs[ddir]; else *b = 0; ret = 0; } else { log_err("fio: unknown rw_seq=%d\n", td->o.rw_seq); ret = 1; } } return ret; }
static int get_next_block(struct thread_data *td, struct io_u *io_u, enum fio_ddir ddir, int rw_seq) { struct fio_file *f = io_u->file; unsigned long long b, offset; int ret; assert(ddir_rw(ddir)); b = offset = -1ULL; if (rw_seq) { if (td_random(td)) ret = get_next_rand_block(td, f, ddir, &b); else ret = get_next_seq_offset(td, f, ddir, &offset); } else { io_u->flags |= IO_U_F_BUSY_OK; if (td->o.rw_seq == RW_SEQ_SEQ) { ret = get_next_seq_offset(td, f, ddir, &offset); if (ret) ret = get_next_rand_block(td, f, ddir, &b); } else if (td->o.rw_seq == RW_SEQ_IDENT) { if (f->last_start != -1ULL) offset = f->last_start - f->file_offset; else offset = 0; ret = 0; } else { log_err("fio: unknown rw_seq=%d\n", td->o.rw_seq); ret = 1; } } if (!ret) { if (offset != -1ULL) io_u->offset = offset; else if (b != -1ULL) io_u->offset = b * td->o.ba[ddir]; else { log_err("fio: bug in offset generation\n"); ret = 1; } } return ret; }