On Mon, Oct 10, 2022 at 04:33:58PM +0300, Nikolay Borisov wrote: > Implement support for a "file:" uri so that a migration can be initiated > directly to a file from QEMU.
Can we add a reminder here Unlike other migration protocol backends, the 'file' protocol cannot honour non-blocking mode. POSIX file/block storage will always report ready to read/write, regardless of how slow the underlying storage will be at servicing the request. For outgoing migration this limitation is not a serious problem as the migration data transfer always happens in a dedicated thread. It may, however, result in delays in honouring a request to cancel the migration operation. > > Signed-off-by: Nikolay Borisov <[email protected]> > --- > migration/file.c | 23 +++++++++++++++++++++++ > migration/file.h | 9 +++++++++ > migration/meson.build | 1 + > migration/migration.c | 3 +++ > 4 files changed, 36 insertions(+) > create mode 100644 migration/file.c > create mode 100644 migration/file.h > > diff --git a/migration/file.c b/migration/file.c > new file mode 100644 > index 000000000000..02896a7cab99 > --- /dev/null > +++ b/migration/file.c > @@ -0,0 +1,23 @@ > +#include "qemu/osdep.h" > +#include "channel.h" > +#include "io/channel-file.h" > +#include "file.h" > +#include "qemu/error-report.h" > + > + > +void file_start_outgoing_migration(MigrationState *s, const char *fname, > Error **errp) > +{ > + QIOChannelFile *ioc; > + > + ioc = qio_channel_file_new_path(fname, O_CREAT|O_TRUNC|O_WRONLY, 0660, > errp); > + if (!ioc) { > + error_report("Error creating a channel"); > + return; > + } > + > + qio_channel_set_name(QIO_CHANNEL(ioc), "migration-file-outgoing"); > + migration_channel_connect(s, QIO_CHANNEL(ioc), NULL, NULL); > + object_unref(OBJECT(ioc)); > +} > + > + > diff --git a/migration/file.h b/migration/file.h > new file mode 100644 > index 000000000000..d476eb1157f9 > --- /dev/null > +++ b/migration/file.h > @@ -0,0 +1,9 @@ > +#ifndef QEMU_MIGRATION_FILE_H > +#define QEMU_MIGRATION_FILE_H > + > +void file_start_outgoing_migration(MigrationState *s, > + const char *filename, > + Error **errp); > + > +#endif > + > diff --git a/migration/meson.build b/migration/meson.build > index 690487cf1a81..30a8392701c3 100644 > --- a/migration/meson.build > +++ b/migration/meson.build > @@ -17,6 +17,7 @@ softmmu_ss.add(files( > 'colo.c', > 'exec.c', > 'fd.c', > + 'file.c', > 'global_state.c', > 'migration.c', > 'multifd.c', > diff --git a/migration/migration.c b/migration/migration.c > index bb8bbddfe467..8813b78b9a6b 100644 > --- a/migration/migration.c > +++ b/migration/migration.c > @@ -20,6 +20,7 @@ > #include "migration/blocker.h" > #include "exec.h" > #include "fd.h" > +#include "file.h" > #include "socket.h" > #include "sysemu/runstate.h" > #include "sysemu/sysemu.h" > @@ -2414,6 +2415,8 @@ void qmp_migrate(const char *uri, bool has_blk, bool > blk, > exec_start_outgoing_migration(s, p, &local_err); > } else if (strstart(uri, "fd:", &p)) { > fd_start_outgoing_migration(s, p, &local_err); > + } else if (strstart(uri, "file:", &p)) { > + file_start_outgoing_migration(s, p, &local_err); > } else { > if (!(has_resume && resume)) { > yank_unregister_instance(MIGRATION_YANK_INSTANCE); > -- > 2.34.1 > With regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
