return 0;
}
-static inline int is_power_of_2(unsigned int val)
-{
- return (val != 0 && ((val & (val - 1)) == 0));
-}
-
static unsigned int get_next_buflen(struct thread_data *td, struct io_u *io_u)
{
const int ddir = io_u->ddir;
{
enum fio_ddir ddir;
+ /*
+ * see if it's time to fsync
+ */
+ if (td->o.fsync_blocks &&
+ !(td->io_issues[DDIR_WRITE] % td->o.fsync_blocks) &&
+ td->io_issues[DDIR_WRITE] && should_fsync(td))
+ return DDIR_SYNC;
+
+ /*
+ * see if it's time to fdatasync
+ */
+ if (td->o.fdatasync_blocks &&
+ !(td->io_issues[DDIR_WRITE] % td->o.fdatasync_blocks) &&
+ td->io_issues[DDIR_WRITE] && should_fsync(td))
+ return DDIR_DATASYNC;
+
if (td_rw(td)) {
/*
* Check if it's time to seed a new data direction.
td->cur_depth--;
}
+void clear_io_u(struct thread_data *td, struct io_u *io_u)
+{
+ io_u->flags &= ~IO_U_F_FLIGHT;
+ put_io_u(td, io_u);
+}
+
void requeue_io_u(struct thread_data *td, struct io_u **io_u)
{
struct io_u *__io_u = *io_u;
dprint(FD_IO, "requeue %p\n", __io_u);
__io_u->flags |= IO_U_F_FREE;
- if ((__io_u->flags & IO_U_F_FLIGHT) && (__io_u->ddir != DDIR_SYNC))
+ if ((__io_u->flags & IO_U_F_FLIGHT) && !ddir_sync(__io_u->ddir))
td->io_issues[__io_u->ddir]--;
__io_u->flags &= ~IO_U_F_FLIGHT;
if (td->io_ops->flags & FIO_NOIO)
goto out;
+ io_u->ddir = get_rw_ddir(td);
+
/*
- * see if it's time to sync
+ * fsync() or fdatasync(), we are done
*/
- if (td->o.fsync_blocks &&
- !(td->io_issues[DDIR_WRITE] % td->o.fsync_blocks) &&
- td->io_issues[DDIR_WRITE] && should_fsync(td)) {
- io_u->ddir = DDIR_SYNC;
+ if (ddir_sync(io_u->ddir))
goto out;
- }
-
- io_u->ddir = get_rw_ddir(td);
/*
* See if it's time to switch to a new zone
f = io_u->file;
assert(fio_file_open(f));
- if (io_u->ddir != DDIR_SYNC) {
+ if (!ddir_sync(io_u->ddir)) {
if (!io_u->buflen && !(td->io_ops->flags & FIO_NOIO)) {
dprint(FD_IO, "get_io_u: zero buflen on %p\n", io_u);
goto err_put;
assert(io_u->flags & IO_U_F_FLIGHT);
io_u->flags &= ~IO_U_F_FLIGHT;
- if (io_u->ddir == DDIR_SYNC) {
+ if (ddir_sync(io_u->ddir)) {
td->last_was_sync = 1;
return;
}
icd->error = io_u->error;
io_u_log_error(td, io_u);
}
+ if (td->o.continue_on_error && icd->error &&
+ td_non_fatal_error(icd->error)) {
+ /*
+ * If there is a non_fatal error, then add to the error count
+ * and clear all the errors.
+ */
+ update_error_count(td, icd->error);
+ td_clear_error(td);
+ icd->error = 0;
+ io_u->error = 0;
+ }
}
static void init_icd(struct thread_data *td, struct io_completion_data *icd,