X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=filesetup.c;h=e8472769d614bd1cabd9ea70cc3c1618fd616a5d;hb=691c8fb014da9dd82e999a90b5511423f4eee188;hp=f8e4d77cff3a2e935b509057f509a9cc628d5daf;hpb=98e1ac4e1a2c7386a1064277f7e67c4736fb6e65;p=fio.git diff --git a/filesetup.c b/filesetup.c index f8e4d77c..e8472769 100644 --- a/filesetup.c +++ b/filesetup.c @@ -116,11 +116,13 @@ err: static unsigned long long get_rand_file_size(struct thread_data *td) { - unsigned long long ret; + unsigned long long ret, size_d; long r; r = os_random_long(&td->file_size_state); - ret = td->o.file_size_low + (unsigned long long) ((double) (td->o.file_size_high - td->o.file_size_low) * (r / (RAND_MAX + 1.0))); + size_d = td->o.file_size_high - td->o.file_size_low; + ret = (unsigned long long) ((double) size_d * (r / (RAND_MAX + 1.0))); + ret += td->o.file_size_low; ret -= (ret % td->o.rw_min_bs); return ret; } @@ -171,7 +173,8 @@ static int get_file_size(struct thread_data *td, struct fio_file *f) return ret; if (f->file_offset > f->real_file_size) { - log_err("%s: offset extends end (%Lu > %Lu)\n", td->o.name, f->file_offset, f->real_file_size); + log_err("%s: offset extends end (%Lu > %Lu)\n", td->o.name, + f->file_offset, f->real_file_size); return 1; } @@ -193,13 +196,15 @@ int file_invalidate_cache(struct thread_data *td, struct fio_file *f) */ if (f->mmap) ret = madvise(f->mmap, f->io_size, MADV_DONTNEED); - else if (f->filetype == FIO_TYPE_FILE) - ret = fadvise(f->fd, f->file_offset, f->io_size, POSIX_FADV_DONTNEED); - else if (f->filetype == FIO_TYPE_BD) { + else if (f->filetype == FIO_TYPE_FILE) { + ret = fadvise(f->fd, f->file_offset, f->io_size, + POSIX_FADV_DONTNEED); + } else if (f->filetype == FIO_TYPE_BD) { ret = blockdev_invalidate_cache(f->fd); if (ret < 0 && errno == EACCES && geteuid()) { if (!root_warn) { - log_err("fio: only root may flush block devices. Cache flush bypassed!\n"); + log_err("fio: only root may flush block " + "devices. Cache flush bypassed!\n"); root_warn = 1; } ret = 0; @@ -245,15 +250,13 @@ static int file_lookup_open(struct fio_file *f, int flags) f->lock_owner = __f->lock_owner; f->lock_batch = __f->lock_batch; f->lock_ddir = __f->lock_ddir; - f->fd = dup(__f->fd); - f->references++; from_hash = 1; } else { dprint(FD_FILE, "file not found in hash %s\n", f->file_name); - f->fd = open(f->file_name, flags, 0600); from_hash = 0; } + f->fd = open(f->file_name, flags, 0600); return from_hash; } @@ -288,9 +291,8 @@ int generic_open_file(struct thread_data *td, struct fio_file *f) open_again: if (td_write(td)) { - assert(!read_only); - - flags |= O_RDWR; + if (!read_only) + flags |= O_RDWR; if (f->filetype == FIO_TYPE_FILE) flags |= O_CREAT; @@ -358,7 +360,8 @@ int open_files(struct thread_data *td) err = td_io_open_file(td, f); if (err) { if (td->error == EMFILE) { - log_err("fio: limited open files to: %d\n", td->nr_open_files); + log_err("fio: limited open files to: %d\n", + td->nr_open_files); td->o.open_files = td->nr_open_files; err = 0; clear_error(td); @@ -389,7 +392,8 @@ static int get_file_sizes(struct thread_data *td) int err = 0; for_each_file(td, f, i) { - dprint(FD_FILE, "get file size for %p/%d/%p\n", f, i, f->file_name); + dprint(FD_FILE, "get file size for %p/%d/%p\n", f, i, + f->file_name); if (td->io_ops->open_file(td, f)) { if (td->error != ENOENT) { @@ -421,6 +425,9 @@ int setup_files(struct thread_data *td) dprint(FD_FILE, "setup files\n"); + if (td->o.read_iolog_file) + return 0; + /* * if ioengine defines a setup() method, it's responsible for * opening the files and setting f->real_file_size to indicate @@ -477,16 +484,19 @@ int setup_files(struct thread_data *td) f->io_size = f->real_file_size - f->file_offset; } else if (f->real_file_size < td->o.file_size_low || f->real_file_size > td->o.file_size_high) { - if (f->file_offset > td->o.file_size_low) + if (f->file_offset > td->o.file_size_low) goto err_offset; /* * file size given. if it's fixed, use that. if it's a * range, generate a random size in-between. */ - if (td->o.file_size_low == td->o.file_size_high) - f->io_size = td->o.file_size_low - f->file_offset; - else - f->io_size = get_rand_file_size(td) - f->file_offset; + if (td->o.file_size_low == td->o.file_size_high) { + f->io_size = td->o.file_size_low + - f->file_offset; + } else { + f->io_size = get_rand_file_size(td) + - f->file_offset; + } } else f->io_size = f->real_file_size - f->file_offset; @@ -501,7 +511,7 @@ int setup_files(struct thread_data *td) need_extend++; extend_size += (f->io_size + f->file_offset); f->flags |= FIO_FILE_EXTEND; - } + } } if (!td->o.size || td->o.size > total_size) @@ -557,11 +567,15 @@ int init_random_map(struct thread_data *td) return 0; for_each_file(td, f, i) { - blocks = (f->real_file_size + td->o.rw_min_bs - 1) / (unsigned long long) td->o.rw_min_bs; - num_maps = (blocks + BLOCKS_PER_MAP-1)/ (unsigned long long) BLOCKS_PER_MAP; + blocks = (f->real_file_size + td->o.rw_min_bs - 1) / + (unsigned long long) td->o.rw_min_bs; + num_maps = (blocks + BLOCKS_PER_MAP - 1) / + (unsigned long long) BLOCKS_PER_MAP; f->file_map = smalloc(num_maps * sizeof(long)); if (!f->file_map) { - log_err("fio: failed allocating random map. If running a large number of jobs, try the 'norandommap' option\n"); + log_err("fio: failed allocating random map. If running" + " a large number of jobs, try the 'norandommap'" + " option\n"); return 1; } f->num_maps = num_maps; @@ -677,7 +691,8 @@ int add_file(struct thread_data *td, const char *fname) if (f->filetype == FIO_TYPE_FILE) td->nr_normal_files++; - dprint(FD_FILE, "file %p \"%s\" added at %d\n", f, f->file_name, cur_files); + dprint(FD_FILE, "file %p \"%s\" added at %d\n", f, f->file_name, + cur_files); return cur_files; } @@ -813,7 +828,8 @@ static int recurse_dir(struct thread_data *td, const char *dirname) if (!S_ISDIR(sb.st_mode)) continue; - if ((ret = recurse_dir(td, full_path)) != 0) + ret = recurse_dir(td, full_path); + if (ret) break; }