blktrace: support for non-512b sector sizes
[fio.git] / filesetup.c
index c026048ff7f3fbb951cf7b8f34dfe4c6738e5bb6..10fc4150804b8fadce1a4af7cb856828796ca1f8 100644 (file)
@@ -512,11 +512,6 @@ int generic_open_file(struct thread_data *td, struct fio_file *f)
 
        dprint(FD_FILE, "fd open %s\n", f->file_name);
 
-       if (td_trim(td) && f->filetype != FIO_TYPE_BD) {
-               log_err("fio: trim only applies to block device\n");
-               return 1;
-       }
-
        if (!strcmp(f->file_name, "-")) {
                if (td_rw(td)) {
                        log_err("fio: can't read/write to stdin/out\n");
@@ -885,6 +880,27 @@ int setup_files(struct thread_data *td)
                }
        }
 
+       if (td->o.block_error_hist) {
+               int len;
+
+               assert(td->o.nr_files == 1);    /* checked in fixup_options */
+               f = td->files[0];
+               len = f->io_size / td->o.bs[DDIR_TRIM];
+               if (len > MAX_NR_BLOCK_INFOS || len <= 0) {
+                       log_err("fio: cannot calculate block histogram with "
+                               "%d trim blocks, maximum %d\n",
+                               len, MAX_NR_BLOCK_INFOS);
+                       td_verror(td, EINVAL, "block_error_hist");
+                       goto err_out;
+               }
+
+               td->ts.nr_block_infos = len;
+               for (int i = 0; i < len; i++)
+                       td->ts.block_infos[i] =
+                               BLOCK_INFO(0, BLOCK_STATE_UNINIT);
+       } else
+               td->ts.nr_block_infos = 0;
+
        if (!o->size || (total_size && o->size > total_size))
                o->size = total_size;
 
@@ -998,8 +1014,10 @@ static int __init_rand_distribution(struct thread_data *td, struct fio_file *f)
 
        if (td->o.random_distribution == FIO_RAND_DIST_ZIPF)
                zipf_init(&f->zipf, nranges, td->o.zipf_theta.u.f, seed);
-       else
+       else if (td->o.random_distribution == FIO_RAND_DIST_PARETO)
                pareto_init(&f->zipf, nranges, td->o.pareto_h.u.f, seed);
+       else if (td->o.random_distribution == FIO_RAND_DIST_GAUSS)
+               gauss_init(&f->gauss, nranges, td->o.gauss_dev.u.f, seed);
 
        return 1;
 }
@@ -1044,12 +1062,16 @@ int init_random_map(struct thread_data *td)
 
                        seed = td->rand_seeds[FIO_RAND_BLOCK_OFF];
 
-                       if (!lfsr_init(&f->lfsr, blocks, seed, 0))
+                       if (!lfsr_init(&f->lfsr, blocks, seed, 0)) {
+                               fio_file_set_lfsr(f);
                                continue;
+                       }
                } else if (!td->o.norandommap) {
                        f->io_axmap = axmap_new(blocks);
-                       if (f->io_axmap)
+                       if (f->io_axmap) {
+                               fio_file_set_axmap(f);
                                continue;
+                       }
                } else if (td->o.norandommap)
                        continue;
 
@@ -1104,8 +1126,10 @@ void close_and_free_files(struct thread_data *td)
 
                sfree(f->file_name);
                f->file_name = NULL;
-               axmap_free(f->io_axmap);
-               f->io_axmap = NULL;
+               if (fio_file_axmap(f)) {
+                       axmap_free(f->io_axmap);
+                       f->io_axmap = NULL;
+               }
                sfree(f);
        }
 
@@ -1537,9 +1561,9 @@ void fio_file_reset(struct thread_data *td, struct fio_file *f)
                f->last_start[i] = -1ULL;
        }
 
-       if (f->io_axmap)
+       if (fio_file_axmap(f))
                axmap_reset(f->io_axmap);
-       if (td->o.random_generator == FIO_RAND_GEN_LFSR)
+       else if (fio_file_lfsr(f))
                lfsr_reset(&f->lfsr, td->rand_seeds[FIO_RAND_BLOCK_OFF]);
 }