From 95af8dd57a7a9a564f99492bb1e04bb6d13b95b1 Mon Sep 17 00:00:00 2001 From: Kyle Zhang Date: Thu, 11 Apr 2019 23:01:55 +0800 Subject: [PATCH] filesetup: don't call create_work_dirs() for ioengine with FIO_DISKLESSIO Don't create work dirs if ioengine has flag FIO_DISKLESSIO. So that filename can contains '/'. It is useful when ioengine is based on network and filename is used as url. Also call create_work_dirs() just when setting up a file. So that ioengine is loaded and ioengine flags are available. Signed-off-by: Kyle Zhang --- filesetup.c | 85 +++++++++++++++++++++++++++-------------------------- 1 file changed, 44 insertions(+), 41 deletions(-) diff --git a/filesetup.c b/filesetup.c index 47c889a0..24e6fb07 100644 --- a/filesetup.c +++ b/filesetup.c @@ -890,6 +890,42 @@ uint64_t get_start_offset(struct thread_data *td, struct fio_file *f) return offset; } +static bool create_work_dirs(struct thread_data *td, const char *fname) +{ + char path[PATH_MAX]; + char *start, *end; + + if (td->o.directory) { + snprintf(path, PATH_MAX, "%s%c%s", td->o.directory, + FIO_OS_PATH_SEPARATOR, fname); + start = strstr(path, fname); + } else { + snprintf(path, PATH_MAX, "%s", fname); + start = path; + } + + end = start; + while ((end = strchr(end, FIO_OS_PATH_SEPARATOR)) != NULL) { + if (end == start) + break; + *end = '\0'; + errno = 0; +#ifdef CONFIG_HAVE_MKDIR_TWO + if (mkdir(path, 0600) && errno != EEXIST) { +#else + if (mkdir(path) && errno != EEXIST) { +#endif + log_err("fio: failed to create dir (%s): %d\n", + start, errno); + return false; + } + *end = FIO_OS_PATH_SEPARATOR; + end++; + } + td->flags |= TD_F_DIRS_CREATED; + return true; +} + /* * Open the files and setup files sizes, creating files if necessary. */ @@ -908,6 +944,14 @@ int setup_files(struct thread_data *td) old_state = td_bump_runstate(td, TD_SETTING_UP); + for_each_file(td, f, i) { + if (!td_ioengine_flagged(td, FIO_DISKLESSIO) && + strchr(f->file_name, FIO_OS_PATH_SEPARATOR) && + !(td->flags & TD_F_DIRS_CREATED) && + !create_work_dirs(td, f->file_name)) + goto err_out; + } + /* * Find out physical size of files or devices for this thread, * before we determine I/O size and range of our targets. @@ -1517,42 +1561,6 @@ bool exists_and_not_regfile(const char *filename) return true; } -static bool create_work_dirs(struct thread_data *td, const char *fname) -{ - char path[PATH_MAX]; - char *start, *end; - - if (td->o.directory) { - snprintf(path, PATH_MAX, "%s%c%s", td->o.directory, - FIO_OS_PATH_SEPARATOR, fname); - start = strstr(path, fname); - } else { - snprintf(path, PATH_MAX, "%s", fname); - start = path; - } - - end = start; - while ((end = strchr(end, FIO_OS_PATH_SEPARATOR)) != NULL) { - if (end == start) - break; - *end = '\0'; - errno = 0; -#ifdef CONFIG_HAVE_MKDIR_TWO - if (mkdir(path, 0600) && errno != EEXIST) { -#else - if (mkdir(path) && errno != EEXIST) { -#endif - log_err("fio: failed to create dir (%s): %d\n", - start, errno); - return false; - } - *end = FIO_OS_PATH_SEPARATOR; - end++; - } - td->flags |= TD_F_DIRS_CREATED; - return true; -} - int add_file(struct thread_data *td, const char *fname, int numjob, int inc) { int cur_files = td->files_index; @@ -1568,11 +1576,6 @@ int add_file(struct thread_data *td, const char *fname, int numjob, int inc) sprintf(file_name + len, "%s", fname); - if (strchr(fname, FIO_OS_PATH_SEPARATOR) && - !(td->flags & TD_F_DIRS_CREATED) && - !create_work_dirs(td, fname)) - return 1; - /* clean cloned siblings using existing files */ if (numjob && is_already_allocated(file_name) && !exists_and_not_regfile(fname)) -- 2.25.1