Improve error logging and handling
If we see an IO anomaly, make sure we dump as much info about the
filename, size, offset, etc.
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
diff --git a/fio.c b/fio.c
index 22f0124..b668d85 100644
--- a/fio.c
+++ b/fio.c
@@ -270,6 +270,8 @@
io_u = NULL;
while (!td->terminate) {
+ int ret2;
+
io_u = __get_io_u(td);
if (!io_u)
break;
@@ -297,7 +299,7 @@
case FIO_Q_COMPLETED:
if (io_u->error)
ret = -io_u->error;
- if (io_u->xfer_buflen != io_u->resid && io_u->resid) {
+ else if (io_u->xfer_buflen != io_u->resid && io_u->resid) {
int bytes = io_u->xfer_buflen - io_u->resid;
io_u->xfer_buflen = io_u->resid;
@@ -312,7 +314,9 @@
break;
case FIO_Q_BUSY:
requeue_io_u(td, &io_u);
- ret = td_io_commit(td);
+ ret2 = td_io_commit(td);
+ if (ret2 < 0)
+ ret = ret2;
break;
default:
assert(ret < 0);
@@ -396,6 +400,7 @@
long bytes_done = 0;
int min_evts = 0;
struct io_u *io_u;
+ int ret2;
if (td->terminate)
break;
@@ -415,11 +420,9 @@
switch (ret) {
case FIO_Q_COMPLETED:
- if (io_u->error) {
- ret = io_u->error;
- break;
- }
- if (io_u->xfer_buflen != io_u->resid && io_u->resid) {
+ if (io_u->error)
+ ret = -io_u->error;
+ else if (io_u->xfer_buflen != io_u->resid && io_u->resid) {
int bytes = io_u->xfer_buflen - io_u->resid;
io_u->xfer_buflen = io_u->resid;
@@ -442,7 +445,9 @@
break;
case FIO_Q_BUSY:
requeue_io_u(td, &io_u);
- ret = td_io_commit(td);
+ ret2 = td_io_commit(td);
+ if (ret2 < 0)
+ ret = ret2;
break;
default:
assert(ret < 0);