@samitouri / QOSamiQemu / commits / 5e76440b56

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)