diff options
Diffstat (limited to 'migration/qemu-file.c')
-rw-r--r-- | migration/qemu-file.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/migration/qemu-file.c b/migration/qemu-file.c index 6f4a1299b3..656db4a04c 100644 --- a/migration/qemu-file.c +++ b/migration/qemu-file.c @@ -108,11 +108,13 @@ bool qemu_file_is_writable(QEMUFile *f) * Flushes QEMUFile buffer * * If there is writev_buffer QEMUFileOps it uses it otherwise uses - * put_buffer ops. + * put_buffer ops. This will flush all pending data. If data was + * only partially flushed, it will set an error state. */ void qemu_fflush(QEMUFile *f) { ssize_t ret = 0; + ssize_t expect = 0; if (!qemu_file_is_writable(f)) { return; @@ -120,21 +122,27 @@ void qemu_fflush(QEMUFile *f) if (f->ops->writev_buffer) { if (f->iovcnt > 0) { + expect = iov_size(f->iov, f->iovcnt); ret = f->ops->writev_buffer(f->opaque, f->iov, f->iovcnt, f->pos); } } else { if (f->buf_index > 0) { + expect = f->buf_index; ret = f->ops->put_buffer(f->opaque, f->buf, f->pos, f->buf_index); } } + if (ret >= 0) { f->pos += ret; } + /* We expect the QEMUFile write impl to send the full + * data set we requested, so sanity check that. + */ + if (ret != expect) { + qemu_file_set_error(f, ret < 0 ? ret : -EIO); + } f->buf_index = 0; f->iovcnt = 0; - if (ret < 0) { - qemu_file_set_error(f, ret); - } } void ram_control_before_iterate(QEMUFile *f, uint64_t flags) |