dprint_io_u(io_u, "prep");
fio_ro_check(td, io_u);
+ lock_file(td, io_u->file, io_u->ddir);
+
if (td->io_ops->prep) {
int ret = td->io_ops->prep(td, io_u);
dprint(FD_IO, "->prep(%p)=%d\n", io_u, ret);
+ if (ret)
+ unlock_file(td, io_u->file);
return ret;
}
ret = td->io_ops->queue(td, io_u);
+ unlock_file(td, io_u->file);
+
if (ret != FIO_Q_BUSY)
io_u_mark_depth(td, io_u);
}
f->last_free_lookup = 0;
- f->last_completed_pos = 0;
f->last_pos = f->file_offset;
f->flags |= FIO_FILE_OPEN;
f->flags &= ~FIO_FILE_CLOSING;
return 1;
}
-void td_io_close_file(struct thread_data *td, struct fio_file *f)
+int td_io_close_file(struct thread_data *td, struct fio_file *f)
{
if (!(f->flags & FIO_FILE_CLOSING))
log_file(td, f, FIO_LOG_CLOSE_FILE);
*/
f->flags |= FIO_FILE_CLOSING;
- put_file(td, f);
+ unlock_file_all(td, f);
+
+ return put_file(td, f);
}