diff --git a/cconv.c b/cconv.c index 4a40ed0d647b..913313b68d47 100644 --- a/cconv.c +++ b/cconv.c @@ -69,6 +69,7 @@ void convert_thread_options_to_cpu(struct thread_options *o, string_to_cpu(&o->profile, top->profile); string_to_cpu(&o->cgroup, top->cgroup); + o->allow_create = le32_to_cpu(top->allow_create); o->td_ddir = le32_to_cpu(top->td_ddir); o->rw_seq = le32_to_cpu(top->rw_seq); o->kb_base = le32_to_cpu(top->kb_base); @@ -278,6 +279,7 @@ void convert_thread_options_to_net(struct thread_options_pack *top, string_to_net(top->profile, o->profile); string_to_net(top->cgroup, o->cgroup); + top->allow_create = cpu_to_le32(o->allow_create); top->td_ddir = cpu_to_le32(o->td_ddir); top->rw_seq = cpu_to_le32(o->rw_seq); top->kb_base = cpu_to_le32(o->kb_base); diff --git a/filesetup.c b/filesetup.c index 43146ba7671f..5b0c82208199 100644 --- a/filesetup.c +++ b/filesetup.c @@ -65,7 +65,9 @@ static int extend_file(struct thread_data *td, struct fio_file *f) } } - flags = O_WRONLY | O_CREAT; + flags = O_WRONLY; + if (td->o.allow_create) + flags |= O_CREAT; if (new_layout) flags |= O_TRUNC; @@ -557,7 +559,7 @@ int generic_open_file(struct thread_data *td, struct fio_file *f) } if (td->o.sync_io) flags |= O_SYNC; - if (td->o.create_on_open) + if (td->o.create_on_open && td->o.allow_create) flags |= O_CREAT; skip_flags: if (f->filetype != FIO_TYPE_FILE) @@ -568,7 +570,7 @@ open_again: if (!read_only) flags |= O_RDWR; - if (f->filetype == FIO_TYPE_FILE) + if (f->filetype == FIO_TYPE_FILE && td->o.allow_create) flags |= O_CREAT; if (is_std) diff --git a/options.c b/options.c index 918de8e8e34b..b6bf47264880 100644 --- a/options.c +++ b/options.c @@ -1359,6 +1359,15 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .group = FIO_OPT_G_FILENAME, }, { + .name = "allow_file_create", + .type = FIO_OPT_BOOL, + .off1 = td_var_offset(allow_create), + .help = "Permit fio to create files, if they don't exist", + .def = "1", + .category = FIO_OPT_C_FILE, + .group = FIO_OPT_G_FILENAME, + }, + { .name = "lockfile", .lname = "Lockfile", .type = FIO_OPT_STR, diff --git a/thread_options.h b/thread_options.h index a45d7b79b7ef..dd576643b31c 100644 --- a/thread_options.h +++ b/thread_options.h @@ -41,6 +41,7 @@ struct thread_options { char *ioengine; char *mmapfile; enum td_ddir td_ddir; + unsigned int allow_create; unsigned int rw_seq; unsigned int kb_base; unsigned int unit_base; @@ -271,6 +272,7 @@ struct thread_options_pack { uint8_t opendir[FIO_TOP_STR_MAX]; uint8_t ioengine[FIO_TOP_STR_MAX]; uint8_t mmapfile[FIO_TOP_STR_MAX]; + uint32_t allow_create; uint32_t td_ddir; uint32_t rw_seq; uint32_t kb_base;