author Jens Axboe Fri, 16 Sep 2016 15:11:04 +0000 (09:11 -0600) committer Jens Axboe Fri, 16 Sep 2016 15:11:04 +0000 (09:11 -0600)
If we use a random generator that has a 64-bit output, then we'll
overflow in the calculation for what block size to select when
bssplit= is used.

Signed-off-by: Jens Axboe <axboe@fb.com>
 io_u.c patch | blob | blame | history

diff --git a/io_u.c b/io_u.c
index b6d530f2a23a542d28673587ababf8a0e091f3e9..7b51dd2ee19c3cd2e29a9bbcd4ac96a01ec1eba7 100644 (file)
--- a/io_u.c
+++ b/io_u.c
@@ -531,8 +531,7 @@ static unsigned int __get_next_buflen(struct thread_data *td, struct io_u *io_u,
int ddir = io_u->ddir;
unsigned int buflen = 0;
unsigned int minbs, maxbs;
-       uint64_t frand_max;
-       unsigned long r;
+       uint64_t frand_max, r;

assert(ddir_rw(ddir));

@@ -561,7 +560,7 @@ static unsigned int __get_next_buflen(struct thread_data *td, struct io_u *io_u,
if (buflen < minbs)
buflen = minbs;
} else {
-                       long perc = 0;
+                       long long perc = 0;
unsigned int i;

for (i = 0; i < td->o.bssplit_nr[ddir]; i++) {
@@ -569,7 +568,9 @@ static unsigned int __get_next_buflen(struct thread_data *td, struct io_u *io_u,

buflen = bsp->bs;
perc += bsp->perc;
-                               if ((r * 100UL <= frand_max * perc) &&
+                               if (!perc)
+                                       break;
+                               if ((r / perc <= frand_max / 100ULL) &&
io_u_fits(td, io_u, buflen))
break;
}