X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=filesetup.c;h=464c0f2018f51672f88cdd2bd3ced44c8bceda4e;hp=98479fd04fbebf9b2d24834e9e793f75c5447650;hb=b9fbcf2104ab79127825e0c23ba0a147ec076087;hpb=3baddf2450d811be658fb47ef883ee84478dc352 diff --git a/filesetup.c b/filesetup.c index 98479fd0..464c0f20 100644 --- a/filesetup.c +++ b/filesetup.c @@ -33,12 +33,14 @@ static int extend_file(struct thread_data *td, struct fio_file *f) * does that for operations involving reads, or for writes * where overwrite is set */ - if (td_read(td) || (td_write(td) && td->o.overwrite)) + if (td_read(td) || (td_write(td) && td->o.overwrite) || + (td_write(td) && td->io_ops->flags & FIO_NOEXTEND)) new_layout = 1; if (td_write(td) && !td->o.overwrite) unlink_file = 1; if (unlink_file || new_layout) { + dprint(FD_FILE, "layout unlink %s\n", f->file_name); if ((unlink(f->file_name) < 0) && (errno != ENOENT)) { td_verror(td, errno, "unlink"); return 1; @@ -66,12 +68,13 @@ static int extend_file(struct thread_data *td, struct fio_file *f) goto err; } +#ifdef FIO_HAVE_FALLOCATE dprint(FD_FILE, "fallocate file %s, size %llu\n", f->file_name, f->real_file_size); - if (posix_fallocate(f->fd, 0, f->real_file_size) < 0) { - td_verror(td, errno, "posix_fallocate"); - goto err; - } + r = posix_fallocate(f->fd, 0, f->real_file_size); + if (r < 0) + log_err("fio: posix_fallocate fails: %s\n", strerror(-r)); +#endif b = malloc(td->o.max_bs[DDIR_WRITE]); memset(b, 0, td->o.max_bs[DDIR_WRITE]); @@ -97,9 +100,10 @@ static int extend_file(struct thread_data *td, struct fio_file *f) } } - if (td->terminate) + if (td->terminate) { + dprint(FD_FILE, "terminate unlink %s\n", f->file_name); unlink(f->file_name); - else if (td->o.create_fsync) { + } else if (td->o.create_fsync) { if (fsync(f->fd) < 0) { td_verror(td, errno, "fsync"); goto err; @@ -117,12 +121,12 @@ err: static unsigned long long get_rand_file_size(struct thread_data *td) { - unsigned long long ret, size_d; + unsigned long long ret, sized; long r; r = os_random_long(&td->file_size_state); - size_d = td->o.file_size_high - td->o.file_size_low; - ret = (unsigned long long) ((double) size_d * (r / (RAND_MAX + 1.0))); + sized = td->o.file_size_high - td->o.file_size_low; + ret = (unsigned long long) ((double) sized * (r / (OS_RAND_MAX + 1.0))); ret += td->o.file_size_low; ret -= (ret % td->o.rw_min_bs); return ret; @@ -231,6 +235,9 @@ static int __file_invalidate_cache(struct thread_data *td, struct fio_file *f, int file_invalidate_cache(struct thread_data *td, struct fio_file *f) { + if (!(f->flags & FIO_FILE_OPEN)) + return 0; + return __file_invalidate_cache(td, f, -1, -1); } @@ -301,7 +308,7 @@ int generic_open_file(struct thread_data *td, struct fio_file *f) if (td->o.sync_io) flags |= O_SYNC; if (f->filetype != FIO_TYPE_FILE) - flags |= O_NOATIME; + flags |= FIO_O_NOATIME; open_again: if (td_write(td)) { @@ -331,8 +338,8 @@ open_again: char buf[FIO_VERROR_SIZE]; int __e = errno; - if (errno == EPERM && (flags & O_NOATIME)) { - flags &= ~O_NOATIME; + if (errno == EPERM && (flags & FIO_O_NOATIME)) { + flags &= ~FIO_O_NOATIME; goto open_again; } @@ -536,8 +543,10 @@ int setup_files(struct thread_data *td) */ if (need_extend) { temp_stall_ts = 1; - log_info("%s: Laying out IO file(s) (%u file(s) / %LuMiB)\n", - td->o.name, need_extend, extend_size >> 20); + if (!terse_output) + log_info("%s: Laying out IO file(s) (%u file(s) /" + " %LuMiB)\n", td->o.name, need_extend, + extend_size >> 20); for_each_file(td, f, i) { unsigned long long old_len, extend_len; @@ -596,14 +605,22 @@ int init_random_map(struct thread_data *td) (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) { + f->file_map = smalloc(num_maps * sizeof(int)); + if (f->file_map) { + f->num_maps = num_maps; + continue; + } + if (!td->o.softrandommap) { log_err("fio: failed allocating random map. If running" " a large number of jobs, try the 'norandommap'" - " option\n"); + " option or set 'softrandommap'. Or give" + " a larger --alloc-size to fio.\n"); return 1; } - f->num_maps = num_maps; + + log_info("fio: file %s failed allocating random map. Running " + "job without.\n", f->file_name); + f->num_maps = 0; } return 0; @@ -626,10 +643,13 @@ void close_and_free_files(struct thread_data *td) dprint(FD_FILE, "close files\n"); for_each_file(td, f, i) { - if (td->o.unlink && f->filetype == FIO_TYPE_FILE) + if (td->o.unlink && f->filetype == FIO_TYPE_FILE) { + dprint(FD_FILE, "free unlink %s\n", f->file_name); unlink(f->file_name); + } td_io_close_file(td, f); + remove_file_hash(f); sfree(f->file_name); f->file_name = NULL; @@ -677,6 +697,11 @@ int add_file(struct thread_data *td, const char *fname) dprint(FD_FILE, "add file %s\n", fname); f = smalloc(sizeof(*f)); + if (!f) { + log_err("fio: smalloc OOM\n"); + assert(0); + } + f->fd = -1; dprint(FD_FILE, "resize file array to %d files\n", cur_files + 1); @@ -695,7 +720,11 @@ int add_file(struct thread_data *td, const char *fname) sprintf(file_name + len, "%s", fname); f->file_name = smalloc_strdup(file_name); - + if (!f->file_name) { + log_err("fio: smalloc OOM\n"); + assert(0); + } + get_file_type(f); switch (td->o.file_lock_mode) { @@ -749,7 +778,7 @@ int put_file(struct thread_data *td, struct fio_file *f) ret = td->io_ops->close_file(td, f); if (!ret) - ret = !f_ret; + ret = f_ret; td->nr_open_files--; f->flags &= ~FIO_FILE_OPEN; @@ -888,9 +917,20 @@ void dup_files(struct thread_data *td, struct thread_data *org) struct fio_file *__f; __f = smalloc(sizeof(*__f)); - - if (f->file_name) + if (!__f) { + log_err("fio: smalloc OOM\n"); + assert(0); + } + + if (f->file_name) { __f->file_name = smalloc_strdup(f->file_name); + if (!__f->file_name) { + log_err("fio: smalloc OOM\n"); + assert(0); + } + + __f->filetype = f->filetype; + } td->files[i] = __f; }