Improve error logging and handling
[fio.git] / io_u.c
diff --git a/io_u.c b/io_u.c
index 6df4b5eee80190187aa0015b11aca7da73e714b4..698952c7eb964bccb1c01feb2af1357108b8c0b8 100644 (file)
--- a/io_u.c
+++ b/io_u.c
@@ -486,6 +486,23 @@ out:
        return io_u;
 }
 
+void io_u_log_error(struct thread_data *td, struct io_u *io_u)
+{
+       const char *msg[] = { "read", "write", "sync" };
+
+       log_err("fio: io_u error");
+
+       if (io_u->file)
+               log_err(" on file %s", io_u->file->file_name);
+
+       log_err(": %s\n", strerror(io_u->error));
+
+       log_err("     %s offset=%llu, buflen=%lu\n", msg[io_u->ddir], io_u->offset, io_u->xfer_buflen);
+
+       if (!td->error)
+               td_verror(td, io_u->error, "io_u error");
+}
+
 static void io_completed(struct thread_data *td, struct io_u *io_u,
                         struct io_completion_data *icd)
 {
@@ -529,8 +546,10 @@ static void io_completed(struct thread_data *td, struct io_u *io_u,
                        if (ret && !icd->error)
                                icd->error = ret;
                }
-       } else
+       } else {
                icd->error = io_u->error;
+               io_u_log_error(td, io_u);
+       }
 }
 
 static void init_icd(struct io_completion_data *icd, int nr)
@@ -571,6 +590,7 @@ long io_u_sync_complete(struct thread_data *td, struct io_u *io_u)
        if (!icd.error)
                return icd.bytes_done[0] + icd.bytes_done[1];
 
+       td_verror(td, icd.error, "io_u_sync_complete");
        return -1;
 }
 
@@ -601,6 +621,7 @@ long io_u_queued_complete(struct thread_data *td, int min_events)
        if (!icd.error)
                return icd.bytes_done[0] + icd.bytes_done[1];
 
+       td_verror(td, icd.error, "io_u_queued_complete");
        return -1;
 }