From 96d32d518a0743a6c050057bc1562e4883e51c5d Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Wed, 14 Mar 2007 09:16:09 +0100 Subject: [PATCH] Better handling of file creation vs existing files Signed-off-by: Jens Axboe --- filesetup.c | 39 ++++++++++++++++++++++++++++++++++----- fio.h | 1 + 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/filesetup.c b/filesetup.c index 678e8365..3bd86338 100644 --- a/filesetup.c +++ b/filesetup.c @@ -101,14 +101,25 @@ 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; + total_file_size = td->total_file_size; for_each_file(td, f, i) { + unsigned long long s; + + f->file_offset = td->start_offset; + if (f->filetype != FIO_TYPE_FILE) continue; - f->file_size = td->total_file_size / td->nr_normal_files; - f->file_offset = td->start_offset; + if (f->flags & FIO_FILE_EXISTS) { + s = f->file_size; + if (s > total_file_size) + s = total_file_size; + + total_file_size -= s; + } } /* @@ -124,6 +135,10 @@ static int create_files(struct thread_data *td) if (f->filetype != FIO_TYPE_FILE) continue; + if (f->flags & FIO_FILE_EXISTS) + continue; + + f->file_size = total_file_size / td->nr_normal_files; file_there = !file_ok(td, f); @@ -217,9 +232,10 @@ static int get_file_size(struct thread_data *td, struct fio_file *f) { int ret = 0; - if (f->filetype == FIO_TYPE_FILE) - ret = file_size(td, f); - else if (f->filetype == FIO_TYPE_BD) + if (f->filetype == FIO_TYPE_FILE) { + if (!(f->flags & FIO_FILE_EXISTS)) + ret = file_size(td, f); + } else if (f->filetype == FIO_TYPE_BD) ret = bdev_size(td, f); else f->real_file_size = -1; @@ -429,10 +445,19 @@ static void get_file_type(struct fio_file *f) f->filetype = FIO_TYPE_FILE; if (!lstat(f->file_name, &sb)) { + f->flags |= FIO_FILE_EXISTS; + if (S_ISBLK(sb.st_mode)) f->filetype = FIO_TYPE_BD; else if (S_ISCHR(sb.st_mode)) f->filetype = FIO_TYPE_CHAR; + else { + /* + * might as well do this here, and save a stat later on + */ + f->real_file_size = sb.st_size; + f->file_size = f->real_file_size; + } } } @@ -494,6 +519,10 @@ static int recurse_dir(struct thread_data *td, const char *dirname) char full_path[PATH_MAX]; struct stat sb; + /* + * check d_ino here? + */ + sprintf(full_path, "%s/%s", dirname, dir->d_name); if (lstat(full_path, &sb) == -1) { diff --git a/fio.h b/fio.h index 51734641..5098ff8f 100644 --- a/fio.h +++ b/fio.h @@ -222,6 +222,7 @@ enum fio_file_flags { FIO_FILE_OPEN = 1 << 0, /* file is open */ FIO_FILE_UNLINK = 1 << 1, /* unlink on close */ FIO_FILE_CLOSING = 1 << 2, /* file being closed */ + FIO_FILE_EXISTS = 1 << 3, /* no need to create */ }; /* -- 2.25.1