Merge branch 'sync-fileop' of https://github.com/struschev/fio

* 'sync-fileop' of https://github.com/struschev/fio:
  fio: add sync capability for file operations
diff --git a/engines/falloc.c b/engines/falloc.c
index 290b980..5bd5aa5 100644
--- a/engines/falloc.c
+++ b/engines/falloc.c
@@ -76,14 +76,18 @@
 
 	fio_ro_check(td, io_u);
 
-	if (io_u->ddir == DDIR_READ)
-		flags = FALLOC_FL_KEEP_SIZE;
-	else if (io_u->ddir == DDIR_WRITE)
-		flags = 0;
-	else if (io_u->ddir == DDIR_TRIM)
-		flags = FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE;
+	if (io_u->ddir != DDIR_SYNC) {
+		if (io_u->ddir == DDIR_READ)
+			flags = FALLOC_FL_KEEP_SIZE;
+		else if (io_u->ddir == DDIR_WRITE)
+			flags = 0;
+		else if (io_u->ddir == DDIR_TRIM)
+			flags = FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE;
 
-	ret = fallocate(f->fd, flags, io_u->offset, io_u->xfer_buflen);
+		ret = fallocate(f->fd, flags, io_u->offset, io_u->xfer_buflen);
+	} else {
+		ret = do_io_u_sync(td, io_u);
+	}
 
 	if (ret)
 		io_u->error = errno;
diff --git a/engines/fileoperations.c b/engines/fileoperations.c
index e530335..ce3e7c3 100644
--- a/engines/fileoperations.c
+++ b/engines/fileoperations.c
@@ -264,6 +264,8 @@
 
 static enum fio_q_status queue_io(struct thread_data *td, struct io_u *io_u)
 {
+	if (io_u->ddir == DDIR_SYNC && do_io_u_sync(td, io_u))
+		io_u->error = errno;
 	return FIO_Q_COMPLETED;
 }
 
diff --git a/engines/ftruncate.c b/engines/ftruncate.c
index d1757b7..70211e0 100644
--- a/engines/ftruncate.c
+++ b/engines/ftruncate.c
@@ -15,16 +15,17 @@
 					     struct io_u *io_u)
 {
 	struct fio_file *f = io_u->file;
-	int ret;
+	int ret = 0;
 
 	fio_ro_check(td, io_u);
 
-	if (io_u->ddir != DDIR_WRITE) {
+	if (io_u->ddir == DDIR_WRITE)
+		ret = ftruncate(f->fd, io_u->offset);
+	else if (io_u->ddir == DDIR_SYNC)
+		ret = do_io_u_sync(td, io_u);
+	else
 		io_u->error = EINVAL;
-		return FIO_Q_COMPLETED;
-	}
 
-	ret = ftruncate(f->fd, io_u->offset);
 	if (ret)
 		io_u->error = errno;