Trim/discard fixes
[fio.git] / fio.c
diff --git a/fio.c b/fio.c
index 896f79774980758df43755d023cdcac5106fd128..04247925115cddd9625b67b643ddd5d21d18f9d5 100644 (file)
--- a/fio.c
+++ b/fio.c
@@ -38,6 +38,7 @@
 #include "hash.h"
 #include "smalloc.h"
 #include "verify.h"
+#include "trim.h"
 #include "diskutil.h"
 #include "cgroup.h"
 #include "profile.h"
@@ -176,6 +177,8 @@ static int __check_min_rate(struct thread_data *td, struct timeval *now,
        unsigned int rate_iops = 0;
        unsigned int rate_iops_min = 0;
 
+       assert(ddir_rw(ddir));
+
        if (!td->o.ratemin[ddir] && !td->o.rate_iops_min[ddir])
                return 0;
 
@@ -491,7 +494,8 @@ static void do_verify(struct thread_data *td)
                                io_u->xfer_buf += bytes;
                                io_u->offset += bytes;
 
-                               td->ts.short_io_u[io_u->ddir]++;
+                               if (ddir_rw(io_u->ddir))
+                                       td->ts.short_io_u[io_u->ddir]++;
 
                                if (io_u->offset == f->real_file_size)
                                        goto sync_done;
@@ -576,6 +580,7 @@ static void do_io(struct thread_data *td)
                td_set_runstate(td, TD_RUNNING);
 
        while ( (td->o.read_iolog_file && !flist_empty(&td->io_log_list)) ||
+               (!flist_empty(&td->trim_list)) ||
                ((td->this_io_bytes[0] + td->this_io_bytes[1]) < td->o.size) ) {
                struct timeval comp_time;
                unsigned long bytes_done[2] = { 0, 0 };
@@ -636,7 +641,8 @@ static void do_io(struct thread_data *td)
                                io_u->xfer_buf += bytes;
                                io_u->offset += bytes;
 
-                               td->ts.short_io_u[io_u->ddir]++;
+                               if (ddir_rw(io_u->ddir))
+                                       td->ts.short_io_u[io_u->ddir]++;
 
                                if (io_u->offset == f->real_file_size)
                                        goto sync_done;
@@ -730,6 +736,8 @@ sync_done:
                }
        }
 
+       assert(!td->trim_entries);
+
        if (td->o.fill_device && td->error == ENOSPC) {
                td->error = 0;
                td->terminate = 1;
@@ -1018,6 +1026,7 @@ static void *thread_main(void *data)
        INIT_FLIST_HEAD(&td->io_log_list);
        INIT_FLIST_HEAD(&td->io_hist_list);
        INIT_FLIST_HEAD(&td->verify_list);
+       INIT_FLIST_HEAD(&td->trim_list);
        pthread_mutex_init(&td->io_u_lock, NULL);
        td->io_hist_tree = RB_ROOT;
 
@@ -1380,9 +1389,13 @@ static void *gtod_thread_main(void *data)
 
 static int fio_start_gtod_thread(void)
 {
+       pthread_attr_t attr;
        int ret;
 
-       ret = pthread_create(&gtod_thread, NULL, gtod_thread_main, NULL);
+       pthread_attr_init(&attr);
+       pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN);
+       ret = pthread_create(&gtod_thread, &attr, gtod_thread_main, NULL);
+       pthread_attr_destroy(&attr);
        if (ret) {
                log_err("Can't create gtod thread: %s\n", strerror(ret));
                return 1;