#include <assert.h>
#include "fio.h"
-#include "os.h"
/*
* Change this define to play with the timeout handling
static unsigned int get_next_buflen(struct thread_data *td, struct io_u *io_u)
{
- struct fio_file *f = io_u->file;
const int ddir = io_u->ddir;
unsigned int buflen;
long r;
buflen = (buflen + td->o.min_bs[ddir] - 1) & ~(td->o.min_bs[ddir] - 1);
}
- while (buflen + io_u->offset > f->real_file_size) {
- if (buflen == td->o.min_bs[ddir]) {
- if (!td->o.odirect) {
- assert(io_u->offset <= f->real_file_size);
- buflen = f->real_file_size - io_u->offset;
- return buflen;
- }
- return 0;
- }
-
- buflen = td->o.min_bs[ddir];
- }
-
return buflen;
}
if (td->next_file >= td->o.nr_files)
td->next_file = 0;
- if (f->flags & FIO_FILE_DONE)
+ if (f->flags & FIO_FILE_DONE) {
+ f = NULL;
continue;
+ }
if ((!goodf || (f->flags & goodf)) && !(f->flags & badf))
break;
assert(td->o.nr_files <= td->files_index);
- if (!td->nr_open_files)
+ if (!td->nr_open_files || td->nr_done_files >= td->o.nr_files)
return NULL;
f = td->file_service_file;
{
struct fio_file *f;
+ if (!td->nr_open_files || td->nr_done_files >= td->o.nr_files)
+ return NULL;
+
if (td->o.file_service_type == FIO_FSERVICE_RR)
f = get_next_file_rr(td, 0, FIO_FILE_OPEN);
else
io_u->file = NULL;
td_io_close_file(td, f);
f->flags |= FIO_FILE_DONE;
+ td->nr_done_files++;
/*
* probably not the right place to do this, but see
f->last_pos += td->o.zone_skip;
}
- if (io_u->buflen + io_u->offset > f->real_file_size) {
- if (td->io_ops->flags & FIO_RAWIO) {
- put_io_u(td, io_u);
- return NULL;
- }
-
- io_u->buflen = f->real_file_size - io_u->offset;
- }
-
if (io_u->ddir != DDIR_SYNC) {
if (!io_u->buflen) {
put_io_u(td, io_u);