X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=filesetup.c;h=c0403d2a801e863df927ed87a2a935161c7cb394;hp=20ef3f8ffc97ce238e39ba4f2ef21e46a188bf7a;hb=6977bcd0e4ee3faa7ffd8f208e4031bdf906ed88;hpb=ee56ad500f6692381e131cc37299d23fa910a24a diff --git a/filesetup.c b/filesetup.c index 20ef3f8f..c0403d2a 100644 --- a/filesetup.c +++ b/filesetup.c @@ -33,8 +33,8 @@ static int extend_file(struct thread_data *td, struct fio_file *f) if (td_write(td) && !td->o.overwrite) unlink_file = 1; - if ((unlink_file || new_layout) && (f->flags & FIO_FILE_EXISTS)) { - if (unlink(f->file_name) < 0) { + if (unlink_file || new_layout) { + if ((unlink(f->file_name) < 0) && (errno != ENOENT)) { td_verror(td, errno, "unlink"); return 1; } @@ -209,11 +209,16 @@ int file_invalidate_cache(struct thread_data *td, struct fio_file *f) return ret; } -void generic_close_file(struct thread_data fio_unused *td, struct fio_file *f) +int generic_close_file(struct thread_data fio_unused *td, struct fio_file *f) { + int ret = 0; + dprint(FD_FILE, "fd close %s\n", f->file_name); - close(f->fd); + if (close(f->fd) < 0) + ret = errno; + f->fd = -1; + return ret; } int generic_open_file(struct thread_data *td, struct fio_file *f) @@ -497,7 +502,7 @@ int init_random_map(struct thread_data *td) struct fio_file *f; unsigned int i; - if (td->o.norandommap) + if (td->o.norandommap || !td_random(td)) return 0; for_each_file(td, f, i) { @@ -520,6 +525,15 @@ void close_files(struct thread_data *td) struct fio_file *f; unsigned int i; + for_each_file(td, f, i) + td_io_close_file(td, f); +} + +void close_and_free_files(struct thread_data *td) +{ + struct fio_file *f; + unsigned int i; + dprint(FD_FILE, "close files\n"); for_each_file(td, f, i) { @@ -600,30 +614,33 @@ int add_file(struct thread_data *td, const char *fname) void get_file(struct fio_file *f) { - dprint(FD_FILE, "get file %s/%d\n", f->file_name, f->references); + dprint(FD_FILE, "get file %s, ref=%d\n", f->file_name, f->references); assert(f->flags & FIO_FILE_OPEN); f->references++; } -void put_file(struct thread_data *td, struct fio_file *f) +int put_file(struct thread_data *td, struct fio_file *f) { - dprint(FD_FILE, "get put %s/%d\n", f->file_name, f->references); + int ret = 0; + + dprint(FD_FILE, "put file %s, ref=%d\n", f->file_name, f->references); if (!(f->flags & FIO_FILE_OPEN)) - return; + return 0; assert(f->references); if (--f->references) - return; + return 0; if (should_fsync(td) && td->o.fsync_on_close) fsync(f->fd); if (td->io_ops->close_file) - td->io_ops->close_file(td, f); + ret = td->io_ops->close_file(td, f); td->nr_open_files--; f->flags &= ~FIO_FILE_OPEN; + return ret; } static int recurse_dir(struct thread_data *td, const char *dirname)