Random IO fixes
[fio.git] / io_u.c
diff --git a/io_u.c b/io_u.c
index cab09800de5afea6e1e3d749f97ef33139faca6e..a963441a9d3e6baabf4e312146638d90cb46f708 100644 (file)
--- a/io_u.c
+++ b/io_u.c
@@ -118,7 +118,7 @@ static int get_next_rand_offset(struct thread_data *td, struct fio_file *f,
                /*
                 * calculate map offset and chec if it's free
                 */
                /*
                 * calculate map offset and chec if it's free
                 */
-               rb = *b + (f->file_offset / td->o.min_bs[ddir]);
+               rb = *b;
                if (random_map_free(td, f, rb))
                        return 0;
 
                if (random_map_free(td, f, rb))
                        return 0;
 
@@ -186,7 +186,21 @@ static unsigned int get_next_buflen(struct thread_data *td, struct io_u *io_u)
                buflen = td->o.min_bs[ddir];
        else {
                r = os_random_long(&td->bsrange_state);
                buflen = td->o.min_bs[ddir];
        else {
                r = os_random_long(&td->bsrange_state);
-               buflen = (unsigned int) (1 + (double) (td->o.max_bs[ddir] - 1) * r / (RAND_MAX + 1.0));
+               if (!td->o.bssplit_nr)
+                       buflen = (unsigned int) (1 + (double) (td->o.max_bs[ddir] - 1) * r / (RAND_MAX + 1.0));
+               else {
+                       long perc = 0;
+                       unsigned int i;
+
+                       for (i = 0; i < td->o.bssplit_nr; i++) {
+                               struct bssplit *bsp = &td->o.bssplit[i];
+
+                               buflen = bsp->bs;
+                               perc += bsp->perc;
+                               if (r <= ((LONG_MAX / 100L) * perc))
+                                       break;
+                       }
+               }
                if (!td->o.bs_unaligned)
                        buflen = (buflen + td->o.min_bs[ddir] - 1) & ~(td->o.min_bs[ddir] - 1);
        }
                if (!td->o.bs_unaligned)
                        buflen = (buflen + td->o.min_bs[ddir] - 1) & ~(td->o.min_bs[ddir] - 1);
        }
@@ -763,6 +777,7 @@ static void io_completed(struct thread_data *td, struct io_u *io_u,
                io_u_mark_latency(td, usec);
 
                if (td_write(td) && idx == DDIR_WRITE &&
                io_u_mark_latency(td, usec);
 
                if (td_write(td) && idx == DDIR_WRITE &&
+                   td->o.do_verify &&
                    td->o.verify != VERIFY_NONE)
                        log_io_piece(td, io_u);
 
                    td->o.verify != VERIFY_NONE)
                        log_io_piece(td, io_u);