X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=io_u.c;h=77069c55277f8aeb0cd93d99754b12913cdfbaee;hp=af2d05f360eaed2f4d6c169f6ee5eb5f62da18f8;hb=b1d1b239d2a3299a4d7b7b3de185923c655d0a48;hpb=de78976982fe7f57ccadd15a19dae167f0ce62ab diff --git a/io_u.c b/io_u.c index af2d05f3..77069c55 100644 --- a/io_u.c +++ b/io_u.c @@ -1122,15 +1122,40 @@ static int check_get_verify(struct thread_data *td, struct io_u *io_u) /* * Fill offset and start time into the buffer content, to prevent too - * easy compressible data for simple de-dupe attempts. + * easy compressible data for simple de-dupe attempts. Do this for every + * 512b block in the range, since that should be the smallest block size + * we can expect from a device. */ static void small_content_scramble(struct io_u *io_u) { - void *end; + unsigned int i, nr_blocks = io_u->buflen / 512; + unsigned long long boffset; + unsigned int offset; + void *p, *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)); + if (!nr_blocks) + return; + + p = io_u->xfer_buf; + boffset = io_u->offset; + + for (i = 0; i < nr_blocks; i++) { + /* + * Fill the byte offset into a "random" start offset of + * the buffer, given by the product of the usec time + * and the actual offset. + */ + offset = (io_u->start_time.tv_usec ^ boffset) & 511; + offset &= ~(sizeof(unsigned long long) - 1); + if (offset >= 512 - sizeof(unsigned long long)) + offset -= sizeof(unsigned long long); + memcpy(p + offset, &boffset, sizeof(boffset)); + + end = p + 512 - sizeof(io_u->start_time); + memcpy(end, &io_u->start_time, sizeof(io_u->start_time)); + p += 512; + boffset += 512; + } } /* @@ -1183,13 +1208,14 @@ struct io_u *get_io_u(struct thread_data *td) f->last_start = io_u->offset; f->last_pos = io_u->offset + io_u->buflen; - if (td->o.verify != VERIFY_NONE && io_u->ddir == DDIR_WRITE) - 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) { + if (io_u->ddir == DDIR_WRITE) { + if (td->o.verify != VERIFY_NONE) + populate_verify_io_u(td, io_u); + else if (td->o.refill_buffers) + io_u_fill_buffer(td, io_u, io_u->xfer_buflen); + else if (td->o.scramble_buffers) + do_scramble = 1; + } else if (io_u->ddir == DDIR_READ) { /* * Reset the buf_filled parameters so next time if the * buffer is used for writes it is refilled.