Add create_on_open option

Signed-off-by: Jens Axboe <jens.axboe@oracle.com>

 Please enter the commit message for your changes. Lines starting
diff --git a/HOWTO b/HOWTO
index b8a7dd7..2cfe369 100644
--- a/HOWTO
+++ b/HOWTO
@@ -693,6 +693,9 @@
 create_fsync=bool	fsync the data file after creation. This is the
 			default.
 
+create_on_open=bool	Don't pre-setup the files for IO, just create open()
+			when it's time to do IO to that file.
+
 unlink=bool	Unlink the job files when done. Not the default, as repeated
 		runs of that job would then waste time recreating the file
 		set again and again.
diff --git a/filesetup.c b/filesetup.c
index cfcfa9a..088b77c 100644
--- a/filesetup.c
+++ b/filesetup.c
@@ -314,6 +314,8 @@
 		flags |= O_SYNC;
 	if (f->filetype != FIO_TYPE_FILE)
 		flags |= FIO_O_NOATIME;
+	if (td->o.create_on_open)
+		flags |= O_CREAT;
 
 open_again:
 	if (td_write(td)) {
@@ -534,8 +536,11 @@
 		if (f->filetype == FIO_TYPE_FILE &&
 		    (f->io_size + f->file_offset) > f->real_file_size &&
 		    !(td->io_ops->flags & FIO_DISKLESSIO)) {
-			need_extend++;
-			extend_size += (f->io_size + f->file_offset);
+			if (!td->o.create_on_open) {
+				need_extend++;
+				extend_size += (f->io_size + f->file_offset);
+			} else
+				f->real_file_size = f->io_size + f->file_offset;
 			f->flags |= FIO_FILE_EXTEND;
 		}
 	}
diff --git a/fio.h b/fio.h
index 11338eb..dd09cee 100644
--- a/fio.h
+++ b/fio.h
@@ -443,6 +443,7 @@
 	unsigned int invalidate_cache;
 	unsigned int create_serialize;
 	unsigned int create_fsync;
+	unsigned int create_on_open;
 	unsigned int end_fsync;
 	unsigned int sync_io;
 	unsigned int verify;
diff --git a/options.c b/options.c
index cec7bb7..73815bb 100644
--- a/options.c
+++ b/options.c
@@ -1290,6 +1290,13 @@
 		.def	= "1",
 	},
 	{
+		.name	= "create_on_open",
+		.type	= FIO_OPT_BOOL,
+		.off1	= td_var_offset(create_on_open),
+		.help	= "Create files when they are opened for IO",
+		.def	= "0",
+	},
+	{
 		.name	= "cpuload",
 		.type	= FIO_OPT_INT,
 		.off1	= td_var_offset(cpuload),