unsigned long fill_random_buf(void *buf, unsigned int len) { unsigned long r = __rand(&__fio_rand_state); if (sizeof(int) != sizeof(long *)) r *= (unsigned long) __rand(&__fio_rand_state); __fill_random_buf(buf, len, r); return r; }
unsigned long fill_random_buf(struct frand_state *fs, void *buf, unsigned int len) { unsigned long r = __rand(fs); if (sizeof(int) != sizeof(long *)) r *= (unsigned long) __rand(fs); __fill_random_buf(buf, len, r); return r; }
void __fill_random_buf_percentage(unsigned long seed, void *buf, unsigned int percentage, unsigned int segment, unsigned int len, char *pattern, unsigned int pbytes) { unsigned int this_len; if (percentage == 100) { if (pbytes) (void)cpy_pattern(pattern, pbytes, buf, len); else memset(buf, 0, len); return; } if (segment > len) segment = len; while (len) { /* * Fill random chunk */ this_len = (segment * (100 - percentage)) / 100; if (this_len > len) this_len = len; __fill_random_buf(buf, this_len, seed); len -= this_len; if (!len) break; buf += this_len; if (this_len > len) this_len = len; else if (len - this_len <= sizeof(long)) this_len = len; if (pbytes) (void)cpy_pattern(pattern, pbytes, buf, this_len); else memset(buf, 0, this_len); len -= this_len; buf += this_len; } }
void fill_pattern(struct thread_data *td, void *p, unsigned int len, struct io_u *io_u, unsigned long seed, int use_seed) { switch (td->o.verify_pattern_bytes) { case 0: dprint(FD_VERIFY, "fill random bytes len=%u\n", len); if (use_seed) __fill_random_buf(p, len, seed); else io_u->rand_seed = fill_random_buf(&td->buf_state, p, len); break; case 1: if (io_u->buf_filled_len >= len) { dprint(FD_VERIFY, "using already filled verify pattern b=0 len=%u\n", len); return; } dprint(FD_VERIFY, "fill verify pattern b=0 len=%u\n", len); memset(p, td->o.verify_pattern[0], len); io_u->buf_filled_len = len; break; default: { unsigned int i = 0, size = 0; unsigned char *b = p; if (io_u->buf_filled_len >= len) { dprint(FD_VERIFY, "using already filled verify pattern b=%d len=%u\n", td->o.verify_pattern_bytes, len); return; } dprint(FD_VERIFY, "fill verify pattern b=%d len=%u\n", td->o.verify_pattern_bytes, len); while (i < len) { size = td->o.verify_pattern_bytes; if (size > (len - i)) size = len - i; memcpy(b+i, td->o.verify_pattern, size); i += size; } io_u->buf_filled_len = len; break; } } }
void fill_verify_pattern(struct thread_data *td, void *p, unsigned int len, struct io_u *io_u, unsigned long seed, int use_seed) { if (!td->o.verify_pattern_bytes) { dprint(FD_VERIFY, "fill random bytes len=%u\n", len); if (use_seed) __fill_random_buf(p, len, seed); else io_u->rand_seed = fill_random_buf(&td->buf_state, p, len); return; } if (io_u->buf_filled_len >= len) { dprint(FD_VERIFY, "using already filled verify pattern b=%d len=%u\n", td->o.verify_pattern_bytes, len); return; } fill_pattern(td, p, len, td->o.verify_pattern, td->o.verify_pattern_bytes); io_u->buf_filled_len = len; }