示例#1
0
文件: io_u.c 项目: jeefke/fio
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;
}
示例#2
0
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;
}