Add 'filesize' option
[fio.git] / fio.c
diff --git a/fio.c b/fio.c
index cc65e3d0cf197ec46b978283b4c754d4cdf5f396..5f06940f81e6a3b2ff7c1aeaeb4c27b197e5ddfd 100644 (file)
--- a/fio.c
+++ b/fio.c
 #include "fio.h"
 #include "os.h"
 
-static unsigned long page_mask;
+unsigned long page_mask;
+unsigned long page_size;
 #define ALIGN(buf)     \
        (char *) (((unsigned long) (buf) + page_mask) & ~page_mask)
 
 int groupid = 0;
 int thread_number = 0;
+int nr_process = 0;
+int nr_thread = 0;
 int shm_id = 0;
 int temp_stall_ts;
 
@@ -253,13 +256,16 @@ static void do_verify(struct thread_data *td)
 {
        struct fio_file *f;
        struct io_u *io_u;
-       int ret, i, min_events;
+       int ret, min_events;
+       unsigned int i;
 
        /*
         * sync io first and invalidate cache, to make sure we really
         * read from disk.
         */
        for_each_file(td, f, i) {
+               if (!(f->flags & FIO_FILE_OPEN))
+                       continue;
                if (fio_io_sync(td, f))
                        break;
                if (file_invalidate_cache(td, f))
@@ -301,9 +307,17 @@ static void do_verify(struct thread_data *td)
                case FIO_Q_COMPLETED:
                        if (io_u->error)
                                ret = -io_u->error;
-                       else if (io_u->xfer_buflen != io_u->resid && io_u->resid) {
+                       else if (io_u->resid) {
                                int bytes = io_u->xfer_buflen - io_u->resid;
 
+                               /*
+                                * zero read, fail
+                                */
+                               if (!bytes) {
+                                       td_verror(td, ENODATA, "full resid");
+                                       put_io_u(td, io_u);
+                                       break;
+                               }
                                io_u->xfer_buflen = io_u->resid;
                                io_u->xfer_buf += bytes;
                                requeue_io_u(td, &io_u);
@@ -369,7 +383,8 @@ static void do_io(struct thread_data *td)
 {
        struct timeval s;
        unsigned long usec;
-       int i, ret = 0;
+       unsigned int i;
+       int ret = 0;
 
        td_set_runstate(td, TD_RUNNING);
 
@@ -399,9 +414,18 @@ static void do_io(struct thread_data *td)
                case FIO_Q_COMPLETED:
                        if (io_u->error)
                                ret = -io_u->error;
-                       else if (io_u->xfer_buflen != io_u->resid && io_u->resid) {
+                       else if (io_u->resid) {
                                int bytes = io_u->xfer_buflen - io_u->resid;
 
+                               /*
+                                * zero read, fail
+                                */
+                               if (!bytes) {
+                                       td_verror(td, ENODATA, "full resid");
+                                       put_io_u(td, io_u);
+                                       break;
+                               }
+
                                io_u->xfer_buflen = io_u->resid;
                                io_u->xfer_buf += bytes;
                                requeue_io_u(td, &io_u);
@@ -499,8 +523,12 @@ static void do_io(struct thread_data *td)
 
                if (should_fsync(td) && td->end_fsync) {
                        td_set_runstate(td, TD_FSYNCING);
-                       for_each_file(td, f, i)
+
+                       for_each_file(td, f, i) {
+                               if (!(f->flags & FIO_FILE_OPEN))
+                                       continue;
                                fio_io_sync(td, f);
+                       }
                }
        } else
                cleanup_pending_aio(td);
@@ -631,7 +659,8 @@ static int switch_ioscheduler(struct thread_data *td)
 static int clear_io_state(struct thread_data *td)
 {
        struct fio_file *f;
-       int i, ret;
+       unsigned int i;
+       int ret;
 
        td->ts.stat_io_bytes[0] = td->ts.stat_io_bytes[1] = 0;
        td->this_io_bytes[0] = td->this_io_bytes[1] = 0;
@@ -675,33 +704,30 @@ static void *thread_main(void *data)
        INIT_LIST_HEAD(&td->io_log_list);
 
        if (init_io_u(td))
-               goto err;
+               goto err_sem;
 
        if (fio_setaffinity(td) == -1) {
                td_verror(td, errno, "cpu_set_affinity");
-               goto err;
+               goto err_sem;
        }
 
        if (init_iolog(td))
-               goto err;
+               goto err_sem;
 
        if (td->ioprio) {
                if (ioprio_set(IOPRIO_WHO_PROCESS, 0, td->ioprio) == -1) {
                        td_verror(td, errno, "ioprio_set");
-                       goto err;
+                       goto err_sem;
                }
        }
 
        if (nice(td->nice) == -1) {
                td_verror(td, errno, "nice");
-               goto err;
+               goto err_sem;
        }
 
-       if (init_random_state(td))
-               goto err;
-
        if (td->ioscheduler && switch_ioscheduler(td))
-               goto err;
+               goto err_sem;
 
        td_set_runstate(td, TD_INITIALIZED);
        fio_sem_up(startup_sem);
@@ -804,6 +830,9 @@ err:
        cleanup_io_u(td);
        td_set_runstate(td, TD_EXITED);
        return (void *) (unsigned long) td->error;
+err_sem:
+       fio_sem_up(startup_sem);
+       goto err;
 }
 
 /*
@@ -931,7 +960,15 @@ static void run_threads(void)
                return;
 
        if (!terse_output) {
-               printf("Starting %d thread%s\n", thread_number, thread_number > 1 ? "s" : "");
+               printf("Starting ");
+               if (nr_thread)
+                       printf("%d thread%s", nr_thread, nr_thread > 1 ? "s" : "");
+               if (nr_process) {
+                       if (nr_thread)
+                               printf(" and ");
+                       printf("%d process%s", nr_process, nr_process > 1 ? "es" : "");
+               }
+               printf("\n");
                fflush(stdout);
        }
 
@@ -1012,6 +1049,7 @@ static void run_threads(void)
                                if (pthread_create(&td->thread, NULL, thread_main, td)) {
                                        perror("thread_create");
                                        nr_started--;
+                                       break;
                                }
                        } else {
                                if (!fork()) {
@@ -1118,6 +1156,7 @@ int main(int argc, char *argv[])
                return 1;
        }
 
+       page_size = ps;
        page_mask = ps - 1;
 
        if (write_bw_log) {