/*
* See if we should reuse the last seed, if dedupe is enabled
*/
-static struct frand_state *get_buf_state(struct thread_data *td)
+static struct frand_state *get_buf_state(struct thread_data *td,
+ struct frand_state *save)
{
unsigned int v;
unsigned long r;
if (!td->o.dedupe_percentage)
return &td->buf_state;
- else if (td->o.dedupe_percentage == 100)
+ else if (td->o.dedupe_percentage == 100) {
+ frand_copy(save, &td->buf_state_prev);
return &td->buf_state_prev;
+ }
r = __rand(&td->dedupe_state);
v = 1 + (int) (100.0 * (r / (FRAND_MAX + 1.0)));
return &td->buf_state;
}
-static void save_buf_state(struct thread_data *td, struct frand_state *rs)
+static void save_buf_state(struct thread_data *td, struct frand_state *rs,
+ struct frand_state *save)
{
if (rs == &td->buf_state)
frand_copy(&td->buf_state_prev, rs);
+ else if (rs == &td->buf_state_prev && td->o.dedupe_percentage == 100)
+ frand_copy(rs, save);
}
void fill_io_buffer(struct thread_data *td, void *buf, unsigned int min_write,
unsigned int max_bs)
{
struct thread_options *o = &td->o;
+ struct frand_state save = { 0, };
if (o->compress_percentage || o->dedupe_percentage) {
unsigned int perc = td->o.compress_percentage;
unsigned int left = max_bs;
do {
- rs = get_buf_state(td);
+ rs = get_buf_state(td, &save);
min_write = min(min_write, left);
buf += min_write;
left -= min_write;
- save_buf_state(td, rs);
+ save_buf_state(td, rs, &save);
} while (left);
} else if (o->buffer_pattern_bytes)
fill_buffer_pattern(td, buf, max_bs);
else if (o->zero_buffers)
memset(buf, 0, max_bs);
else
- fill_random_buf(get_buf_state(td), buf, max_bs);
+ fill_random_buf(get_buf_state(td, NULL), buf, max_bs);
}
/*