X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=verify.c;h=40d484b5c60a6ac281a2d6da5f328be3b15e3f0a;hp=d070f33142979b512e23f8a618eeb1d73532d3f6;hb=04bc85a130c5dbe25dafe5fa5084c5bdcf63844a;hpb=b93a8eb09c7904790f78956cb481bd55b3ac8c82 diff --git a/verify.c b/verify.c index d070f331..40d484b5 100644 --- a/verify.c +++ b/verify.c @@ -245,33 +245,23 @@ struct vcont { static void dump_buf(char *buf, unsigned int len, unsigned long long offset, const char *type, struct fio_file *f) { - char *ptr, fname[DUMP_BUF_SZ]; - size_t buf_left = DUMP_BUF_SZ; + char *ptr, *fname; + char sep[2] = { FIO_OS_PATH_SEPARATOR, 0 }; int ret, fd; ptr = strdup(f->file_name); - memset(fname, 0, sizeof(fname)); - if (aux_path) - sprintf(fname, "%s%c", aux_path, FIO_OS_PATH_SEPARATOR); - - strncpy(fname + strlen(fname), basename(ptr), buf_left - 1); - - buf_left -= strlen(fname); - if (buf_left <= 0) { + if (asprintf(&fname, "%s%s%s.%llu.%s", aux_path ? : "", + aux_path ? sep : "", basename(ptr), offset, type) < 0) { if (!fio_did_warn(FIO_WARN_VERIFY_BUF)) - log_err("fio: verify failure dump buffer too small\n"); - free(ptr); - return; + log_err("fio: not enough memory for dump buffer filename\n"); + goto free_ptr; } - snprintf(fname + strlen(fname), buf_left, ".%llu.%s", offset, type); - fd = open(fname, O_CREAT | O_TRUNC | O_WRONLY, 0644); if (fd < 0) { perror("open verify buf file"); - free(ptr); - return; + goto free_fname; } while (len) { @@ -288,6 +278,11 @@ static void dump_buf(char *buf, unsigned int len, unsigned long long offset, close(fd); log_err(" %s data dumped as %s\n", type, fname); + +free_fname: + free(fname); + +free_ptr: free(ptr); } @@ -924,10 +919,9 @@ int verify_io_u(struct thread_data *td, struct io_u **io_u_ptr) hdr = p; /* - * Make rand_seed check pass when have verifysort or - * verify_backlog. + * Make rand_seed check pass when have verify_backlog. */ - if (td->o.verifysort || (td->flags & TD_F_VER_BACKLOG)) + if (!td_rw(td) || (td->flags & TD_F_VER_BACKLOG)) io_u->rand_seed = hdr->rand_seed; if (td->o.verify != VERIFY_PATTERN_NO_HDR) { @@ -1307,7 +1301,7 @@ int get_next_verify(struct thread_data *td, struct io_u *io_u) return 0; if (!RB_EMPTY_ROOT(&td->io_hist_tree)) { - struct rb_node *n = rb_first(&td->io_hist_tree); + struct fio_rb_node *n = rb_first(&td->io_hist_tree); ipo = rb_entry(n, struct io_piece, rb_node); @@ -1454,9 +1448,9 @@ static void *verify_async_thread(void *data) done: pthread_mutex_lock(&td->io_u_lock); td->nr_verify_threads--; + pthread_cond_signal(&td->free_cond); pthread_mutex_unlock(&td->io_u_lock); - pthread_cond_signal(&td->free_cond); return NULL; } @@ -1492,9 +1486,12 @@ int verify_async_init(struct thread_data *td) if (i != td->o.verify_async) { log_err("fio: only %d verify threads started, exiting\n", i); + + pthread_mutex_lock(&td->io_u_lock); td->verify_thread_exit = 1; - write_barrier(); pthread_cond_broadcast(&td->verify_cond); + pthread_mutex_unlock(&td->io_u_lock); + return 1; } @@ -1503,12 +1500,10 @@ int verify_async_init(struct thread_data *td) void verify_async_exit(struct thread_data *td) { + pthread_mutex_lock(&td->io_u_lock); td->verify_thread_exit = 1; - write_barrier(); pthread_cond_broadcast(&td->verify_cond); - pthread_mutex_lock(&td->io_u_lock); - while (td->nr_verify_threads) pthread_cond_wait(&td->free_cond, &td->io_u_lock);