Fixup posix_fallocate() usage
[fio.git] / filesetup.c
index 98479fd04fbebf9b2d24834e9e793f75c5447650..60eaeb057a7e0a144ee27fccd1b1f2da49fbe0ac 100644 (file)
@@ -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;
@@ -68,10 +70,9 @@ static int extend_file(struct thread_data *td, struct fio_file *f)
 
        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)
+               td_verror(td, -r, "posix_fallocate");
 
        b = malloc(td->o.max_bs[DDIR_WRITE]);
        memset(b, 0, td->o.max_bs[DDIR_WRITE]);
@@ -97,9 +98,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;
@@ -231,6 +233,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 +306,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 +336,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;
                }
 
@@ -597,13 +602,21 @@ int init_random_map(struct thread_data *td)
                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) {
+               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,8 +639,10 @@ 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);
 
@@ -749,7 +764,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;