Fio 3.17
[fio.git] / filesetup.c
index b8d1d83899cea588a40af2ed126adf150f26fa4c..ed3646a4bbe75e598e556970084bcb328c30fa3e 100644 (file)
@@ -95,6 +95,18 @@ static void fallocate_file(struct thread_data *td, struct fio_file *f)
                break;
                }
 #endif /* CONFIG_LINUX_FALLOCATE */
+       case FIO_FALLOCATE_TRUNCATE: {
+               int r;
+
+               dprint(FD_FILE, "ftruncate file %s size %llu\n",
+                               f->file_name,
+                               (unsigned long long) f->real_file_size);
+               r = ftruncate(f->fd, f->real_file_size);
+               if (r != 0)
+                       td_verror(td, errno, "ftruncate");
+
+               break;
+       }
        default:
                log_err("fio: unknown fallocate mode: %d\n", td->o.fallocate_mode);
                assert(0);
@@ -1047,7 +1059,7 @@ int setup_files(struct thread_data *td)
                         * doesn't divide nicely with the min blocksize,
                         * make the first files bigger.
                         */
-                       f->io_size = fs - f->file_offset;
+                       f->io_size = fs;
                        if (nr_fs_extra) {
                                nr_fs_extra--;
                                f->io_size += bs;
@@ -1104,13 +1116,15 @@ int setup_files(struct thread_data *td)
                }
 
                if (f->filetype == FIO_TYPE_FILE &&
-                   (f->io_size + f->file_offset) > f->real_file_size &&
-                   !td_ioengine_flagged(td, FIO_DISKLESSIO)) {
-                       if (!o->create_on_open) {
+                   (f->io_size + f->file_offset) > f->real_file_size) {
+                       if (!td_ioengine_flagged(td, FIO_DISKLESSIO) &&
+                           !o->create_on_open) {
                                need_extend++;
                                extend_size += (f->io_size + f->file_offset);
                                fio_file_set_extend(f);
-                       } else
+                       } else if (!td_ioengine_flagged(td, FIO_DISKLESSIO) ||
+                                  (td_ioengine_flagged(td, FIO_DISKLESSIO) &&
+                                   td_ioengine_flagged(td, FIO_FAKEIO)))
                                f->real_file_size = f->io_size + f->file_offset;
                }
        }
@@ -1273,7 +1287,9 @@ static bool init_rand_distribution(struct thread_data *td)
        unsigned int i;
        int state;
 
-       if (td->o.random_distribution == FIO_RAND_DIST_RANDOM)
+       if (td->o.random_distribution == FIO_RAND_DIST_RANDOM ||
+           td->o.random_distribution == FIO_RAND_DIST_ZONED ||
+           td->o.random_distribution == FIO_RAND_DIST_ZONED_ABS)
                return false;
 
        state = td_bump_runstate(td, TD_SETTING_UP);
@@ -1336,6 +1352,9 @@ bool init_random_map(struct thread_data *td)
        for_each_file(td, f, i) {
                uint64_t fsize = min(f->real_file_size, f->io_size);
 
+               if (td->o.zone_mode == ZONE_MODE_STRIDED)
+                       fsize = td->o.zone_range;
+
                blocks = fsize / (unsigned long long) td->o.rw_min_bs;
 
                if (check_rand_gen_limits(td, f, blocks))
@@ -1349,6 +1368,9 @@ bool init_random_map(struct thread_data *td)
                        if (!lfsr_init(&f->lfsr, blocks, seed, 0)) {
                                fio_file_set_lfsr(f);
                                continue;
+                       } else {
+                               log_err("fio: failed initializing LFSR\n");
+                               return false;
                        }
                } else if (!td->o.norandommap) {
                        f->io_axmap = axmap_new(blocks);