On 18.10.22 г. 12:10 ч., Daniel P. Berrangé wrote:
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.

Sure, I assume the same text should be added to the incoming migration patch as well and emphasize that it could be more problematic there?

In any case I'd wait to gather more feedback before sending v3



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

Reply via email to