projects
/
fio.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Better check for not doing a file twice
[fio.git]
/
io_u.c
diff --git
a/io_u.c
b/io_u.c
index 1077c27b1f07a43014ea527de0f985037a0a2083..5f51a00e2457e4880468c8dc2b21ce4da93a39b3 100644
(file)
--- a/
io_u.c
+++ b/
io_u.c
@@
-100,7
+100,7
@@
static int get_next_free_block(struct thread_data *td, struct fio_file *f,
static int get_next_rand_offset(struct thread_data *td, struct fio_file *f,
int ddir, unsigned long long *b)
{
static int get_next_rand_offset(struct thread_data *td, struct fio_file *f,
int ddir, unsigned long long *b)
{
- unsigned long long max_blocks = f->
file
_size / td->o.min_bs[ddir];
+ unsigned long long max_blocks = f->
io
_size / td->o.min_bs[ddir];
unsigned long long r, rb;
int loops = 5;
unsigned long long r, rb;
int loops = 5;
@@
-142,8
+142,12
@@
static int get_next_offset(struct thread_data *td, struct io_u *io_u)
if (get_next_rand_offset(td, f, ddir, &b))
return 1;
if (get_next_rand_offset(td, f, ddir, &b))
return 1;
- } else
+ } else {
+ if (f->last_pos >= f->real_file_size)
+ return 1;
+
b = f->last_pos / td->o.min_bs[ddir];
b = f->last_pos / td->o.min_bs[ddir];
+ }
io_u->offset = (b * td->o.min_bs[ddir]) + f->file_offset;
if (io_u->offset >= f->real_file_size)
io_u->offset = (b * td->o.min_bs[ddir]) + f->file_offset;
if (io_u->offset >= f->real_file_size)
@@
-250,7
+254,7
@@
static enum fio_ddir get_rw_ddir(struct thread_data *td)
*/
ddir = get_rand_ddir(td);
max_bytes = td->this_io_bytes[ddir];
*/
ddir = get_rand_ddir(td);
max_bytes = td->this_io_bytes[ddir];
- if (max_bytes >= (td->
io_
size * td->o.rwmix[ddir] / 100)) {
+ if (max_bytes >= (td->
o.
size * td->o.rwmix[ddir] / 100)) {
if (!td->rw_end_set[ddir]) {
td->rw_end_set[ddir] = 1;
memcpy(&td->rw_end[ddir], &now, sizeof(now));
if (!td->rw_end_set[ddir]) {
td->rw_end_set[ddir] = 1;
memcpy(&td->rw_end[ddir], &now, sizeof(now));
@@
-310,7
+314,7
@@
static int fill_io_u(struct thread_data *td, struct io_u *io_u)
!(td->io_issues[DDIR_WRITE] % td->o.fsync_blocks) &&
td->io_issues[DDIR_WRITE] && should_fsync(td)) {
io_u->ddir = DDIR_SYNC;
!(td->io_issues[DDIR_WRITE] % td->o.fsync_blocks) &&
td->io_issues[DDIR_WRITE] && should_fsync(td)) {
io_u->ddir = DDIR_SYNC;
-
return 0
;
+
goto out
;
}
io_u->ddir = get_rw_ddir(td);
}
io_u->ddir = get_rw_ddir(td);
@@
-335,6
+339,7
@@
static int fill_io_u(struct thread_data *td, struct io_u *io_u)
/*
* If using a write iolog, store this entry.
*/
/*
* If using a write iolog, store this entry.
*/
+out:
if (td->o.write_iolog_file)
write_iolog_put(td, io_u);
if (td->o.write_iolog_file)
write_iolog_put(td, io_u);
@@
-417,6
+422,8
@@
static struct fio_file *get_next_file_rand(struct thread_data *td, int goodf,
fno = (unsigned int) ((double) td->o.nr_files * (r / (RAND_MAX + 1.0)));
f = &td->files[fno];
fno = (unsigned int) ((double) td->o.nr_files * (r / (RAND_MAX + 1.0)));
f = &td->files[fno];
+ if (f->flags & FIO_FILE_DONE)
+ continue;
if ((!goodf || (f->flags & goodf)) && !(f->flags & badf))
return f;
if ((!goodf || (f->flags & goodf)) && !(f->flags & badf))
return f;
@@
-439,6
+446,9
@@
static struct fio_file *get_next_file_rr(struct thread_data *td, int goodf,
if (td->next_file >= td->o.nr_files)
td->next_file = 0;
if (td->next_file >= td->o.nr_files)
td->next_file = 0;
+ if (f->flags & FIO_FILE_DONE)
+ continue;
+
if ((!goodf || (f->flags & goodf)) && !(f->flags & badf))
break;
if ((!goodf || (f->flags & goodf)) && !(f->flags & badf))
break;
@@
-549,6
+559,7
@@
set_file:
*/
io_u->file = NULL;
td_io_close_file(td, f);
*/
io_u->file = NULL;
td_io_close_file(td, f);
+ f->flags |= FIO_FILE_DONE;
/*
* probably not the right place to do this, but see
/*
* probably not the right place to do this, but see