Add support for fdatasync()

Adds a new option, fdatasync=. It's identical to the fsync= option,
but uses fdatasync() instead.

Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
diff --git a/io_u.c b/io_u.c
index 276f3b0..41b5cdb 100644
--- a/io_u.c
+++ b/io_u.c
@@ -363,6 +363,22 @@
 {
 	enum fio_ddir ddir;
 
+	/*
+	 * see if it's time to fsync
+	 */
+	if (td->o.fsync_blocks &&
+	   !(td->io_issues[DDIR_WRITE] % td->o.fsync_blocks) &&
+	     td->io_issues[DDIR_WRITE] && should_fsync(td))
+		return DDIR_SYNC;
+
+	/*
+	 * see if it's time to fdatasync
+	 */
+	if (td->o.fdatasync_blocks &&
+	   !(td->io_issues[DDIR_WRITE] % td->o.fdatasync_blocks) &&
+	     td->io_issues[DDIR_WRITE] && should_fsync(td))
+		return DDIR_DATASYNC;
+
 	if (td_rw(td)) {
 		/*
 		 * Check if it's time to seed a new data direction.
@@ -425,7 +441,7 @@
 	dprint(FD_IO, "requeue %p\n", __io_u);
 
 	__io_u->flags |= IO_U_F_FREE;
-	if ((__io_u->flags & IO_U_F_FLIGHT) && (__io_u->ddir != DDIR_SYNC))
+	if ((__io_u->flags & IO_U_F_FLIGHT) && !ddir_sync(__io_u->ddir))
 		td->io_issues[__io_u->ddir]--;
 
 	__io_u->flags &= ~IO_U_F_FLIGHT;
@@ -441,19 +457,15 @@
 	if (td->io_ops->flags & FIO_NOIO)
 		goto out;
 
-	/*
-	 * see if it's time to sync
-	 */
-	if (td->o.fsync_blocks &&
-	   !(td->io_issues[DDIR_WRITE] % td->o.fsync_blocks) &&
-	     td->io_issues[DDIR_WRITE] && should_fsync(td)) {
-		io_u->ddir = DDIR_SYNC;
-		goto out;
-	}
-
 	io_u->ddir = get_rw_ddir(td);
 
 	/*
+	 * fsync() or fdatasync(), we are done
+	 */
+	if (ddir_sync(io_u->ddir))
+		goto out;
+
+	/*
 	 * See if it's time to switch to a new zone
 	 */
 	if (td->zone_bytes >= td->o.zone_size) {
@@ -878,7 +890,7 @@
 	f = io_u->file;
 	assert(fio_file_open(f));
 
-	if (io_u->ddir != DDIR_SYNC) {
+	if (!ddir_sync(io_u->ddir)) {
 		if (!io_u->buflen && !(td->io_ops->flags & FIO_NOIO)) {
 			dprint(FD_IO, "get_io_u: zero buflen on %p\n", io_u);
 			goto err_put;
@@ -942,7 +954,7 @@
 	assert(io_u->flags & IO_U_F_FLIGHT);
 	io_u->flags &= ~IO_U_F_FLIGHT;
 
-	if (io_u->ddir == DDIR_SYNC) {
+	if (ddir_sync(io_u->ddir)) {
 		td->last_was_sync = 1;
 		return;
 	}