[PATCH] Separate io engines into separate loadable objects

Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
diff --git a/init.c b/init.c
index 1ffd6ff..3eaf9b7 100644
--- a/init.c
+++ b/init.c
@@ -124,7 +124,7 @@
 	if (td == &def_thread)
 		return 0;
 
-	if (td->io_engine & FIO_SYNCIO)
+	if (td->io_ops->flags & FIO_SYNCIO)
 		td->iodepth = 1;
 	else {
 		if (!td->iodepth)
@@ -197,10 +197,10 @@
 
 	if (!terse_output) {
 		if (!job_add_num) {
-			if (td->io_engine == FIO_CPUIO)
+			if (td->io_ops->flags & FIO_CPUIO)
 				fprintf(f_out, "%s: ioengine=cpu, cpuload=%u, cpucycle=%u\n", td->name, td->cpuload, td->cpucycle);
 			else
-				fprintf(f_out, "%s: (g=%d): rw=%s, odir=%d, bs=%d-%d, rate=%d, ioengine=%s, iodepth=%d\n", td->name, td->groupid, ddir_str[ddir], td->odirect, td->min_bs, td->max_bs, td->rate, td->io_engine_name, td->iodepth);
+				fprintf(f_out, "%s: (g=%d): rw=%s, odir=%d, bs=%d-%d, rate=%d, ioengine=%s, iodepth=%d\n", td->name, td->groupid, ddir_str[ddir], td->odirect, td->min_bs, td->max_bs, td->rate, td->io_ops->name, td->iodepth);
 		} else if (job_add_num == 1)
 			fprintf(f_out, "...\n");
 	}
@@ -594,36 +594,12 @@
 
 static int str_ioengine_cb(struct thread_data *td, char *str)
 {
-	if (!strncmp(str, "linuxaio", 8) || !strncmp(str, "aio", 3) ||
-	    !strncmp(str, "libaio", 6)) {
-		strcpy(td->io_engine_name, "libaio");
-		td->io_engine = FIO_LIBAIO;
+	if (!str)
+		str = DEF_IO_ENGINE_NAME;
+
+	td->io_ops = load_ioengine(td, str);
+	if (td->io_ops)
 		return 0;
-	} else if (!strncmp(str, "posixaio", 8)) {
-		strcpy(td->io_engine_name, "posixaio");
-		td->io_engine = FIO_POSIXAIO;
-		return 0;
-	} else if (!strncmp(str, "sync", 4)) {
-		strcpy(td->io_engine_name, "sync");
-		td->io_engine = FIO_SYNCIO;
-		return 0;
-	} else if (!strncmp(str, "mmap", 4)) {
-		strcpy(td->io_engine_name, "mmap");
-		td->io_engine = FIO_MMAPIO;
-		return 0;
-	} else if (!strncmp(str, "sgio", 4)) {
-		strcpy(td->io_engine_name, "sgio");
-		td->io_engine = FIO_SGIO;
-		return 0;
-	} else if (!strncmp(str, "splice", 6)) {
-		strcpy(td->io_engine_name, "splice");
-		td->io_engine = FIO_SPLICEIO;
-		return 0;
-	} else if (!strncmp(str, "cpu", 3)) {
-		strcpy(td->io_engine_name, "cpu");
-		td->io_engine = FIO_CPUIO;
-		return 0;
-	}
 
 	log_err("fio: ioengine: { linuxaio, aio, libaio }, posixaio, sync, mmap, sgio, splice, cpu\n");
 	return 1;
@@ -1002,8 +978,6 @@
 	def_thread.bs = DEF_BS;
 	def_thread.min_bs = -1;
 	def_thread.max_bs = -1;
-	def_thread.io_engine = DEF_IO_ENGINE;
-	strcpy(def_thread.io_engine_name, DEF_IO_ENGINE_NAME);
 	def_thread.odirect = DEF_ODIRECT;
 	def_thread.ratecycle = DEF_RATE_CYCLE;
 	def_thread.sequential = DEF_SEQUENTIAL;