X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=filesetup.c;h=10fc4150804b8fadce1a4af7cb856828796ca1f8;hb=00b2e311b25a2a53f5b07e6796fcd36aa6023035;hp=c026048ff7f3fbb951cf7b8f34dfe4c6738e5bb6;hpb=03a32636475b2efeb9ac3694c36fbe45b187d32a;p=fio.git diff --git a/filesetup.c b/filesetup.c index c026048f..10fc4150 100644 --- a/filesetup.c +++ b/filesetup.c @@ -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]); }