[PATCH] splice fixes
diff --git a/fio-io.c b/fio-io.c
index f5d48fd..7b1c1bd 100644
--- a/fio-io.c
+++ b/fio-io.c
@@ -776,16 +776,25 @@
 {
 	struct spliceio_data *sd = td->io_data;
 	int ret, ret2, buflen;
+	off_t offset;
 	void *p;
 
+	offset = io_u->offset;
 	buflen = io_u->buflen;
 	p = io_u->buf;
 	while (buflen) {
-		off_t off = io_u->offset;
+		int this_len = buflen;
 
-		ret = splice(td->fd, &off, sd->pipe[1], NULL, buflen, 0);
-		if (ret < 0)
+		if (this_len > SPLICE_DEF_SIZE)
+			this_len = SPLICE_DEF_SIZE;
+
+		ret = splice(td->fd, &offset, sd->pipe[1], NULL, this_len, SPLICE_F_MORE);
+		if (ret < 0) {
+			if (errno == ENODATA || errno == EAGAIN)
+				continue;
+
 			return errno;
+		}
 
 		buflen -= ret;
 
@@ -816,6 +825,7 @@
 		}
 	};
 	struct pollfd pfd = { .fd = sd->pipe[1], .events = POLLOUT, };
+	off_t off = io_u->offset;
 	int ret, ret2;
 
 	while (iov[0].iov_len) {
@@ -830,8 +840,6 @@
 		iov[0].iov_base += ret;
 
 		while (ret) {
-			off_t off = io_u->offset;
-
 			ret2 = splice(sd->pipe[0], NULL, td->fd, &off, ret, 0);
 			if (ret2 < 0)
 				return errno;