+static int finish_log_named(struct thread_data *td, struct io_log *log,
+ const char *prefix, const char *postfix,
+ int trylock)
+{
+ char file_name[256];
+
+ snprintf(file_name, sizeof(file_name), "%s_%s.log", prefix, postfix);
+
+ if (trylock) {
+ if (fio_trylock_file(file_name))
+ return 1;
+ } else
+ fio_lock_file(file_name);
+
+ if (td->client_type == FIO_CLIENT_TYPE_GUI) {
+ fio_send_iolog(td, log, file_name);
+ free(log->log);
+ free(log);
+ } else
+ __finish_log(log, file_name);
+
+ fio_unlock_file(file_name);
+ return 0;
+}
+
+static int finish_log(struct thread_data *td, struct io_log *log,
+ const char *name, int trylock)
+{
+ return finish_log_named(td, log, td->o.name, name, trylock);
+}
+
+static int write_this_log(struct thread_data *td, struct io_log *log,
+ const char *log_file, const char *name, int try)
+{
+ int ret;
+
+ if (!log)
+ return 0;
+
+ if (log_file)
+ ret = finish_log_named(td, log, log_file, name, try);
+ else
+ ret = finish_log(td, log, name, try);
+
+ return ret;
+}
+
+static int write_iops_log(struct thread_data *td, int try)
+{
+ struct thread_options *o = &td->o;
+
+ return write_this_log(td, td->iops_log, o->iops_log_file, "iops", try);
+}
+
+static int write_slat_log(struct thread_data *td, int try)
+{
+ struct thread_options *o = &td->o;
+
+ return write_this_log(td, td->slat_log, o->lat_log_file, "slat", try);
+}
+
+static int write_clat_log(struct thread_data *td, int try)
+{
+ struct thread_options *o = &td->o;
+
+ return write_this_log(td, td->clat_log, o->lat_log_file, "clat" , try);
+}
+
+static int write_lat_log(struct thread_data *td, int try)