X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=iolog.c;h=b29684a85eb69c30d219b95eff122c33df9ce5f6;hp=99f8bc18d8694cca0c141c51d116aced1b4130f2;hb=824d6ff466fed05679a7d0991fdf3ee1d625a3c8;hpb=df8fb6097058098f1c2f7c2cf4019640561768df diff --git a/iolog.c b/iolog.c index 99f8bc18..b29684a8 100644 --- a/iolog.c +++ b/iolog.c @@ -250,6 +250,7 @@ restart: p = &td->io_hist_tree.rb_node; parent = NULL; while (*p) { + int overlap = 0; parent = *p; __ipo = rb_entry(parent, struct io_piece, rb_node); @@ -257,11 +258,18 @@ restart: p = &(*p)->rb_left; else if (ipo->file > __ipo->file) p = &(*p)->rb_right; - else if (ipo->offset < __ipo->offset) + else if (ipo->offset < __ipo->offset) { p = &(*p)->rb_left; - else if (ipo->offset > __ipo->offset) + overlap = ipo->offset + ipo->len > __ipo->offset; + } + else if (ipo->offset > __ipo->offset) { p = &(*p)->rb_right; - else { + overlap = __ipo->offset + __ipo->len > ipo->offset; + } + else + overlap = 1; + + if (overlap) { dprint(FD_IO, "iolog: overlap %llu/%lu, %llu/%lu", __ipo->offset, __ipo->len, ipo->offset, ipo->len); @@ -283,6 +291,18 @@ void unlog_io_piece(struct thread_data *td, struct io_u *io_u) { struct io_piece *ipo = io_u->ipo; + if (td->ts.nr_block_infos) { + uint32_t *info = io_u_block_info(td, io_u); + if (BLOCK_INFO_STATE(*info) < BLOCK_STATE_TRIM_FAILURE) { + if (io_u->ddir == DDIR_TRIM) + *info = BLOCK_INFO_SET_STATE(*info, + BLOCK_STATE_TRIM_FAILURE); + else if (io_u->ddir == DDIR_WRITE) + *info = BLOCK_INFO_SET_STATE(*info, + BLOCK_STATE_WRITE_FAILURE); + } + } + if (!ipo) return; @@ -868,10 +888,12 @@ int iolog_file_inflate(const char *file) if (ret < 0) { perror("fread"); fclose(f); + free(buf); return 1; } else if (ret != 1) { log_err("fio: short read on reading log\n"); fclose(f); + free(buf); return 1; }