X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=verify.c;h=5ee0029d130e2f891d48cbd6c1ee01203085a6c3;hb=0123751ca55fe462e8888c8d7b8c7def14b74ab3;hp=da429e793a86e8f0198a8cffaa5bf8a964898fcc;hpb=46ff70e8795e91acb2ffc041e6c1fdb4e157dff4;p=fio.git diff --git a/verify.c b/verify.c index da429e79..5ee0029d 100644 --- a/verify.c +++ b/verify.c @@ -8,12 +8,14 @@ #include #include +#include "arch/arch.h" #include "fio.h" #include "verify.h" #include "trim.h" #include "lib/rand.h" #include "lib/hweight.h" #include "lib/pattern.h" +#include "oslib/asprintf.h" #include "crc/md5.h" #include "crc/crc64.h" @@ -39,33 +41,27 @@ void fill_buffer_pattern(struct thread_data *td, void *p, unsigned int len) (void)cpy_pattern(td->o.buffer_pattern, td->o.buffer_pattern_bytes, p, len); } -static void __fill_buffer(struct thread_options *o, unsigned long seed, void *p, +static void __fill_buffer(struct thread_options *o, uint64_t seed, void *p, unsigned int len) { __fill_random_buf_percentage(seed, p, o->compress_percentage, len, len, o->buffer_pattern, o->buffer_pattern_bytes); } -static unsigned long fill_buffer(struct thread_data *td, void *p, - unsigned int len) -{ - struct frand_state *fs = &td->verify_state; - struct thread_options *o = &td->o; - - return fill_random_buf_percentage(fs, p, o->compress_percentage, len, len, o->buffer_pattern, o->buffer_pattern_bytes); -} - void fill_verify_pattern(struct thread_data *td, void *p, unsigned int len, - struct io_u *io_u, unsigned long seed, int use_seed) + struct io_u *io_u, uint64_t seed, int use_seed) { struct thread_options *o = &td->o; if (!o->verify_pattern_bytes) { dprint(FD_VERIFY, "fill random bytes len=%u\n", len); - if (use_seed) - __fill_buffer(o, seed, p, len); - else - io_u->rand_seed = fill_buffer(td, p, len); + if (!use_seed) { + seed = __rand(&td->verify_state); + if (sizeof(int) != sizeof(long *)) + seed *= (unsigned long)__rand(&td->verify_state); + } + io_u->rand_seed = seed; + __fill_buffer(o, seed, p, len); return; } @@ -100,7 +96,7 @@ static unsigned int get_hdr_inc(struct thread_data *td, struct io_u *io_u) } static void fill_pattern_headers(struct thread_data *td, struct io_u *io_u, - unsigned long seed, int use_seed) + uint64_t seed, int use_seed) { unsigned int hdr_inc, header_num; struct verify_header *hdr; @@ -844,13 +840,11 @@ static int verify_header(struct io_u *io_u, struct thread_data *td, * For read-only workloads, the program cannot be certain of the * last numberio written to a block. Checking of numberio will be * done only for workloads that write data. For verify_only, - * numberio will be checked in the last iteration when the correct - * state of numberio, that would have been written to each block - * in a previous run of fio, has been reached. + * numberio check is skipped. */ if (td_write(td) && (td_min_bs(td) == td_max_bs(td)) && !td->o.time_based) - if (!td->o.verify_only || td->o.loops == 0) + if (!td->o.verify_only) if (hdr->numberio != io_u->numberio) { log_err("verify: bad header numberio %"PRIu16 ", wanted %"PRIu16, @@ -1191,6 +1185,10 @@ static void populate_hdr(struct thread_data *td, struct io_u *io_u, fill_hdr(td, io_u, hdr, header_num, header_len, io_u->rand_seed); + if (header_len <= hdr_size(td, hdr)) { + td_verror(td, EINVAL, "Blocksize too small"); + return; + } data_len = header_len - hdr_size(td, hdr); data = p + hdr_size(td, hdr); @@ -1312,8 +1310,7 @@ int get_next_verify(struct thread_data *td, struct io_u *io_u) /* * Ensure that the associated IO has completed */ - read_barrier(); - if (ipo->flags & IP_F_IN_FLIGHT) + if (atomic_load_acquire(&ipo->flags) & IP_F_IN_FLIGHT) goto nothing; rb_erase(n, &td->io_hist_tree); @@ -1325,8 +1322,7 @@ int get_next_verify(struct thread_data *td, struct io_u *io_u) /* * Ensure that the associated IO has completed */ - read_barrier(); - if (ipo->flags & IP_F_IN_FLIGHT) + if (atomic_load_acquire(&ipo->flags) & IP_F_IN_FLIGHT) goto nothing; flist_del(&ipo->list); @@ -1635,8 +1631,7 @@ struct all_io_list *get_all_io_list(int save_mask, size_t *sz) s->rand.state32.s[3] = 0; s->rand.use64 = 0; } - s->name[sizeof(s->name) - 1] = '\0'; - strncpy((char *) s->name, td->o.name, sizeof(s->name) - 1); + snprintf((char *) s->name, sizeof(s->name), "%s", td->o.name); next = io_list_next(s); }