X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=io_u.c;h=af2d05f360eaed2f4d6c169f6ee5eb5f62da18f8;hp=16c98b1f454869c43e4862b91c57b1278898de28;hb=de78976982fe7f57ccadd15a19dae167f0ce62ab;hpb=a66da7a2354aac16757c75a824ad7cbba678535c diff --git a/io_u.c b/io_u.c index 16c98b1f..af2d05f3 100644 --- a/io_u.c +++ b/io_u.c @@ -1120,6 +1120,19 @@ static int check_get_verify(struct thread_data *td, struct io_u *io_u) return 0; } +/* + * Fill offset and start time into the buffer content, to prevent too + * easy compressible data for simple de-dupe attempts. + */ +static void small_content_scramble(struct io_u *io_u) +{ + void *end; + + *((unsigned long long *) io_u->xfer_buf) = io_u->offset; + end = io_u->xfer_buf + io_u->xfer_buflen - sizeof(io_u->start_time); + memcpy(end, &io_u->start_time, sizeof(io_u->start_time)); +} + /* * Return an io_u to be processed. Gets a buflen and offset, sets direction, * etc. The returned io_u is fully ready to be prepped and submitted. @@ -1128,6 +1141,7 @@ struct io_u *get_io_u(struct thread_data *td) { struct fio_file *f; struct io_u *io_u; + int do_scramble = 0; io_u = __get_io_u(td); if (!io_u) { @@ -1173,6 +1187,8 @@ struct io_u *get_io_u(struct thread_data *td) populate_verify_io_u(td, io_u); else if (td->o.refill_buffers && io_u->ddir == DDIR_WRITE) io_u_fill_buffer(td, io_u, io_u->xfer_buflen); + else if (io_u->ddir == DDIR_WRITE) + do_scramble = 1; else if (io_u->ddir == DDIR_READ) { /* * Reset the buf_filled parameters so next time if the @@ -1193,6 +1209,8 @@ out: if (!td_io_prep(td, io_u)) { if (!td->o.disable_slat) fio_gettime(&io_u->start_time, NULL); + if (do_scramble) + small_content_scramble(io_u); return io_u; } err_put: @@ -1450,7 +1468,7 @@ void io_u_fill_buffer(struct thread_data *td, struct io_u *io_u, io_u->buf_filled_len = 0; if (!td->o.zero_buffers) - fill_random_buf(io_u->buf, max_bs); + fill_random_buf(&td->buf_state, io_u->buf, max_bs); else memset(io_u->buf, 0, max_bs); }