preadv is going to be needed when 'fixed-ram'-enabled stream are to be restored. Simply add a wrapper around preadv that's specific to QIOChannelFile.
Signed-off-by: Nikolay Borisov <nbori...@suse.com> --- include/io/channel-file.h | 5 +++++ io/channel-file.c | 26 ++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/include/io/channel-file.h b/include/io/channel-file.h index 0a5d54f5e58e..2187f5affd23 100644 --- a/include/io/channel-file.h +++ b/include/io/channel-file.h @@ -89,6 +89,11 @@ qio_channel_file_new_path(const char *path, mode_t mode, Error **errp); +ssize_t qio_channel_file_preadv(QIOChannel *ioc, + const struct iovec *iov, + size_t niov, + off_t offset, + Error **errp); ssize_t qio_channel_file_pwritev(QIOChannel *ioc, const struct iovec *iov, size_t niov, diff --git a/io/channel-file.c b/io/channel-file.c index d84a6737f2f7..edca64ad63a7 100644 --- a/io/channel-file.c +++ b/io/channel-file.c @@ -141,6 +141,32 @@ static ssize_t qio_channel_file_writev(QIOChannel *ioc, return ret; } +ssize_t qio_channel_file_preadv(QIOChannel *ioc, + const struct iovec *iov, + size_t niov, + off_t offset, + Error **errp) +{ + QIOChannelFile *fioc = QIO_CHANNEL_FILE(ioc); + ssize_t ret; + + retry: + ret = preadv(fioc->fd, iov, niov, offset); + if (ret < 0) { + if (errno == EAGAIN) { + return QIO_CHANNEL_ERR_BLOCK; + } + if (errno == EINTR) { + goto retry; + } + + error_setg_errno(errp, errno, "Unable to read from file"); + return -1; + } + + return ret; +} + ssize_t qio_channel_file_pwritev(QIOChannel *ioc, const struct iovec *iov, size_t niov, -- 2.34.1