From a64ea63f648e77d583b5287634f44bea7da79b4b Mon Sep 17 00:00:00 2001 From: Alex Pyrgiotis Date: Sun, 10 Mar 2013 10:58:05 +0100 Subject: [PATCH] lfsr: Fix spin related bug On the previous patch on cycle detection, we would incremet spin value when: num_vals % cycle_length == 0 which would evaluate always to true for the first iteration since we start with num_vals = 0. Only one corner-case is affected by this bug and this patch should fix it. Signed-off-by: Alex Pyrgiotis Signed-off-by: Jens Axboe --- lib/lfsr.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/lfsr.c b/lib/lfsr.c index a8354049..4c15c625 100644 --- a/lib/lfsr.c +++ b/lib/lfsr.c @@ -108,22 +108,28 @@ static inline void __lfsr_next(struct fio_lfsr *fl, unsigned int spin) } } +/* + * lfsr_next does the following: + * + * a. Return if the number of max values has been exceeded. + * b. Check if the next iteration(s) produce a cycle (due to spin) and add "1" + * where necessary. + * c. Calculate the next value and return. + */ int lfsr_next(struct fio_lfsr *fl, uint64_t *off, uint64_t last) { int repeat; unsigned int spin; + if (fl->num_vals++ > fl->max_val) + return 1; + repeat = fl->num_vals % fl->cycle_length; if (repeat == 0) spin = fl->spin + 1; else spin = fl->spin; - if (fl->num_vals > fl->max_val) - return 1; - - fl->num_vals++; - do { __lfsr_next(fl, spin); } while (fl->last_val > fl->max_val); -- 2.25.1