The following changes since commit 435228488ffd062f4eac710aaa862e04cd20dfee:

  Avoid buildenv conditional in thread_option struct (2014-05-01 11:21:56 -0600)

are available in the git repository at:

  git://git.kernel.dk/fio.git master

for you to fetch changes up to 890b665611751661aac1030603175bb7bbde34bc:

  verify: fix verification of uncompleted or errored ios (2014-05-06 19:06:51 
-0600)

----------------------------------------------------------------
Jens Axboe (1):
      verify: fix verification of uncompleted or errored ios

 backend.c |    6 ++++++
 io_u.c    |   11 +++++++++--
 iolog.c   |   27 +++++++++++++++++++++++++++
 iolog.h   |    2 ++
 4 files changed, 44 insertions(+), 2 deletions(-)

---

Diff of recent changes:

diff --git a/backend.c b/backend.c
index 9deef28..d1d5571 100644
--- a/backend.c
+++ b/backend.c
@@ -780,16 +780,21 @@ static uint64_t do_io(struct thread_data *td)
                case FIO_Q_COMPLETED:
                        if (io_u->error) {
                                ret = -io_u->error;
+                               unlog_io_piece(td, io_u);
                                clear_io_u(td, io_u);
                        } else if (io_u->resid) {
                                int bytes = io_u->xfer_buflen - io_u->resid;
                                struct fio_file *f = io_u->file;
 
                                bytes_issued += bytes;
+
+                               trim_io_piece(td, io_u);
+
                                /*
                                 * zero read, fail
                                 */
                                if (!bytes) {
+                                       unlog_io_piece(td, io_u);
                                        td_verror(td, EIO, "full resid");
                                        put_io_u(td, io_u);
                                        break;
@@ -830,6 +835,7 @@ sync_done:
                        bytes_issued += io_u->xfer_buflen;
                        break;
                case FIO_Q_BUSY:
+                       unlog_io_piece(td, io_u);
                        requeue_io_u(td, &io_u);
                        ret2 = td_io_commit(td);
                        if (ret2 < 0)
diff --git a/io_u.c b/io_u.c
index 4b0b5a7..e132fd9 100644
--- a/io_u.c
+++ b/io_u.c
@@ -1622,8 +1622,15 @@ static void io_completed(struct thread_data *td, struct 
io_u *io_u,
         * Mark IO ok to verify
         */
        if (io_u->ipo) {
-               io_u->ipo->flags &= ~IP_F_IN_FLIGHT;
-               write_barrier();
+               /*
+                * Remove errored entry from the verification list
+                */
+               if (io_u->error)
+                       unlog_io_piece(td, io_u);
+               else {
+                       io_u->ipo->flags &= ~IP_F_IN_FLIGHT;
+                       write_barrier();
+               }
        }
 
        td_io_u_unlock(td);
diff --git a/iolog.c b/iolog.c
index f498959..cac1aba 100644
--- a/iolog.c
+++ b/iolog.c
@@ -268,6 +268,33 @@ restart:
        td->io_hist_len++;
 }
 
+void unlog_io_piece(struct thread_data *td, struct io_u *io_u)
+{
+       struct io_piece *ipo = io_u->ipo;
+
+       if (!ipo)
+               return;
+
+       if (ipo->flags & IP_F_ONRB)
+               rb_erase(&ipo->rb_node, &td->io_hist_tree);
+       else if (ipo->flags & IP_F_ONLIST)
+               flist_del(&ipo->list);
+
+       free(ipo);
+       io_u->ipo = NULL;
+       td->io_hist_len--;
+}
+
+void trim_io_piece(struct thread_data *td, struct io_u *io_u)
+{
+       struct io_piece *ipo = io_u->ipo;
+
+       if (!ipo)
+               return;
+
+       ipo->len = io_u->xfer_buflen - io_u->resid;
+}
+
 void write_iolog_close(struct thread_data *td)
 {
        fflush(td->iolog_f);
diff --git a/iolog.h b/iolog.h
index 50d09e2..3af5668 100644
--- a/iolog.h
+++ b/iolog.h
@@ -110,6 +110,8 @@ extern void log_io_u(struct thread_data *, struct io_u *);
 extern void log_file(struct thread_data *, struct fio_file *, enum 
file_log_act);
 extern int __must_check init_iolog(struct thread_data *td);
 extern void log_io_piece(struct thread_data *, struct io_u *);
+extern void unlog_io_piece(struct thread_data *, struct io_u *);
+extern void trim_io_piece(struct thread_data *, struct io_u *);
 extern void queue_io_piece(struct thread_data *, struct io_piece *);
 extern void prune_io_piece_log(struct thread_data *);
 extern void write_iolog_close(struct thread_data *);
--
To unsubscribe from this list: send the line "unsubscribe fio" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to