Skip to content

Commit d7a4a38

Browse files
Fabiano RosasMichael Tokarev
authored andcommitted
migration: Fix file migration with fdset
When the "file:" migration support was added we missed the special case in the qemu_open_old implementation that allows for a particular file name format to be used to refer to a set of file descriptors that have been previously provided to QEMU via the add-fd QMP command. When using this fdset feature, we should not truncate the migration file because being given an fd means that the management layer is in control of the file and will likely already have some data written to it. This is further indicated by the presence of the 'offset' argument, which indicates the start of the region where QEMU is allowed to write. Fix the issue by replacing the O_TRUNC flag on open by an ftruncate call, which will take the offset into consideration. Fixes: 385f510 ("migration: file URI offset") Suggested-by: Daniel P. Berrangé <[email protected]> Reviewed-by: Prasad Pandit <[email protected]> Reviewed-by: Peter Xu <[email protected]> Reviewed-by: Daniel P. Berrangé <[email protected]> Signed-off-by: Fabiano Rosas <[email protected]> (cherry picked from commit 6d32796) Signed-off-by: Michael Tokarev <[email protected]>
1 parent 658fb89 commit d7a4a38

File tree

1 file changed

+9
-2
lines changed

1 file changed

+9
-2
lines changed

migration/file.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,19 @@ void file_start_outgoing_migration(MigrationState *s,
8484

8585
trace_migration_file_outgoing(filename);
8686

87-
fioc = qio_channel_file_new_path(filename, O_CREAT | O_WRONLY | O_TRUNC,
88-
0600, errp);
87+
fioc = qio_channel_file_new_path(filename, O_CREAT | O_WRONLY, 0600, errp);
8988
if (!fioc) {
9089
return;
9190
}
9291

92+
if (ftruncate(fioc->fd, offset)) {
93+
error_setg_errno(errp, errno,
94+
"failed to truncate migration file to offset %" PRIx64,
95+
offset);
96+
object_unref(OBJECT(fioc));
97+
return;
98+
}
99+
93100
outgoing_args.fname = g_strdup(filename);
94101

95102
ioc = QIO_CHANNEL(fioc);

0 commit comments

Comments
 (0)