Better check for not doing a file twice
[fio.git] / io_u.c
diff --git a/io_u.c b/io_u.c
index 2e0f8e9c601a16f8320fef4780e0bd340a9a047e..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)
 {
-       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;
 
@@ -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;
-       } else
+       } else {
+               if (f->last_pos >= f->real_file_size)
+                       return 1;
+
                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)
@@ -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];
-                       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));
@@ -418,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];
+               if (f->flags & FIO_FILE_DONE)
+                       continue;
 
                if ((!goodf || (f->flags & goodf)) && !(f->flags & badf))
                        return f;
@@ -440,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 (f->flags & FIO_FILE_DONE)
+                       continue;
+
                if ((!goodf || (f->flags & goodf)) && !(f->flags & badf))
                        break;
 
@@ -550,6 +559,7 @@ set_file:
                 */
                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