X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=verify.c;h=cf299ebf9643b3a07896f48ef47efb6c2e6583e9;hp=1bb67519b9658276c39b9f88a7aa7ef6643861e8;hb=56440e63ac17d020a58e20a2341333a98f18a7ff;hpb=3376ecf43b2bdd3952c6291d8b469bdf49d3a273 diff --git a/verify.c b/verify.c index 1bb67519..cf299ebf 100644 --- a/verify.c +++ b/verify.c @@ -14,6 +14,7 @@ #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,14 +40,14 @@ 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) +static uint64_t fill_buffer(struct thread_data *td, void *p, + unsigned int len) { struct frand_state *fs = &td->verify_state; struct thread_options *o = &td->o; @@ -55,7 +56,7 @@ static unsigned long fill_buffer(struct thread_data *td, void *p, } 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; @@ -100,7 +101,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; @@ -345,8 +346,10 @@ static void log_verify_failure(struct verify_header *hdr, struct vcont *vc) offset = vc->io_u->offset; offset += vc->hdr_num * hdr->len; - log_err("%.8s: verify failed at file %s offset %llu, length %u\n", - vc->name, vc->io_u->file->file_name, offset, hdr->len); + log_err("%.8s: verify failed at file %s offset %llu, length %u" + " (requested block: offset=%llu, length=%llu)\n", + vc->name, vc->io_u->file->file_name, offset, hdr->len, + vc->io_u->offset, vc->io_u->buflen); if (vc->good_crc && vc->bad_crc) { log_err(" Expected CRC: "); @@ -801,7 +804,7 @@ static int verify_trimmed_io_u(struct thread_data *td, struct io_u *io_u) mem_is_zero_slow(io_u->buf, io_u->buflen, &offset); - log_err("trim: verify failed at file %s offset %llu, length %lu" + log_err("trim: verify failed at file %s offset %llu, length %llu" ", block offset %lu\n", io_u->file->file_name, io_u->offset, io_u->buflen, (unsigned long) offset); @@ -842,13 +845,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, @@ -865,9 +866,11 @@ static int verify_header(struct io_u *io_u, struct thread_data *td, return 0; err: - log_err(" at file %s offset %llu, length %u\n", + log_err(" at file %s offset %llu, length %u" + " (requested block: offset=%llu, length=%llu)\n", io_u->file->file_name, - io_u->offset + hdr_num * hdr_len, hdr_len); + io_u->offset + hdr_num * hdr_len, hdr_len, + io_u->offset, io_u->buflen); if (td->o.verify_dump) dump_buf(p, hdr_len, io_u->offset + hdr_num * hdr_len, @@ -1187,6 +1190,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); @@ -1631,8 +1638,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); }