* Copyright (C) 2005 Jens Axboe <axboe@suse.de>
* Copyright (C) 2006 Jens Axboe <axboe@kernel.dk>
*
+ * The license below covers all files distributed with fio unless otherwise
+ * noted in the file itself.
+ *
* This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
int temp_stall_ts;
char *fio_inst_prefix = _INST_PREFIX;
-#define should_fsync(td) ((td_write(td) || td_rw(td)) && (!(td)->odirect || (td)->override_sync))
-
static volatile int startup_sem;
#define TERMINATE_ALL (-1)
}
}
+/*
+ * Helper to handle the final sync of a file. Works just like the normal
+ * io path, just does everything sync.
+ */
+static int fio_io_sync(struct thread_data *td, struct fio_file *f)
+{
+ struct io_u *io_u = __get_io_u(td);
+ struct io_completion_data icd;
+ int ret;
+
+ if (!io_u)
+ return 1;
+
+ io_u->ddir = DDIR_SYNC;
+ io_u->file = f;
+
+ if (td_io_prep(td, io_u)) {
+ put_io_u(td, io_u);
+ return 1;
+ }
+
+ ret = td_io_queue(td, io_u);
+ if (ret) {
+ td_verror(td, io_u->error);
+ put_io_u(td, io_u);
+ return 1;
+ }
+
+ ret = td_io_getevents(td, 1, td->cur_depth, NULL);
+ if (ret < 0) {
+ td_verror(td, ret);
+ return 1;
+ }
+
+ icd.nr = ret;
+ ios_completed(td, &icd);
+ if (icd.error) {
+ td_verror(td, icd.error);
+ return 1;
+ }
+
+ return 0;
+}
+
/*
* The main verify engine. Runs over the writes we previusly submitted,
* reads the blocks back in, and checks the crc/md5 of the data.
* read from disk.
*/
for_each_file(td, f, i) {
- td_io_sync(td, f);
+ fio_io_sync(td, f);
file_invalidate_cache(td, f);
}
ret = td_io_queue(td, io_u);
if (ret) {
+ td_verror(td, io_u->error);
put_io_u(td, io_u);
- td_verror(td, ret);
break;
}
ret = td_io_queue(td, io_u);
if (ret) {
+ td_verror(td, io_u->error);
put_io_u(td, io_u);
- td_verror(td, ret);
break;
}
ret = td_io_getevents(td, min_evts, td->cur_depth, timeout);
if (ret < 0) {
- td_verror(td, -ret);
+ td_verror(td, ret);
break;
} else if (!ret)
continue;
if (td->thinktime)
usec_sleep(td, td->thinktime);
-
- if (should_fsync(td) && td->fsync_blocks &&
- (td->io_blocks[DDIR_WRITE] % td->fsync_blocks) == 0)
- td_io_sync(td, f);
}
if (!ret) {
if (should_fsync(td) && td->end_fsync) {
td_set_runstate(td, TD_FSYNCING);
for_each_file(td, f, i)
- td_io_sync(td, f);
+ fio_io_sync(td, f);
}
}
}
FILE *f;
int ret;
+ if (td->io_ops->flags & FIO_CPUIO)
+ return 0;
+
sprintf(tmp, "%s/queue/scheduler", td->sysfs_root);
f = fopen(tmp, "r+");
finish_log(td, td->slat_log, "slat");
if (td->clat_log)
finish_log(td, td->clat_log, "clat");
- if (td->write_iolog)
+ if (td->write_iolog_file)
write_iolog_close(td);
if (td->exec_postrun)
system(td->exec_postrun);