Add sub-option support (sort-of) and convert libaio_userspace_reap

You should now use ioengine=libaio:userspace_reap instead of
the separate option.

Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
diff --git a/options.c b/options.c
index 6f7c41e..74c24d0 100644
--- a/options.c
+++ b/options.c
@@ -226,6 +226,21 @@
 	return 0;
 }
 
+#ifdef FIO_HAVE_LIBAIO
+static int str_libaio_cb(void *data, const char *str)
+{
+	struct thread_data *td = data;
+
+	if (!strcmp(str, "userspace_reap")) {
+		td->o.userspace_libaio_reap = 1;
+		return 0;
+	}
+
+	log_err("fio: bad libaio sub-option: %s\n", str);
+	return 1;
+}
+#endif
+
 static int str_mem_cb(void *data, const char *mem)
 {
 	struct thread_data *td = data;
@@ -961,6 +976,7 @@
 #ifdef FIO_HAVE_LIBAIO
 			  { .ival = "libaio",
 			    .help = "Linux native asynchronous IO",
+			    .cb   = str_libaio_cb,
 			  },
 #endif
 #ifdef FIO_HAVE_POSIXAIO
@@ -2069,15 +2085,6 @@
 		.off1	= td_var_offset(gid),
 		.help	= "Run job with this group ID",
 	},
-#ifdef FIO_HAVE_LIBAIO
-	{
-		.name	= "userspace_libaio_reap",
-		.type	= FIO_OPT_BOOL,
-		.off1	= td_var_offset(userspace_libaio_reap),
-		.help	= "When using the libaio engine with iodepth_batch_complete=0, enable userspace reaping",
-		.def	= "0",
-	},
-#endif
 	{
 		.name = NULL,
 	},