/*
- * splice io engine
+ * splice engine
+ *
+ * IO engine that transfers data by doing splices to/from pipes and
+ * the files.
*
*/
#include <stdio.h>
#include <sys/poll.h>
#include "../fio.h"
-#include "../os.h"
#ifdef FIO_HAVE_SPLICE
if (errno == ENODATA || errno == EAGAIN)
continue;
- return errno;
+ return -errno;
}
buflen -= ret;
while (ret) {
ret2 = read(sd->pipe[0], p, ret);
if (ret2 < 0)
- return errno;
+ return -errno;
ret -= ret2;
p += ret2;
ret = vmsplice(sd->pipe[1], iov, 1, SPLICE_F_NONBLOCK);
if (ret < 0)
- return errno;
+ return -errno;
iov[0].iov_len -= ret;
iov[0].iov_base += ret;
while (ret) {
ret2 = splice(sd->pipe[0], NULL, f->fd, &off, ret, 0);
if (ret2 < 0)
- return errno;
+ return -errno;
ret -= ret2;
}
}
if (io_u->error)
- td_verror(td, io_u->error);
+ td_verror(td, io_u->error, "xfer");
return FIO_Q_COMPLETED;
}
struct spliceio_data *sd = malloc(sizeof(*sd));
if (pipe(sd->pipe) < 0) {
- td_verror(td, errno);
+ td_verror(td, errno, "pipe");
free(sd);
return 1;
}
.init = fio_spliceio_init,
.queue = fio_spliceio_queue,
.cleanup = fio_spliceio_cleanup,
+ .open_file = generic_open_file,
+ .close_file = generic_close_file,
.flags = FIO_SYNCIO,
};