Fix off-by-one in cpus_allowed
[fio.git] / io_u.c
diff --git a/io_u.c b/io_u.c
index 16065128c324e76e3cf9326ff1824fec42baad5b..ebd75c1b6ebba517e617e004290713610b6f0608 100644 (file)
--- a/io_u.c
+++ b/io_u.c
@@ -668,7 +668,17 @@ static enum fio_ddir get_rw_ddir(struct thread_data *td)
 
 static void set_rw_ddir(struct thread_data *td, struct io_u *io_u)
 {
-       io_u->ddir = io_u->acct_ddir = get_rw_ddir(td);
+       enum fio_ddir ddir = get_rw_ddir(td);
+
+       if (td_trimwrite(td)) {
+               struct fio_file *f = io_u->file;
+               if (f->last_pos[DDIR_WRITE] == f->last_pos[DDIR_TRIM])
+                       ddir = DDIR_TRIM;
+               else
+                       ddir = DDIR_WRITE;
+       }
+
+       io_u->ddir = io_u->acct_ddir = ddir;
 
        if (io_u->ddir == DDIR_WRITE && (td->io_ops->flags & FIO_BARRIER) &&
            td->o.barrier_blocks &&
@@ -1596,6 +1606,19 @@ static void account_io_completion(struct thread_data *td, struct io_u *io_u,
 
        if (!gtod_reduce(td))
                add_iops_sample(td, idx, bytes, &icd->time);
+
+       if (td->ts.nr_block_infos && io_u->ddir == DDIR_TRIM) {
+               uint32_t *info = io_u_block_info(td, io_u);
+               if (BLOCK_INFO_STATE(*info) < BLOCK_STATE_TRIM_FAILURE) {
+                       if (io_u->ddir == DDIR_TRIM) {
+                               *info = BLOCK_INFO(BLOCK_STATE_TRIMMED,
+                                               BLOCK_INFO_TRIMS(*info) + 1);
+                       } else if (io_u->ddir == DDIR_WRITE) {
+                               *info = BLOCK_INFO_SET_STATE(BLOCK_STATE_WRITTEN,
+                                                               *info);
+                       }
+               }
+       }
 }
 
 static long long usec_for_io(struct thread_data *td, enum fio_ddir ddir)