Speedup verify random fills by 10-15x

Move the pseudo-random helper into lib/rand.c and use that
from the verify populate as well.

Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
diff --git a/io_u.c b/io_u.c
index f451d1a..69edd70 100644
--- a/io_u.c
+++ b/io_u.c
@@ -1240,20 +1240,8 @@
 void io_u_fill_buffer(struct thread_data *td, struct io_u *io_u,
 		      unsigned int max_bs)
 {
-	long *ptr = io_u->buf;
-
-	if (!td->o.zero_buffers) {
-		unsigned long r = __rand(&__fio_rand_state);
-
-		if (sizeof(int) != sizeof(*ptr))
-			r *= (unsigned long) __rand(&__fio_rand_state);
-
-		while ((void *) ptr - io_u->buf < max_bs) {
-			*ptr = r;
-			ptr++;
-			r *= GOLDEN_RATIO_PRIME;
-			r >>= 3;
-		}
-	} else
-		memset(ptr, 0, max_bs);
+	if (!td->o.zero_buffers)
+		fill_random_buf(io_u->buf, max_bs);
+	else
+		memset(io_u->buf, 0, max_bs);
 }
diff --git a/lib/rand.c b/lib/rand.c
index cecc4c2..839a6a9 100644
--- a/lib/rand.c
+++ b/lib/rand.c
@@ -34,6 +34,7 @@
 */
 
 #include "rand.h"
+#include "../hash.h"
 
 struct frand_state __fio_rand_state;
 
@@ -57,3 +58,19 @@
 	__rand(state);
 	__rand(state);
 }
+
+void fill_random_buf(void *buf, unsigned int len)
+{
+	unsigned long r = __rand(&__fio_rand_state);
+	long *ptr = buf;
+
+	if (sizeof(int) != sizeof(*ptr))
+		r *= (unsigned long) __rand(&__fio_rand_state);
+
+	while ((void *) ptr - buf < len) {
+		*ptr = r;
+		ptr++;
+		r *= GOLDEN_RATIO_PRIME;
+		r >>= 3;
+	}
+}
diff --git a/lib/rand.h b/lib/rand.h
index 363e7b6..573116c 100644
--- a/lib/rand.h
+++ b/lib/rand.h
@@ -19,5 +19,6 @@
 }
 
 extern void init_rand(struct frand_state *);
+extern void fill_random_buf(void *buf, unsigned int len);
 
 #endif
diff --git a/verify.c b/verify.c
index 6b54b70..265bd55 100644
--- a/verify.c
+++ b/verify.c
@@ -10,6 +10,7 @@
 #include "fio.h"
 #include "verify.h"
 #include "smalloc.h"
+#include "lib/rand.h"
 
 #include "crc/md5.h"
 #include "crc/crc64.h"
@@ -21,35 +22,12 @@
 #include "crc/sha512.h"
 #include "crc/sha1.h"
 
-static void fill_random_bytes(struct thread_data *td, void *p, unsigned int len)
-{
-	unsigned int todo;
-	int r;
-
-	while (len) {
-		r = os_random_long(&td->verify_state);
-
-		/*
-		 * lrand48_r seems to be broken and only fill the bottom
-		 * 32-bits, even on 64-bit archs with 64-bit longs
-		 */
-		todo = sizeof(r);
-		if (todo > len)
-			todo = len;
-
-		memcpy(p, &r, todo);
-
-		len -= todo;
-		p += todo;
-	}
-}
-
 static void fill_pattern(struct thread_data *td, void *p, unsigned int len)
 {
 	switch (td->o.verify_pattern_bytes) {
 	case 0:
 		dprint(FD_VERIFY, "fill random bytes len=%u\n", len);
-		fill_random_bytes(td, p, len);
+		fill_random_buf(p, len);
 		break;
 	case 1:
 		dprint(FD_VERIFY, "fill verify pattern b=0 len=%u\n", len);