lfsr: ensure we don't generate an offset + buflen that exceeds the max size
[fio.git] / lib / lfsr.c
index 01c97cb80b1df7a7c8bfa6f9d84f7e366f286390..975c6a5aaf6b813e5a1d4e6bd7ec63e65e67a5ae 100644 (file)
@@ -216,14 +216,15 @@ static uint64_t __lfsr_next(uint64_t v, struct lfsr_taps *lt)
        return xor_mask | (v >> 1);
 }
 
-int lfsr_next(struct fio_lfsr *fl, uint64_t *off)
+int lfsr_next(struct fio_lfsr *fl, uint64_t *off, uint64_t last)
 {
        if (fl->num_vals > fl->max_val)
                return 1;
 
        do {
                fl->last_val = __lfsr_next(fl->last_val, &fl->taps);
-               if (fl->last_val - 1 <= fl->max_val)
+               if (fl->last_val - 1 <= fl->max_val &&
+                   fl->last_val <= last)
                        break;
        } while (1);
 
@@ -243,7 +244,7 @@ static struct lfsr_taps *find_lfsr(uint64_t size)
        return NULL;
 }
 
-int lfsr_init(struct fio_lfsr *fl, uint64_t size)
+int lfsr_init(struct fio_lfsr *fl, uint64_t size, unsigned long seed)
 {
        struct lfsr_taps *tap;
        int i;
@@ -252,7 +253,7 @@ int lfsr_init(struct fio_lfsr *fl, uint64_t size)
        if (!tap)
                return 1;
 
-       fl->last_val = 1;
+       fl->last_val = seed;
        fl->max_val = size - 1;
        fl->num_vals = 0;
        fl->taps.length = tap->length;