X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=iolog.c;h=ec29971f6a51dfd2d67dc3e00f0c90a76264c7fc;hp=4818cd4593b2e0c9d000f7d001b86cf2ee416e17;hb=621677626f2551bedfdc4a5fc3b3e5f8492b94fa;hpb=1fae4855d30ae19ef6b681a33821b36c298ab7e1 diff --git a/iolog.c b/iolog.c index 4818cd45..ec29971f 100644 --- a/iolog.c +++ b/iolog.c @@ -110,7 +110,7 @@ int read_iolog_get(struct thread_data *td, struct io_u *io_u) { struct io_piece *ipo; unsigned long elapsed; - + while (!flist_empty(&td->io_log_list)) { int ret; @@ -141,11 +141,10 @@ int read_iolog_get(struct thread_data *td, struct io_u *io_u) elapsed = mtime_since_genesis(); if (ipo->delay > elapsed) usec_sleep(td, (ipo->delay - elapsed) * 1000); - } free(ipo); - + if (io_u->ddir != DDIR_WAIT) return 0; } @@ -189,6 +188,7 @@ void log_io_piece(struct thread_data *td, struct io_u *io_u) ipo->file = io_u->file; ipo->offset = io_u->offset; ipo->len = io_u->buflen; + ipo->numberio = io_u->numberio; if (io_u_should_trim(td, io_u)) { flist_add_tail(&ipo->trim_list, &td->trim_list); @@ -239,7 +239,9 @@ restart: else if (ipo->offset > __ipo->offset) p = &(*p)->rb_right; else { - assert(ipo->len == __ipo->len); + dprint(FD_IO, "iolog: overlap %llu/%lu, %llu/%lu", + __ipo->offset, __ipo->len, + ipo->offset, ipo->len); td->io_hist_len--; rb_erase(parent, &td->io_hist_tree); remove_trim_entry(td, __ipo); @@ -314,6 +316,7 @@ static int read_iolog2(struct thread_data *td, FILE *f) act); continue; } + fileno = get_fileno(td, fname); } else if (r == 2) { rw = DDIR_INVAL; if (!strcmp(act, "add")) { @@ -370,7 +373,7 @@ static int read_iolog2(struct thread_data *td, FILE *f) ipo->fileno = fileno; ipo->file_action = file_action; } - + queue_io_piece(td, ipo); } @@ -478,17 +481,22 @@ int init_iolog(struct thread_data *td) int ret = 0; if (td->o.read_iolog_file) { + int need_swap; + /* * Check if it's a blktrace file and load that if possible. * Otherwise assume it's a normal log file and load that. */ - if (is_blktrace(td->o.read_iolog_file)) - ret = load_blktrace(td, td->o.read_iolog_file); + if (is_blktrace(td->o.read_iolog_file, &need_swap)) + ret = load_blktrace(td, td->o.read_iolog_file, need_swap); else ret = init_iolog_read(td); } else if (td->o.write_iolog_file) ret = init_iolog_write(td); + if (ret) + td_verror(td, EINVAL, "failed initializing iolog"); + return ret; } @@ -533,7 +541,7 @@ void finish_log_named(struct thread_data *td, struct io_log *log, { char file_name[256], *p; - snprintf(file_name, 200, "%s_%s.log", prefix, postfix); + snprintf(file_name, sizeof(file_name), "%s_%s.log", prefix, postfix); p = basename(file_name); if (td->client_type == FIO_CLIENT_TYPE_GUI) {