migration/file: switch file_write_ramblock_iov to pwritev_all
file_write_ramblock_iov() uses single-shot qio_channel_pwritev() and only checks for ret < 0. A short write (0 <= ret < requested) would be treated as success. Switch to qio_channel_pwritev_all() which retries until all bytes are written or an error occurs. Fixes: f427d90b98 ("migration/multifd: Support outgoing mapped-ram stream format") Signed-off-by: Junjie Cao <junjie.cao@intel.com> Reviewed-by: Peter Xu <peterx@redhat.com> Link: https://lore.kernel.org/qemu-devel/20260420201317.30199-3-junjie.cao@intel.com Signed-off-by: Fabiano Rosas <farosas@suse.de>
Junjie Cao committed
Apr 21, 2026 at 04:13 UTC
5e76440b5618477cff973006d59e1d99196af7a2
1 file changed
+4
-4
migration/file.c
+4
-4
@@ -202,7 +202,7 @@ void file_connect_incoming(FileMigrationArgs *file_args, Error **errp)
202
int file_write_ramblock_iov(QIOChannel *ioc, const struct iovec *iov,
203
int niov, MultiFDPages_t *pages, Error **errp)
204
{
205
- ssize_t ret = 0;
205
+ int ret = 0;
206
int i, slice_idx, slice_num;
207
uintptr_t base, next, offset;
208
size_t len;
@@ -241,8 +241,8 @@ int file_write_ramblock_iov(QIOChannel *ioc, const struct iovec *iov,
241
break;
242
}
243
244
- ret = qio_channel_pwritev(ioc, &iov[slice_idx], slice_num,
245
- block->pages_offset + offset, errp);
244
+ ret = qio_channel_pwritev_all(ioc, &iov[slice_idx], slice_num,
245
+ block->pages_offset + offset, errp);
246
if (ret < 0) {
247
break;
248
}
@@ -251,7 +251,7 @@ int file_write_ramblock_iov(QIOChannel *ioc, const struct iovec *iov,
251
slice_num = 0;
252
}
253
254
- return (ret < 0) ? ret : 0;
254
+ return ret;
255
}
256
257
int multifd_file_recv_data(MultiFDRecvParams *p, Error **errp)