X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=filesetup.c;h=4bfa470d0e285539e7de0d441c4d63aedd0eeb9c;hb=0cae66f6df9eb63d4896c29d7998d4aaf964fea5;hp=f0e3b34fd8ae1e90424c04a37ec1cba4b71e4a38;hpb=bcbfeefa7bce8383cf85fe59ced91f54821dfbd2;p=fio.git diff --git a/filesetup.c b/filesetup.c index f0e3b34f..4bfa470d 100644 --- a/filesetup.c +++ b/filesetup.c @@ -209,8 +209,7 @@ static int pre_read_file(struct thread_data *td, struct fio_file *f) did_open = 1; } - old_runstate = td->runstate; - td_set_runstate(td, TD_PRE_READING); + old_runstate = td_bump_runstate(td, TD_PRE_READING); bs = td->o.max_bs[DDIR_READ]; b = malloc(bs); @@ -234,7 +233,7 @@ static int pre_read_file(struct thread_data *td, struct fio_file *f) } } - td_set_runstate(td, old_runstate); + td_restore_runstate(td, old_runstate); if (did_open) td->io_ops->close_file(td, f); @@ -745,8 +744,7 @@ int setup_files(struct thread_data *td) dprint(FD_FILE, "setup files\n"); - old_state = td->runstate; - td_set_runstate(td, TD_SETTING_UP); + old_state = td_bump_runstate(td, TD_SETTING_UP); if (o->read_iolog_file) goto done; @@ -925,12 +923,12 @@ done: if (o->create_only) td->done = 1; - td_set_runstate(td, old_state); + td_restore_runstate(td, old_state); return 0; err_offset: log_err("%s: you need to specify valid offset=\n", o->name); err_out: - td_set_runstate(td, old_state); + td_restore_runstate(td, old_state); return 1; } @@ -980,11 +978,12 @@ static int init_rand_distribution(struct thread_data *td) if (td->o.random_distribution == FIO_RAND_DIST_RANDOM) return 0; - state = td->runstate; - td_set_runstate(td, TD_SETTING_UP); + state = td_bump_runstate(td, TD_SETTING_UP); + for_each_file(td, f, i) __init_rand_distribution(td, f); - td_set_runstate(td, state); + + td_restore_runstate(td, state); return 1; } @@ -1010,7 +1009,7 @@ int init_random_map(struct thread_data *td) seed = td->rand_seeds[FIO_RAND_BLOCK_OFF]; - if (!lfsr_init(&f->lfsr, blocks, seed, seed & 0xF)) + if (!lfsr_init(&f->lfsr, blocks, seed, 0)) continue; } else if (!td->o.norandommap) { f->io_axmap = axmap_new(blocks); @@ -1145,7 +1144,7 @@ static void free_already_allocated() { } } -int add_file(struct thread_data *td, const char *fname, int numjob) +int add_file(struct thread_data *td, const char *fname, int numjob, int inc) { int cur_files = td->files_index; char file_name[PATH_MAX]; @@ -1230,6 +1229,16 @@ int add_file(struct thread_data *td, const char *fname, int numjob) set_already_allocated(file_name); + /* + * For adding files after the fact - if openfiles= isn't + * given as an option, ensure we allow at least one file open + */ + if (!td->o.open_files) + td->o.open_files = 1; + + if (inc) + td->o.nr_files++; + dprint(FD_FILE, "file %p \"%s\" added at %d\n", f, f->file_name, cur_files); @@ -1246,7 +1255,7 @@ int add_file_exclusive(struct thread_data *td, const char *fname) return i; } - return add_file(td, fname, 0); + return add_file(td, fname, 0, 1); } void get_file(struct fio_file *f) @@ -1355,8 +1364,7 @@ static int recurse_dir(struct thread_data *td, const char *dirname) } if (S_ISREG(sb.st_mode)) { - add_file(td, full_path, 0); - td->o.nr_files++; + add_file(td, full_path, 0, 1); continue; } if (!S_ISDIR(sb.st_mode))