rand: fix truncated rand_seed on Windows
authorMing-Hung Tsai <mingnus@gmail.com>
Wed, 17 Apr 2019 04:25:10 +0000 (12:25 +0800)
committerMing-Hung Tsai <mingnus@gmail.com>
Wed, 17 Apr 2019 07:34:19 +0000 (15:34 +0800)
The long data type is 32-bit on LLP64 platforms

filesetup.c
fio.h
init.c
lib/lfsr.c
lib/lfsr.h
lib/rand.c
lib/rand.h
os/os-windows.h
os/os.h
verify.c
verify.h

index aa1a394..47c889a 100644 (file)
@@ -1287,7 +1287,7 @@ bool init_random_map(struct thread_data *td)
                        return false;
 
                if (td->o.random_generator == FIO_RAND_GEN_LFSR) {
-                       unsigned long seed;
+                       uint64_t seed;
 
                        seed = td->rand_seeds[FIO_RAND_BLOCK_OFF];
 
diff --git a/fio.h b/fio.h
index b3ba5db..2103151 100644 (file)
--- a/fio.h
+++ b/fio.h
@@ -245,7 +245,7 @@ struct thread_data {
        void *iolog_buf;
        FILE *iolog_f;
 
-       unsigned long rand_seeds[FIO_RAND_NR_OFFS];
+       uint64_t rand_seeds[FIO_RAND_NR_OFFS];
 
        struct frand_state bsrange_state[DDIR_RWDIR_CNT];
        struct frand_state verify_state;
diff --git a/init.c b/init.c
index e637871..7383427 100644 (file)
--- a/init.c
+++ b/init.c
@@ -1217,7 +1217,7 @@ static void init_flags(struct thread_data *td)
 
 static int setup_random_seeds(struct thread_data *td)
 {
-       unsigned long seed;
+       uint64_t seed;
        unsigned int i;
 
        if (!td->o.rand_repeatable && !fio_option_is_set(&td->o, rand_seed)) {
index 32fbec5..1ef6ebb 100644 (file)
@@ -232,7 +232,7 @@ static int prepare_spin(struct fio_lfsr *fl, unsigned int spin)
        return 0;
 }
 
-int lfsr_reset(struct fio_lfsr *fl, unsigned long seed)
+int lfsr_reset(struct fio_lfsr *fl, uint64_t seed)
 {
        uint64_t bitmask = (fl->cached_bit << 1) - 1;
 
@@ -246,8 +246,8 @@ int lfsr_reset(struct fio_lfsr *fl, unsigned long seed)
        return 0;
 }
 
-int lfsr_init(struct fio_lfsr *fl, uint64_t nums, unsigned long seed,
-               unsigned int spin)
+int lfsr_init(struct fio_lfsr *fl, uint64_t nums, uint64_t seed,
+             unsigned int spin)
 {
        uint8_t *taps;
 
index c2d5569..95bc07f 100644 (file)
@@ -24,7 +24,7 @@ struct fio_lfsr {
 
 int lfsr_next(struct fio_lfsr *fl, uint64_t *off);
 int lfsr_init(struct fio_lfsr *fl, uint64_t size,
-               unsigned long seed, unsigned int spin);
-int lfsr_reset(struct fio_lfsr *fl, unsigned long seed);
+             uint64_t seed, unsigned int spin);
+int lfsr_reset(struct fio_lfsr *fl, uint64_t seed);
 
 #endif
index f18bd8d..69acb06 100644 (file)
@@ -95,7 +95,7 @@ void init_rand_seed(struct frand_state *state, unsigned int seed, bool use64)
                __init_rand64(&state->state64, seed);
 }
 
-void __fill_random_buf(void *buf, unsigned int len, unsigned long seed)
+void __fill_random_buf(void *buf, unsigned int len, uint64_t seed)
 {
        void *ptr = buf;
 
@@ -122,10 +122,10 @@ void __fill_random_buf(void *buf, unsigned int len, unsigned long seed)
        }
 }
 
-unsigned long fill_random_buf(struct frand_state *fs, void *buf,
-                             unsigned int len)
+uint64_t fill_random_buf(struct frand_state *fs, void *buf,
+                        unsigned int len)
 {
-       unsigned long r = __rand(fs);
+       uint64_t r = __rand(fs);
 
        if (sizeof(int) != sizeof(long *))
                r *= (unsigned long) __rand(fs);
@@ -134,7 +134,7 @@ unsigned long fill_random_buf(struct frand_state *fs, void *buf,
        return r;
 }
 
-void __fill_random_buf_percentage(unsigned long seed, void *buf,
+void __fill_random_buf_percentage(uint64_t seed, void *buf,
                                  unsigned int percentage,
                                  unsigned int segment, unsigned int len,
                                  char *pattern, unsigned int pbytes)
@@ -183,12 +183,12 @@ void __fill_random_buf_percentage(unsigned long seed, void *buf,
        }
 }
 
-unsigned long fill_random_buf_percentage(struct frand_state *fs, void *buf,
-                                        unsigned int percentage,
-                                        unsigned int segment, unsigned int len,
-                                        char *pattern, unsigned int pbytes)
+uint64_t fill_random_buf_percentage(struct frand_state *fs, void *buf,
+                                   unsigned int percentage,
+                                   unsigned int segment, unsigned int len,
+                                   char *pattern, unsigned int pbytes)
 {
-       unsigned long r = __rand(fs);
+       uint64_t r = __rand(fs);
 
        if (sizeof(int) != sizeof(long *))
                r *= (unsigned long) __rand(fs);
index 1676cf9..95d4f6d 100644 (file)
@@ -150,9 +150,9 @@ static inline uint64_t rand_between(struct frand_state *state, uint64_t start,
 
 extern void init_rand(struct frand_state *, bool);
 extern void init_rand_seed(struct frand_state *, unsigned int seed, bool);
-extern void __fill_random_buf(void *buf, unsigned int len, unsigned long seed);
-extern unsigned long fill_random_buf(struct frand_state *, void *buf, unsigned int len);
-extern void __fill_random_buf_percentage(unsigned long, void *, unsigned int, unsigned int, unsigned int, char *, unsigned int);
-extern unsigned long fill_random_buf_percentage(struct frand_state *, void *, unsigned int, unsigned int, unsigned int, char *, unsigned int);
+extern void __fill_random_buf(void *buf, unsigned int len, uint64_t seed);
+extern uint64_t fill_random_buf(struct frand_state *, void *buf, unsigned int len);
+extern void __fill_random_buf_percentage(uint64_t, void *, unsigned int, unsigned int, unsigned int, char *, unsigned int);
+extern uint64_t fill_random_buf_percentage(struct frand_state *, void *, unsigned int, unsigned int, unsigned int, char *, unsigned int);
 
 #endif
index ef955dc..dc958f5 100644 (file)
@@ -167,7 +167,7 @@ static inline int gettid(void)
        return GetCurrentThreadId();
 }
 
-static inline int init_random_seeds(unsigned long *rand_seeds, int size)
+static inline int init_random_seeds(uint64_t *rand_seeds, int size)
 {
        HCRYPTPROV hCryptProv;
 
diff --git a/os/os.h b/os/os.h
index 36b6bb2..756ece4 100644 (file)
--- a/os/os.h
+++ b/os/os.h
@@ -323,7 +323,7 @@ static inline int blockdev_size(struct fio_file *f, unsigned long long *bytes)
 #endif
 
 #ifdef FIO_USE_GENERIC_INIT_RANDOM_STATE
-static inline int init_random_seeds(unsigned long *rand_seeds, int size)
+static inline int init_random_seeds(uint64_t *rand_seeds, int size)
 {
        int fd;
 
index da429e7..f79ab43 100644 (file)
--- a/verify.c
+++ b/verify.c
@@ -39,14 +39,14 @@ void fill_buffer_pattern(struct thread_data *td, void *p, unsigned int len)
        (void)cpy_pattern(td->o.buffer_pattern, td->o.buffer_pattern_bytes, p, len);
 }
 
-static void __fill_buffer(struct thread_options *o, unsigned long seed, void *p,
+static void __fill_buffer(struct thread_options *o, uint64_t seed, void *p,
                          unsigned int len)
 {
        __fill_random_buf_percentage(seed, p, o->compress_percentage, len, len, o->buffer_pattern, o->buffer_pattern_bytes);
 }
 
-static unsigned long fill_buffer(struct thread_data *td, void *p,
-                                unsigned int len)
+static uint64_t fill_buffer(struct thread_data *td, void *p,
+                           unsigned int len)
 {
        struct frand_state *fs = &td->verify_state;
        struct thread_options *o = &td->o;
@@ -55,7 +55,7 @@ static unsigned long fill_buffer(struct thread_data *td, void *p,
 }
 
 void fill_verify_pattern(struct thread_data *td, void *p, unsigned int len,
-                        struct io_u *io_u, unsigned long seed, int use_seed)
+                        struct io_u *io_u, uint64_t seed, int use_seed)
 {
        struct thread_options *o = &td->o;
 
@@ -100,7 +100,7 @@ static unsigned int get_hdr_inc(struct thread_data *td, struct io_u *io_u)
 }
 
 static void fill_pattern_headers(struct thread_data *td, struct io_u *io_u,
-                                unsigned long seed, int use_seed)
+                                uint64_t seed, int use_seed)
 {
        unsigned int hdr_inc, header_num;
        struct verify_header *hdr;
index 64121a5..539e6f6 100644 (file)
--- a/verify.h
+++ b/verify.h
@@ -97,7 +97,7 @@ extern void populate_verify_io_u(struct thread_data *, struct io_u *);
 extern int __must_check get_next_verify(struct thread_data *td, struct io_u *);
 extern int __must_check verify_io_u(struct thread_data *, struct io_u **);
 extern int verify_io_u_async(struct thread_data *, struct io_u **);
-extern void fill_verify_pattern(struct thread_data *td, void *p, unsigned int len, struct io_u *io_u, unsigned long seed, int use_seed);
+extern void fill_verify_pattern(struct thread_data *td, void *p, unsigned int len, struct io_u *io_u, uint64_t seed, int use_seed);
 extern void fill_buffer_pattern(struct thread_data *td, void *p, unsigned int len);
 extern void fio_verify_init(struct thread_data *td);