Update close file handler to return potential error
[fio.git] / filesetup.c
index 20ef3f8ffc97ce238e39ba4f2ef21e46a188bf7a..c0403d2a801e863df927ed87a2a935161c7cb394 100644 (file)
@@ -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)