Fix issue with random offset being off if io_size != real_file_size
[fio.git] / io_u.c
diff --git a/io_u.c b/io_u.c
index 27014c8aad503b4cb8ed7eba374a954b6b7c6a2d..c0beafd46ad86e8640f815792b34af0078ef4856 100644 (file)
--- a/io_u.c
+++ b/io_u.c
@@ -95,7 +95,7 @@ static unsigned long long last_block(struct thread_data *td, struct fio_file *f,
        if (max_size > f->real_file_size)
                max_size = f->real_file_size;
 
-       max_blocks = max_size / (unsigned long long) td->o.min_bs[ddir];
+       max_blocks = max_size / (unsigned long long) td->o.ba[ddir];
        if (!max_blocks)
                return 0;
 
@@ -113,7 +113,8 @@ static int get_next_free_block(struct thread_data *td, struct fio_file *f,
 
        i = f->last_free_lookup;
        *b = (i * BLOCKS_PER_MAP);
-       while ((*b) * min_bs < f->real_file_size) {
+       while ((*b) * min_bs < f->real_file_size &&
+               (*b) * min_bs < f->io_size) {
                if (f->file_map[i] != (unsigned int) -1) {
                        *b += ffz(f->file_map[i]);
                        if (*b > last_block(td, f, ddir))
@@ -212,7 +213,7 @@ static int get_next_offset(struct thread_data *td, struct io_u *io_u)
                        b = (f->last_pos - f->file_offset) / td->o.min_bs[ddir];
        }
 
-       io_u->offset = b * td->o.min_bs[ddir];
+       io_u->offset = b * td->o.ba[ddir];
        if (io_u->offset >= f->io_size) {
                dprint(FD_IO, "get_next_offset: offset %llu >= io_size %llu\n",
                                        io_u->offset, f->io_size);
@@ -248,7 +249,7 @@ static unsigned int get_next_buflen(struct thread_data *td, struct io_u *io_u)
                buflen = minbs;
        else {
                r = os_random_long(&td->bsrange_state);
-               if (!td->o.bssplit_nr) {
+               if (!td->o.bssplit_nr[ddir]) {
                        buflen = 1 + (unsigned int) ((double) maxbs *
                                        (r / (OS_RAND_MAX + 1.0)));
                        if (buflen < minbs)
@@ -257,8 +258,8 @@ static unsigned int get_next_buflen(struct thread_data *td, struct io_u *io_u)
                        long perc = 0;
                        unsigned int i;
 
-                       for (i = 0; i < td->o.bssplit_nr; i++) {
-                               struct bssplit *bsp = &td->o.bssplit[i];
+                       for (i = 0; i < td->o.bssplit_nr[ddir]; i++) {
+                               struct bssplit *bsp = &td->o.bssplit[ddir][i];
 
                                buflen = bsp->bs;
                                perc += bsp->perc;
@@ -748,23 +749,12 @@ static int set_io_u_file(struct thread_data *td, struct io_u *io_u)
                if (!f)
                        return 1;
 
-set_file:
                io_u->file = f;
                get_file(f);
 
                if (!fill_io_u(td, io_u))
                        break;
 
-               /*
-                * optimization to prevent close/open of the same file. This
-                * way we preserve queueing etc.
-                */
-               if (td->o.nr_files == 1 && td->o.time_based) {
-                       put_file_log(td, f);
-                       fio_file_reset(f);
-                       goto set_file;
-               }
-
                put_file_log(td, f);
                td_io_close_file(td, f);
                io_u->file = NULL;