For certain files, fio just stores them in the current working
directory. This can create a bit of a mess. These files might
be verification dump files, or verification state saves.
Add --aux-path to enable storing these files in an arbitrary
directory instead.
Signed-off-by: Jens Axboe <axboe@fb.com>
--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
--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,
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->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);
if (nr_clients)
fio_clients_send_trigger(trigger_remote_cmd);
else {
if (nr_clients)
fio_clients_send_trigger(trigger_remote_cmd);
else {
+ verify_save_state(IO_LIST_ALL);
fio_terminate_threads(TERMINATE_ALL);
exec_trigger(trigger_cmd);
}
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;
break;
case FIO_NET_CMD_VTRIGGER: {
struct all_io_list *pdu = (struct all_io_list *) cmd->payload;
+ 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;
}
exec_trigger(trigger_cmd);
break;
}
extern char *trigger_cmd;
extern char *trigger_remote_cmd;
extern long long trigger_timeout;
extern char *trigger_cmd;
extern char *trigger_remote_cmd;
extern long long trigger_timeout;
extern struct thread_data *threads;
extern struct thread_data *threads;
char *trigger_cmd = NULL;
char *trigger_remote_cmd = NULL;
char *trigger_cmd = NULL;
char *trigger_remote_cmd = NULL;
+char *aux_path = NULL;
+
static int prev_group_jobs;
unsigned long fio_debug = 0;
static int prev_group_jobs;
unsigned long fio_debug = 0;
.has_arg = required_argument,
.val = 'J',
},
.has_arg = required_argument,
.val = 'J',
},
+ {
+ .name = (char *) "aux-path",
+ .has_arg = required_argument,
+ .val = 'K',
+ },
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(" --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");
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;
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);
case 'B':
if (check_str_time(optarg, &trigger_timeout, 1)) {
log_err("fio: failed parsing time %s\n", optarg);
ptr = strdup(f->file_name);
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) {
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;
{
struct all_io_list *state;
size_t sz;
- state = get_all_io_list(IO_LIST_ALL, &sz);
+ state = get_all_io_list(mask, &sz);
- __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);
#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 *);
#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 *);
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 *);