--trigger-timeout=t Execute trigger af this time
--trigger=cmd Set this command as local trigger
--trigger-remote=cmd Set this command as remote trigger
+ --aux-path=path Use this path for fio state generated files
Any parameters following the options will be assumed to be job files,
td->ts.io_bytes[DDIR_TRIM] = td->io_bytes[DDIR_TRIM];
if (td->o.verify_state_save && !(td->flags & TD_F_VSTATE_SAVED) &&
- (td->o.verify != VERIFY_NONE && td_write(td))) {
- struct all_io_list *state;
- size_t sz;
-
- state = get_all_io_list(td->thread_number, &sz);
- if (state) {
- __verify_save_state(state, "local");
- free(state);
- }
- }
+ (td->o.verify != VERIFY_NONE && td_write(td)))
+ verify_save_state(td->thread_number);
fio_unpin_memory(td);
if (nr_clients)
fio_clients_send_trigger(trigger_remote_cmd);
else {
- verify_save_state();
+ verify_save_state(IO_LIST_ALL);
fio_terminate_threads(TERMINATE_ALL);
exec_trigger(trigger_cmd);
}
break;
case FIO_NET_CMD_VTRIGGER: {
struct all_io_list *pdu = (struct all_io_list *) cmd->payload;
- char buf[64];
+ char buf[128];
+ int off = 0;
- __verify_save_state(pdu, server_name(client, buf, sizeof(buf)));
+ if (aux_path) {
+ strcpy(buf, aux_path);
+ off = strlen(buf);
+ }
+
+ __verify_save_state(pdu, server_name(client, &buf[off], sizeof(buf) - off));
exec_trigger(trigger_cmd);
break;
}
extern char *trigger_cmd;
extern char *trigger_remote_cmd;
extern long long trigger_timeout;
+extern char *aux_path;
extern struct thread_data *threads;
char *trigger_cmd = NULL;
char *trigger_remote_cmd = NULL;
+char *aux_path = NULL;
+
static int prev_group_jobs;
unsigned long fio_debug = 0;
.has_arg = required_argument,
.val = 'J',
},
+ {
+ .name = (char *) "aux-path",
+ .has_arg = required_argument,
+ .val = 'K',
+ },
{
.name = NULL,
},
printf(" --trigger-timeout=t\tExecute trigger af this time\n");
printf(" --trigger=cmd\t\tSet this command as local trigger\n");
printf(" --trigger-remote=cmd\tSet this command as remote trigger\n");
+ printf(" --aux-path=path\tUse this path for fio state generated files\n");
printf("\nFio was written by Jens Axboe <jens.axboe@oracle.com>");
printf("\n Jens Axboe <jaxboe@fusionio.com>");
printf("\n Jens Axboe <axboe@fb.com>\n");
free(trigger_remote_cmd);
trigger_remote_cmd = strdup(optarg);
break;
+ case 'K':
+ if (aux_path)
+ free(aux_path);
+ aux_path = strdup(optarg);
+ break;
case 'B':
if (check_str_time(optarg, &trigger_timeout, 1)) {
log_err("fio: failed parsing time %s\n", optarg);
ptr = strdup(f->file_name);
- fname[DUMP_BUF_SZ - 1] = '\0';
- strncpy(fname, basename(ptr), DUMP_BUF_SZ - 1);
+ memset(fname, 0, sizeof(fname));
+ if (aux_path)
+ sprintf(fname, "%s%s", aux_path, FIO_OS_PATH_SEPARATOR);
+
+ strncpy(fname + strlen(fname), basename(ptr), buf_left - 1);
buf_left -= strlen(fname);
if (buf_left <= 0) {
}
}
-void verify_save_state(void)
+void verify_save_state(int mask)
{
struct all_io_list *state;
size_t sz;
- state = get_all_io_list(IO_LIST_ALL, &sz);
+ state = get_all_io_list(mask, &sz);
if (state) {
- __verify_save_state(state, "local");
+ char prefix[PATH_MAX];
+
+ if (aux_path)
+ sprintf(aux_path, "%s%slocal", aux_path, FIO_OS_PATH_SEPARATOR);
+ else
+ strcpy(aux_path, "local");
+
+ __verify_save_state(state, prefix);
free(state);
}
}
#define IO_LIST_ALL 0xffffffff
extern struct all_io_list *get_all_io_list(int, size_t *);
extern void __verify_save_state(struct all_io_list *, const char *);
-extern void verify_save_state(void);
+extern void verify_save_state(int mask);
extern int verify_load_state(struct thread_data *, const char *);
extern void verify_free_state(struct thread_data *);
extern int verify_state_should_stop(struct thread_data *, struct io_u *);