Log and dump short ios
[fio.git] / fio.c
diff --git a/fio.c b/fio.c
index 89cc5996ca8854c9b9c655a232a366e8d278c9d7..60a2a1b918e7a8e6de5e4793870ddb87ba27e1b4 100644 (file)
--- a/fio.c
+++ b/fio.c
@@ -332,6 +332,7 @@ static void do_verify(struct thread_data *td)
                                ret = -io_u->error;
                        else if (io_u->resid) {
                                int bytes = io_u->xfer_buflen - io_u->resid;
+                               struct fio_file *f = io_u->file;
 
                                /*
                                 * zero read, fail
@@ -345,8 +346,11 @@ static void do_verify(struct thread_data *td)
                                io_u->xfer_buflen = io_u->resid;
                                io_u->xfer_buf += bytes;
                                io_u->offset += bytes;
+                               f->last_completed_pos = io_u->offset;
 
-                               if (io_u->offset == io_u->file->real_file_size)
+                               td->ts.short_io_u[io_u->ddir]++;
+
+                               if (io_u->offset == f->real_file_size)
                                        goto sync_done;
 
                                requeue_io_u(td, &io_u);
@@ -446,6 +450,7 @@ static void do_io(struct thread_data *td)
                                ret = -io_u->error;
                        else if (io_u->resid) {
                                int bytes = io_u->xfer_buflen - io_u->resid;
+                               struct fio_file *f = io_u->file;
 
                                /*
                                 * zero read, fail
@@ -459,8 +464,11 @@ static void do_io(struct thread_data *td)
                                io_u->xfer_buflen = io_u->resid;
                                io_u->xfer_buf += bytes;
                                io_u->offset += bytes;
+                               f->last_completed_pos = io_u->offset;
+
+                               td->ts.short_io_u[io_u->ddir]++;
 
-                               if (io_u->offset == io_u->file->real_file_size)
+                               if (io_u->offset == f->real_file_size)
                                        goto sync_done;
 
                                requeue_io_u(td, &io_u);
@@ -662,7 +670,11 @@ static int switch_ioscheduler(struct thread_data *td)
 
        f = fopen(tmp, "r+");
        if (!f) {
-               td_verror(td, errno, "fopen");
+               if (errno == ENOENT) {
+                       log_err("fio: os or kernel doesn't support IO scheduler switching\n");
+                       return 0;
+               }
+               td_verror(td, errno, "fopen iosched");
                return 1;
        }
 
@@ -990,6 +1002,7 @@ static void reap_threads(int *nr_running, int *t_rate, int *m_rate)
                /*
                 * thread is not dead, continue
                 */
+               pending++;
                continue;
 reaped:
                if (td->o.use_thread) {
@@ -1002,6 +1015,7 @@ reaped:
                (*nr_running)--;
                (*m_rate) -= td->o.ratemin;
                (*t_rate) -= td->o.rate;
+               pending--;
 
                if (td->error)
                        exit_value++;