Add 'opendir' option

This option adds all files from a directory and downward in the
filesystem hierarchy.

Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
diff --git a/init.c b/init.c
index cf66ec0..ee0f36f 100644
--- a/init.c
+++ b/init.c
@@ -33,6 +33,7 @@
 static int str_fst_cb(void *, const char *);
 static int str_filename_cb(void *, const char *);
 static int str_directory_cb(void *, const char *);
+static int str_opendir_cb(void *, const char *);
 
 #define __stringify_1(x)	#x
 #define __stringify(x)		__stringify_1(x)
@@ -68,6 +69,13 @@
 		.help	= "File(s) to use for the workload",
 	},
 	{
+		.name	= "opendir",
+		.type	= FIO_OPT_STR_STORE,
+		.off1	= td_var_offset(opendir),
+		.cb	= str_opendir_cb,
+		.help	= "Recursively add files from this directory and down",
+	},
+	{
 		.name	= "rw",
 		.type	= FIO_OPT_STR,
 		.off1	= td_var_offset(td_ddir),
@@ -759,9 +767,7 @@
 	if (td->iodepth_batch > td->iodepth || !td->iodepth_batch)
 		td->iodepth_batch = td->iodepth;
 
-	if (!td->nr_files)
-		td->nr_files = td->files_index;
-	else if (td->nr_files > td->files_index)
+	if (td->nr_files > td->files_index)
 		td->nr_files = td->files_index;
 
 	if (td->open_files > td->nr_files || !td->open_files)
@@ -839,7 +845,7 @@
 	if (td->odirect)
 		td->io_ops->flags |= FIO_RAWIO;
 
-	if (!td->filename) {
+	if (!td->filename && !td->files_index) {
 		td->filename = strdup(jobname);
 
 		if (td->nr_files == 1)
@@ -1121,10 +1127,14 @@
 	strip_blank_front(&str);
 	strip_blank_end(str);
 
+	if (!td->files_index)
+		td->nr_files = 0;
+
 	while ((fname = strsep(&str, ":")) != NULL) {
 		if (!strlen(fname))
 			break;
 		add_file(td, fname);
+		td->nr_files++;
 	}
 
 	free(p);
@@ -1149,6 +1159,16 @@
 	return 0;
 }
 
+static int str_opendir_cb(void *data, const char fio_unused *str)
+{
+	struct thread_data *td = data;
+
+	if (!td->files_index)
+		td->nr_files = 0;
+
+	return add_dir_files(td, td->opendir);
+}
+
 /*
  * This is our [ini] type file parser.
  */