X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=filesetup.c;h=a51abc3cb48f9865a336a67cb24106716310aba1;hp=3bd8633873cb7c40cb99c284a2d3ad7fdebadf4f;hb=e8be395bcbc7428eea88d0db0d2144b8596d3511;hpb=96d32d518a0743a6c050057bc1562e4883e51c5d diff --git a/filesetup.c b/filesetup.c index 3bd86338..a51abc3c 100644 --- a/filesetup.c +++ b/filesetup.c @@ -97,13 +97,36 @@ err: return 1; } +static unsigned long long set_rand_file_size(struct thread_data *td, + unsigned long long total_size) +{ + unsigned long long upper = total_size; + unsigned long long ret; + long r; + + if (upper > td->file_size_high) + upper = td->file_size_high; + else if (upper < td->file_size_low) + return 0; + else if (!upper) + return 0; + + r = os_random_long(&td->file_size_state); + ret = td->file_size_low + (unsigned long long) ((double) upper * (r / (RAND_MAX + 1.0))); + ret -= (ret % td->rw_min_bs); + if (ret > upper) + ret = upper; + return ret; +} + static int create_files(struct thread_data *td) { struct fio_file *f; int err, need_create, can_extend; - unsigned long long total_file_size; - unsigned int i; + unsigned long long total_file_size, local_file_size, create_size; + unsigned int i, new_files; + new_files = 0; total_file_size = td->total_file_size; for_each_file(td, f, i) { unsigned long long s; @@ -119,7 +142,8 @@ static int create_files(struct thread_data *td) s = total_file_size; total_file_size -= s; - } + } else + new_files++; } /* @@ -129,17 +153,43 @@ static int create_files(struct thread_data *td) if (can_extend) return 0; + local_file_size = total_file_size; + if (!local_file_size) + local_file_size = -1; + + total_file_size = 0; need_create = 0; + create_size = 0; for_each_file(td, f, i) { int file_there; if (f->filetype != FIO_TYPE_FILE) continue; - if (f->flags & FIO_FILE_EXISTS) + if (f->flags & FIO_FILE_EXISTS) { + total_file_size += f->file_size; continue; + } - f->file_size = total_file_size / td->nr_normal_files; + if (!td->file_size_low) + f->file_size = total_file_size / new_files; + else { + /* + * If we don't have enough space left for a file + * of the minimum size, bail. + */ + if (local_file_size < td->file_size_low) { + log_info("fio: limited to %d files\n", i); + new_files -= (td->nr_files - i); + td->nr_files = i; + break; + } + f->file_size = set_rand_file_size(td, local_file_size); + local_file_size -= f->file_size; + } + + total_file_size += f->file_size; + create_size += f->file_size; file_there = !file_ok(td, f); if (file_there && td_write(td) && !td->overwrite) { @@ -153,17 +203,15 @@ static int create_files(struct thread_data *td) if (!need_create) return 0; - if (!td->total_file_size) { + if (!td->total_file_size && !total_file_size) { log_err("Need size for create\n"); td_verror(td, EINVAL, "file_size"); return 1; } temp_stall_ts = 1; - fprintf(f_out, "%s: Laying out IO file(s) (%u x %LuMiB == %LuMiB)\n", - td->name, td->nr_normal_files, - (td->total_file_size >> 20) / td->nr_normal_files, - td->total_file_size >> 20); + log_info("%s: Laying out IO file(s) (%u files / %LuMiB)\n", + td->name, new_files, create_size >> 20); err = 0; for_each_file(td, f, i) { @@ -433,7 +481,6 @@ void close_files(struct thread_data *td) } td->filename = NULL; - free(td->files); td->files = NULL; td->nr_files = 0; } @@ -519,9 +566,8 @@ static int recurse_dir(struct thread_data *td, const char *dirname) char full_path[PATH_MAX]; struct stat sb; - /* - * check d_ino here? - */ + if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, "..")) + continue; sprintf(full_path, "%s/%s", dirname, dir->d_name); @@ -538,9 +584,6 @@ static int recurse_dir(struct thread_data *td, const char *dirname) continue; } - if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, "..")) - continue; - if ((ret = recurse_dir(td, full_path)) != 0) break; }